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  }