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  }