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