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 }