github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/labeldef/service_test.go (about)

     1  package labeldef_test
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  
     8  	"github.com/kyma-incubator/compass/components/director/internal/domain/labeldef"
     9  	"github.com/kyma-incubator/compass/components/director/internal/domain/labeldef/automock"
    10  	"github.com/kyma-incubator/compass/components/director/internal/model"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/mock"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestServiceCreateWithFormations(t *testing.T) {
    17  	t.Run("success", func(t *testing.T) {
    18  		// GIVEN
    19  		testFormations := []string{"test-formation-one", "test-formation-two"}
    20  		expectedFormations := testFormations
    21  		ctx := context.TODO()
    22  
    23  		mockUID := &automock.UIDService{}
    24  		defer mockUID.AssertExpectations(t)
    25  		mockUID.On("Generate").Return(fixUUID())
    26  
    27  		mockRepository := &automock.Repository{}
    28  		defer mockRepository.AssertExpectations(t)
    29  		mockRepository.On("Create", mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) {
    30  			if schemaArgs, ok := args.Get(1).(model.LabelDefinition); ok {
    31  				formations, err := labeldef.ParseFormationsFromSchema(schemaArgs.Schema)
    32  				require.NoError(t, err)
    33  				require.ElementsMatch(t, formations, expectedFormations)
    34  				return
    35  			}
    36  			t.Fatal("schema should contain desired formations")
    37  		})
    38  
    39  		sut := labeldef.NewService(mockRepository, nil, nil, nil, mockUID)
    40  		// WHEN
    41  		err := sut.CreateWithFormations(ctx, "tenant", testFormations)
    42  		// THEN
    43  		require.NoError(t, err)
    44  	})
    45  
    46  	t.Run("returns error if cannot create Label Definition", func(t *testing.T) {
    47  		// GIVEN
    48  		testFormations := []string{"test-formation-one", "test-formation-two"}
    49  		expectedFormations := testFormations
    50  		ctx := context.TODO()
    51  		testError := errors.New("test error")
    52  
    53  		mockUID := &automock.UIDService{}
    54  		defer mockUID.AssertExpectations(t)
    55  		mockUID.On("Generate").Return(fixUUID())
    56  
    57  		mockRepository := &automock.Repository{}
    58  		defer mockRepository.AssertExpectations(t)
    59  		mockRepository.On("Create", mock.Anything, mock.Anything).Return(testError).Run(func(args mock.Arguments) {
    60  			if schemaArgs, ok := args.Get(1).(model.LabelDefinition); ok {
    61  				formations, err := labeldef.ParseFormationsFromSchema(schemaArgs.Schema)
    62  				require.NoError(t, err)
    63  				require.ElementsMatch(t, formations, expectedFormations)
    64  				return
    65  			}
    66  			t.Fatal("schema should contain desired formations")
    67  		})
    68  
    69  		sut := labeldef.NewService(mockRepository, nil, nil, nil, mockUID)
    70  		// WHEN
    71  		err := sut.CreateWithFormations(ctx, "tenant", testFormations)
    72  		// THEN
    73  		require.Error(t, err)
    74  		assert.Contains(t, err.Error(), testError.Error())
    75  	})
    76  }
    77  
    78  func TestServiceGet(t *testing.T) {
    79  	t.Run("success when key is not scenarios key", func(t *testing.T) {
    80  		// GIVEN
    81  		mockRepository := &automock.Repository{}
    82  		defer mockRepository.AssertExpectations(t)
    83  		ctx := context.TODO()
    84  		given := model.LabelDefinition{
    85  			Key:    "key",
    86  			Tenant: "tenant",
    87  		}
    88  		mockRepository.On("GetByKey", ctx, "tenant", "key").Return(&given, nil)
    89  		sut := labeldef.NewService(mockRepository, nil, nil, nil, nil)
    90  		// WHEN
    91  		actual, err := sut.Get(ctx, "tenant", "key")
    92  		// THEN
    93  		require.NoError(t, err)
    94  		assert.Equal(t, &given, actual)
    95  	})
    96  
    97  	t.Run("success when LD exists", func(t *testing.T) {
    98  		// GIVEN
    99  		testKey := model.ScenariosKey
   100  		ctx := context.TODO()
   101  		given := model.LabelDefinition{
   102  			Key:    testKey,
   103  			Tenant: "tenant",
   104  		}
   105  
   106  		mockRepository := &automock.Repository{}
   107  		defer mockRepository.AssertExpectations(t)
   108  		mockRepository.On("GetByKey", ctx, "tenant", testKey).Return(&given, nil)
   109  
   110  		sut := labeldef.NewService(mockRepository, nil, nil, nil, nil)
   111  		// WHEN
   112  		actual, err := sut.Get(ctx, "tenant", testKey)
   113  		// THEN
   114  		require.NoError(t, err)
   115  		assert.Equal(t, &given, actual)
   116  	})
   117  
   118  	t.Run("on error from repository", func(t *testing.T) {
   119  		// GIVEN
   120  		mockRepository := &automock.Repository{}
   121  		defer mockRepository.AssertExpectations(t)
   122  		mockRepository.On("GetByKey", mock.Anything, mock.Anything, mock.Anything).
   123  			Return(nil, errors.New("some error"))
   124  
   125  		sut := labeldef.NewService(mockRepository, nil, nil, nil, nil)
   126  		// WHEN
   127  		_, err := sut.Get(context.TODO(), "tenant", "key")
   128  		// THEN
   129  		require.EqualError(t, err, "while fetching Label Definition: some error")
   130  	})
   131  }
   132  
   133  func TestServiceList(t *testing.T) {
   134  	t.Run("success", func(t *testing.T) {
   135  		// GIVEN
   136  		mockRepository := &automock.Repository{}
   137  		defer mockRepository.AssertExpectations(t)
   138  		ctx := context.TODO()
   139  		givenDefs := []model.LabelDefinition{
   140  			{
   141  				Tenant: "tenant",
   142  				Key:    "key1",
   143  			},
   144  			{
   145  				Tenant: "tenant",
   146  				Key:    "key2",
   147  			},
   148  		}
   149  		mockRepository.On("List", ctx, "tenant").Return(givenDefs, nil)
   150  
   151  		sut := labeldef.NewService(mockRepository, nil, nil, nil, nil)
   152  		// WHEN
   153  		actual, err := sut.List(ctx, "tenant")
   154  		// THEN
   155  		require.NoError(t, err)
   156  		assert.Equal(t, givenDefs, actual)
   157  	})
   158  
   159  	t.Run("on error from repository", func(t *testing.T) {
   160  		// GIVEN
   161  		mockRepository := &automock.Repository{}
   162  		defer mockRepository.AssertExpectations(t)
   163  		ctx := context.TODO()
   164  		mockRepository.On("List", ctx, "tenant").Return(nil, errors.New("some error"))
   165  		sut := labeldef.NewService(mockRepository, nil, nil, nil, nil)
   166  		// WHEN
   167  		_, err := sut.List(ctx, "tenant")
   168  		// THEN
   169  		require.EqualError(t, err, "while fetching Label Definitions: some error")
   170  	})
   171  }
   172  
   173  func TestGetAvailableScenarios(t *testing.T) {
   174  	t.Run("success", func(t *testing.T) {
   175  		// GIVEN
   176  		mockService := &automock.Repository{}
   177  		defer mockService.AssertExpectations(t)
   178  		var givenSchema interface{} = model.NewScenariosSchema(testScenarios)
   179  		givenDef := model.LabelDefinition{
   180  			Tenant: fixTenant(),
   181  			Key:    model.ScenariosKey,
   182  			Schema: &givenSchema,
   183  		}
   184  		mockService.On("GetByKey", mock.Anything, fixTenant(), model.ScenariosKey).Return(&givenDef, nil)
   185  		sut := labeldef.NewService(mockService, nil, nil, nil, nil)
   186  		// WHEN
   187  		actualScenarios, err := sut.GetAvailableScenarios(context.TODO(), fixTenant())
   188  		// THEN
   189  		require.NoError(t, err)
   190  		assert.Equal(t, testScenarios, actualScenarios)
   191  	})
   192  
   193  	t.Run("returns error from repository", func(t *testing.T) {
   194  		// GIVEN
   195  		mockService := &automock.Repository{}
   196  		defer mockService.AssertExpectations(t)
   197  		mockService.On("GetByKey", mock.Anything, fixTenant(), model.ScenariosKey).Return(nil, fixError())
   198  		sut := labeldef.NewService(mockService, nil, nil, nil, nil)
   199  		// WHEN
   200  		_, err := sut.GetAvailableScenarios(context.TODO(), fixTenant())
   201  		// THEN
   202  		require.EqualError(t, err, "while getting `scenarios` label definition: some error")
   203  	})
   204  
   205  	t.Run("returns error when missing schema in label def", func(t *testing.T) {
   206  		// GIVEN
   207  		mockService := &automock.Repository{}
   208  		defer mockService.AssertExpectations(t)
   209  		mockService.On("GetByKey", mock.Anything, fixTenant(), model.ScenariosKey).Return(&model.LabelDefinition{}, nil)
   210  		sut := labeldef.NewService(mockService, nil, nil, nil, nil)
   211  		// WHEN
   212  		_, err := sut.GetAvailableScenarios(context.TODO(), fixTenant())
   213  		// THEN
   214  		require.EqualError(t, err, "missing schema for `scenarios` label definition")
   215  	})
   216  }
   217  
   218  func fixUUID() string {
   219  	return "003a0855-4eb0-486d-8fc6-3ab2f2312ca0"
   220  }