github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/api/converter_test.go (about) 1 package api_test 2 3 import ( 4 "testing" 5 6 "github.com/kyma-incubator/compass/components/director/internal/domain/version" 7 "github.com/pkg/errors" 8 "github.com/stretchr/testify/require" 9 10 "github.com/kyma-incubator/compass/components/director/internal/model" 11 12 "github.com/kyma-incubator/compass/components/director/internal/domain/api" 13 "github.com/kyma-incubator/compass/components/director/internal/domain/api/automock" 14 15 "github.com/kyma-incubator/compass/components/director/pkg/graphql" 16 "github.com/stretchr/testify/assert" 17 ) 18 19 func TestConverter_ToGraphQL(t *testing.T) { 20 // GIVEN 21 placeholder := "test" 22 modelAPIDefinition, modelSpec, modelBundleReference := fixFullAPIDefinitionModelWithAppID(placeholder) 23 gqlAPIDefinition := fixFullGQLAPIDefinition(placeholder) 24 emptyModelAPIDefinition := &model.APIDefinition{BaseEntity: &model.BaseEntity{}} 25 emptyGraphQLAPIDefinition := &graphql.APIDefinition{BaseEntity: &graphql.BaseEntity{}} 26 27 expectedErr := errors.New("error") 28 29 testCases := []struct { 30 Name string 31 Input *model.APIDefinition 32 SpecInput *model.Spec 33 BundleReferenceInput *model.BundleReference 34 Expected *graphql.APIDefinition 35 VersionConverter func() *automock.VersionConverter 36 SpecConverter func() *automock.SpecConverter 37 ExpectedErr error 38 }{ 39 { 40 Name: "All properties given", 41 Input: &modelAPIDefinition, 42 SpecInput: &modelSpec, 43 BundleReferenceInput: &modelBundleReference, 44 Expected: gqlAPIDefinition, 45 VersionConverter: func() *automock.VersionConverter { 46 conv := &automock.VersionConverter{} 47 conv.On("ToGraphQL", modelAPIDefinition.Version).Return(gqlAPIDefinition.Version).Once() 48 return conv 49 }, 50 SpecConverter: func() *automock.SpecConverter { 51 conv := &automock.SpecConverter{} 52 conv.On("ToGraphQLAPISpec", &modelSpec).Return(gqlAPIDefinition.Spec, nil).Once() 53 return conv 54 }, 55 }, 56 { 57 Name: "Error while converting spec", 58 Input: &modelAPIDefinition, 59 SpecInput: &modelSpec, 60 BundleReferenceInput: &modelBundleReference, 61 Expected: nil, 62 VersionConverter: func() *automock.VersionConverter { 63 return &automock.VersionConverter{} 64 }, 65 SpecConverter: func() *automock.SpecConverter { 66 conv := &automock.SpecConverter{} 67 conv.On("ToGraphQLAPISpec", &modelSpec).Return(nil, expectedErr).Once() 68 return conv 69 }, 70 ExpectedErr: expectedErr, 71 }, 72 { 73 Name: "Empty", 74 Input: emptyModelAPIDefinition, 75 SpecInput: &model.Spec{}, 76 BundleReferenceInput: &model.BundleReference{}, 77 Expected: emptyGraphQLAPIDefinition, 78 VersionConverter: func() *automock.VersionConverter { 79 conv := &automock.VersionConverter{} 80 conv.On("ToGraphQL", emptyModelAPIDefinition.Version).Return(nil).Once() 81 return conv 82 }, 83 SpecConverter: func() *automock.SpecConverter { 84 conv := &automock.SpecConverter{} 85 conv.On("ToGraphQLAPISpec", &model.Spec{}).Return(nil, nil).Once() 86 return conv 87 }, 88 }, 89 { 90 Name: "Nil", 91 VersionConverter: func() *automock.VersionConverter { 92 return &automock.VersionConverter{} 93 }, 94 SpecConverter: func() *automock.SpecConverter { 95 return &automock.SpecConverter{} 96 }, 97 }, 98 } 99 100 for _, testCase := range testCases { 101 t.Run(testCase.Name, func(t *testing.T) { 102 //give 103 versionConverter := testCase.VersionConverter() 104 specConverter := testCase.SpecConverter() 105 106 // WHEN 107 converter := api.NewConverter(versionConverter, specConverter) 108 res, err := converter.ToGraphQL(testCase.Input, testCase.SpecInput, testCase.BundleReferenceInput) 109 // then 110 if testCase.ExpectedErr != nil { 111 assert.Error(t, err) 112 assert.EqualError(t, err, testCase.ExpectedErr.Error()) 113 } else { 114 assert.NoError(t, err) 115 } 116 117 // then 118 assert.EqualValues(t, testCase.Expected, res) 119 versionConverter.AssertExpectations(t) 120 specConverter.AssertExpectations(t) 121 }) 122 } 123 } 124 125 func TestConverter_MultipleToGraphQL(t *testing.T) { 126 // GIVEN 127 api1, spec1, bundleRef1 := fixFullAPIDefinitionModelWithAppID("test1") 128 api2, spec2, bundleRef2 := fixFullAPIDefinitionModelWithAppID("test2") 129 130 inputAPIs := []*model.APIDefinition{ 131 &api1, &api2, {BaseEntity: &model.BaseEntity{}}, nil, 132 } 133 134 inputSpecs := []*model.Spec{ 135 &spec1, &spec2, {}, nil, 136 } 137 138 inputBundleRefs := []*model.BundleReference{ 139 &bundleRef1, &bundleRef2, {}, nil, 140 } 141 142 expected := []*graphql.APIDefinition{ 143 fixFullGQLAPIDefinition("test1"), 144 fixFullGQLAPIDefinition("test2"), 145 {BaseEntity: &graphql.BaseEntity{}}, 146 } 147 148 versionConverter := &automock.VersionConverter{} 149 specConverter := &automock.SpecConverter{} 150 151 for i, api := range inputAPIs { 152 if api == nil { 153 continue 154 } 155 versionConverter.On("ToGraphQL", api.Version).Return(expected[i].Version).Once() 156 specConverter.On("ToGraphQLAPISpec", inputSpecs[i]).Return(expected[i].Spec, nil).Once() 157 } 158 159 // WHEN 160 converter := api.NewConverter(versionConverter, specConverter) 161 res, err := converter.MultipleToGraphQL(inputAPIs, inputSpecs, inputBundleRefs) 162 assert.NoError(t, err) 163 164 // then 165 assert.Equal(t, expected, res) 166 specConverter.AssertExpectations(t) 167 } 168 169 func TestConverter_InputFromGraphQL(t *testing.T) { 170 // GIVEN 171 gqlAPIDefinitionInput := fixGQLAPIDefinitionInput("foo", "Lorem ipsum", "group") 172 modelAPIDefinitionInput, modelSpec := fixModelAPIDefinitionInput("foo", "Lorem ipsum", "group") 173 emptyGQLAPIDefinition := &graphql.APIDefinitionInput{} 174 175 expectedErr := errors.New("error") 176 177 testCases := []struct { 178 Name string 179 Input *graphql.APIDefinitionInput 180 Expected *model.APIDefinitionInput 181 ExpectedSpec *model.SpecInput 182 VersionConverter func() *automock.VersionConverter 183 SpecConverter func() *automock.SpecConverter 184 ExpectedErr error 185 }{ 186 { 187 Name: "All properties given", 188 Input: gqlAPIDefinitionInput, 189 Expected: modelAPIDefinitionInput, 190 ExpectedSpec: modelSpec, 191 VersionConverter: func() *automock.VersionConverter { 192 conv := &automock.VersionConverter{} 193 conv.On("InputFromGraphQL", gqlAPIDefinitionInput.Version).Return(modelAPIDefinitionInput.VersionInput).Once() 194 return conv 195 }, 196 SpecConverter: func() *automock.SpecConverter { 197 conv := &automock.SpecConverter{} 198 conv.On("InputFromGraphQLAPISpec", gqlAPIDefinitionInput.Spec).Return(modelSpec, nil).Once() 199 return conv 200 }, 201 }, 202 { 203 Name: "Error while converting spec", 204 Input: gqlAPIDefinitionInput, 205 VersionConverter: func() *automock.VersionConverter { 206 return &automock.VersionConverter{} 207 }, 208 SpecConverter: func() *automock.SpecConverter { 209 conv := &automock.SpecConverter{} 210 conv.On("InputFromGraphQLAPISpec", gqlAPIDefinitionInput.Spec).Return(nil, expectedErr).Once() 211 return conv 212 }, 213 ExpectedErr: expectedErr, 214 }, 215 { 216 Name: "Empty", 217 Input: &graphql.APIDefinitionInput{}, 218 Expected: &model.APIDefinitionInput{}, 219 ExpectedSpec: &model.SpecInput{}, 220 VersionConverter: func() *automock.VersionConverter { 221 conv := &automock.VersionConverter{} 222 conv.On("InputFromGraphQL", emptyGQLAPIDefinition.Version).Return(nil).Once() 223 return conv 224 }, 225 SpecConverter: func() *automock.SpecConverter { 226 conv := &automock.SpecConverter{} 227 conv.On("InputFromGraphQLAPISpec", emptyGQLAPIDefinition.Spec).Return(&model.SpecInput{}, nil).Once() 228 return conv 229 }, 230 }, 231 { 232 Name: "Nil", 233 VersionConverter: func() *automock.VersionConverter { 234 return &automock.VersionConverter{} 235 }, 236 SpecConverter: func() *automock.SpecConverter { 237 return &automock.SpecConverter{} 238 }, 239 }, 240 } 241 242 for _, testCase := range testCases { 243 t.Run(testCase.Name, func(t *testing.T) { 244 //give 245 versionConverter := testCase.VersionConverter() 246 specConverter := testCase.SpecConverter() 247 248 // WHEN 249 converter := api.NewConverter(versionConverter, specConverter) 250 res, spec, err := converter.InputFromGraphQL(testCase.Input) 251 // then 252 if testCase.ExpectedErr != nil { 253 assert.Error(t, err) 254 assert.EqualError(t, err, testCase.ExpectedErr.Error()) 255 } else { 256 assert.NoError(t, err) 257 } 258 259 // then 260 assert.Equal(t, testCase.Expected, res) 261 assert.Equal(t, testCase.ExpectedSpec, spec) 262 versionConverter.AssertExpectations(t) 263 specConverter.AssertExpectations(t) 264 }) 265 } 266 } 267 268 func TestConverter_MultipleInputFromGraphQL(t *testing.T) { 269 // GIVEN 270 gqlAPI1 := fixGQLAPIDefinitionInput("foo", "lorem", "group") 271 gqlAPI2 := fixGQLAPIDefinitionInput("bar", "ipsum", "group2") 272 273 modelAPI1, modelSpec1 := fixModelAPIDefinitionInput("foo", "lorem", "group") 274 modelAPI2, modelSpec2 := fixModelAPIDefinitionInput("bar", "ipsum", "group2") 275 276 gqlAPIDefinitionInputs := []*graphql.APIDefinitionInput{gqlAPI1, gqlAPI2} 277 modelAPIDefinitionInputs := []*model.APIDefinitionInput{modelAPI1, modelAPI2} 278 modelSpecInputs := []*model.SpecInput{modelSpec1, modelSpec2} 279 testCases := []struct { 280 Name string 281 Input []*graphql.APIDefinitionInput 282 Expected []*model.APIDefinitionInput 283 ExpectedSpecs []*model.SpecInput 284 VersionConverter func() *automock.VersionConverter 285 SpecConverter func() *automock.SpecConverter 286 }{ 287 { 288 Name: "All properties given", 289 Input: gqlAPIDefinitionInputs, 290 Expected: modelAPIDefinitionInputs, 291 ExpectedSpecs: modelSpecInputs, 292 VersionConverter: func() *automock.VersionConverter { 293 conv := &automock.VersionConverter{} 294 for i, apiDef := range gqlAPIDefinitionInputs { 295 conv.On("InputFromGraphQL", apiDef.Version).Return(modelAPIDefinitionInputs[i].VersionInput).Once() 296 } 297 return conv 298 }, 299 SpecConverter: func() *automock.SpecConverter { 300 conv := &automock.SpecConverter{} 301 for i, apiDef := range gqlAPIDefinitionInputs { 302 conv.On("InputFromGraphQLAPISpec", apiDef.Spec).Return(modelSpecInputs[i], nil).Once() 303 } 304 return conv 305 }, 306 }, 307 { 308 Name: "Empty", 309 Input: []*graphql.APIDefinitionInput{}, 310 Expected: []*model.APIDefinitionInput{}, 311 ExpectedSpecs: []*model.SpecInput{}, 312 VersionConverter: func() *automock.VersionConverter { 313 return &automock.VersionConverter{} 314 }, 315 SpecConverter: func() *automock.SpecConverter { 316 return &automock.SpecConverter{} 317 }, 318 }, 319 { 320 Name: "Nil", 321 Expected: []*model.APIDefinitionInput{}, 322 ExpectedSpecs: []*model.SpecInput{}, 323 VersionConverter: func() *automock.VersionConverter { 324 return &automock.VersionConverter{} 325 }, 326 SpecConverter: func() *automock.SpecConverter { 327 return &automock.SpecConverter{} 328 }, 329 }, 330 } 331 332 for _, testCase := range testCases { 333 t.Run(testCase.Name, func(t *testing.T) { 334 // GIVEN 335 versionConverter := testCase.VersionConverter() 336 specCovnerter := testCase.SpecConverter() 337 338 // WHEN 339 converter := api.NewConverter(versionConverter, specCovnerter) 340 res, specs, err := converter.MultipleInputFromGraphQL(testCase.Input) 341 342 // then 343 assert.NoError(t, err) 344 assert.Equal(t, testCase.Expected, res) 345 assert.Equal(t, testCase.ExpectedSpecs, specs) 346 versionConverter.AssertExpectations(t) 347 }) 348 } 349 } 350 351 func TestEntityConverter_ToEntity(t *testing.T) { 352 t.Run("success all nullable properties filled with Application ID", func(t *testing.T) { 353 // GIVEN 354 apiModel, _, _ := fixFullAPIDefinitionModelWithAppID("foo") 355 356 versionConv := version.NewConverter() 357 conv := api.NewConverter(versionConv, nil) 358 // WHEN 359 entity := conv.ToEntity(&apiModel) 360 // THEN 361 assert.Equal(t, fixFullEntityAPIDefinitionWithAppID(apiDefID, "foo"), *entity) 362 }) 363 364 t.Run("success all nullable properties filled with Application Template Version ID", func(t *testing.T) { 365 // GIVEN 366 apiModel, _, _ := fixFullAPIDefinitionModelWithAppTemplateVersionID("foo") 367 368 versionConv := version.NewConverter() 369 conv := api.NewConverter(versionConv, nil) 370 // WHEN 371 entity := conv.ToEntity(&apiModel) 372 // THEN 373 assert.Equal(t, fixFullEntityAPIDefinitionWithAppTemplateVersionID(apiDefID, "foo"), *entity) 374 }) 375 376 t.Run("success all nullable properties empty", func(t *testing.T) { 377 // GIVEN 378 apiModel := fixAPIDefinitionModel("id", "name", "target_url") 379 require.NotNil(t, apiModel) 380 versionConv := version.NewConverter() 381 conv := api.NewConverter(versionConv, nil) 382 // WHEN 383 entity := conv.ToEntity(apiModel) 384 // THEN 385 assert.Equal(t, fixEntityAPIDefinition("id", "name", "target_url"), entity) 386 }) 387 } 388 389 func TestEntityConverter_FromEntity(t *testing.T) { 390 t.Run("success all nullable properties filled", func(t *testing.T) { 391 // GIVEN 392 entity := fixFullEntityAPIDefinitionWithAppID(apiDefID, "placeholder") 393 versionConv := version.NewConverter() 394 conv := api.NewConverter(versionConv, nil) 395 // WHEN 396 apiModel := conv.FromEntity(&entity) 397 // THEN 398 expectedModel, _, _ := fixFullAPIDefinitionModelWithAppID("placeholder") 399 assert.Equal(t, &expectedModel, apiModel) 400 }) 401 t.Run("success all nullable properties empty", func(t *testing.T) { 402 // GIVEN 403 entity := fixEntityAPIDefinition("id", "name", "target_url") 404 versionConv := version.NewConverter() 405 conv := api.NewConverter(versionConv, nil) 406 // WHEN 407 apiModel := conv.FromEntity(entity) 408 // THEN 409 expectedModel := fixAPIDefinitionModel("id", "name", "target_url") 410 require.NotNil(t, expectedModel) 411 assert.Equal(t, expectedModel, apiModel) 412 }) 413 }