github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/scenarioassignment/service_test.go (about) 1 package scenarioassignment_test 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 8 "github.com/kyma-incubator/compass/components/director/internal/domain/scenarioassignment" 9 "github.com/kyma-incubator/compass/components/director/internal/domain/scenarioassignment/automock" 10 "github.com/kyma-incubator/compass/components/director/internal/domain/tenant" 11 "github.com/kyma-incubator/compass/components/director/internal/model" 12 "github.com/pkg/errors" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/mock" 15 "github.com/stretchr/testify/require" 16 ) 17 18 const validPageSize = 2 19 20 func TestService_GetByScenarioName(t *testing.T) { 21 t.Run("happy path", func(t *testing.T) { 22 // GIVEN 23 mockRepo := &automock.Repository{} 24 defer mockRepo.AssertExpectations(t) 25 mockRepo.On("GetForScenarioName", fixCtxWithTenant(), mock.Anything, scenarioName).Return(fixModel(), nil).Once() 26 sut := scenarioassignment.NewService(mockRepo, nil) 27 28 // WHEN 29 actual, err := sut.GetForScenarioName(fixCtxWithTenant(), scenarioName) 30 31 // THEN 32 require.NoError(t, err) 33 assert.Equal(t, fixModel(), actual) 34 }) 35 36 t.Run("error on missing tenant in context", func(t *testing.T) { 37 // GIVEN 38 mockRepo := &automock.Repository{} 39 defer mockRepo.AssertExpectations(t) 40 sut := scenarioassignment.NewService(mockRepo, nil) 41 42 // WHEN 43 _, err := sut.GetForScenarioName(context.TODO(), scenarioName) 44 45 // THEN 46 assert.EqualError(t, err, "cannot read tenant from context") 47 }) 48 49 t.Run("returns error on error from repository", func(t *testing.T) { 50 // GIVEN 51 mockRepo := &automock.Repository{} 52 defer mockRepo.AssertExpectations(t) 53 mockRepo.On("GetForScenarioName", fixCtxWithTenant(), mock.Anything, scenarioName).Return(model.AutomaticScenarioAssignment{}, fixError()).Once() 54 sut := scenarioassignment.NewService(mockRepo, nil) 55 56 // WHEN 57 _, err := sut.GetForScenarioName(fixCtxWithTenant(), scenarioName) 58 59 // THEN 60 require.EqualError(t, err, fmt.Sprintf("while getting Assignment: %s", errMsg)) 61 }) 62 } 63 64 func TestService_ListForTargetTenant(t *testing.T) { 65 t.Run("happy path", func(t *testing.T) { 66 // GIVEN 67 assignment := fixModel() 68 result := []*model.AutomaticScenarioAssignment{&assignment} 69 mockRepo := &automock.Repository{} 70 defer mockRepo.AssertExpectations(t) 71 mockRepo.On("ListForTargetTenant", mock.Anything, tenantID, targetTenantID).Return(result, nil).Once() 72 sut := scenarioassignment.NewService(mockRepo, nil) 73 74 // WHEN 75 actual, err := sut.ListForTargetTenant(fixCtxWithTenant(), targetTenantID) 76 77 // THEN 78 require.NoError(t, err) 79 assert.Equal(t, result, actual) 80 }) 81 82 t.Run("returns error on error from repository", func(t *testing.T) { 83 // GIVEN 84 mockRepo := &automock.Repository{} 85 defer mockRepo.AssertExpectations(t) 86 mockRepo.On("ListForTargetTenant", mock.Anything, tenantID, targetTenantID).Return(nil, fixError()).Once() 87 sut := scenarioassignment.NewService(mockRepo, nil) 88 89 // WHEN 90 actual, err := sut.ListForTargetTenant(fixCtxWithTenant(), targetTenantID) 91 92 // THEN 93 require.EqualError(t, err, "while getting the assignments: some error") 94 require.Nil(t, actual) 95 }) 96 97 t.Run("returns error when no tenant in context", func(t *testing.T) { 98 sut := scenarioassignment.NewService(nil, nil) 99 _, err := sut.ListForTargetTenant(context.TODO(), targetTenantID) 100 101 require.EqualError(t, err, "cannot read tenant from context") 102 }) 103 } 104 105 func TestService_List(t *testing.T) { 106 // GIVEN 107 testErr := errors.New("Test error") 108 109 mod1 := fixModelWithScenarioName("foo") 110 mod2 := fixModelWithScenarioName("bar") 111 modItems := []*model.AutomaticScenarioAssignment{ 112 &mod1, &mod2, 113 } 114 115 modelPage := fixModelPageWithItems(modItems) 116 117 after := "test" 118 119 ctx := context.TODO() 120 ctx = tenant.SaveToContext(ctx, tenantID, externalTenantID) 121 122 testCases := []struct { 123 Name string 124 PageSize int 125 RepositoryFn func() *automock.Repository 126 ExpectedResult *model.AutomaticScenarioAssignmentPage 127 ExpectedErrMessage string 128 }{ 129 { 130 Name: "Success", 131 RepositoryFn: func() *automock.Repository { 132 repo := &automock.Repository{} 133 repo.On("List", ctx, tenantID, validPageSize, after).Return(&modelPage, nil).Once() 134 return repo 135 }, 136 PageSize: validPageSize, 137 ExpectedResult: &modelPage, 138 ExpectedErrMessage: "", 139 }, 140 { 141 Name: "Return error when page size is less than 1", 142 RepositoryFn: func() *automock.Repository { 143 repo := &automock.Repository{} 144 return repo 145 }, 146 PageSize: 0, 147 ExpectedResult: &modelPage, 148 ExpectedErrMessage: "page size must be between 1 and 200", 149 }, 150 { 151 Name: "Return error when page size is bigger than 200", 152 RepositoryFn: func() *automock.Repository { 153 repo := &automock.Repository{} 154 return repo 155 }, 156 PageSize: 201, 157 ExpectedResult: &modelPage, 158 ExpectedErrMessage: "page size must be between 1 and 200", 159 }, 160 { 161 Name: "Returns error when Assignments listing failed", 162 RepositoryFn: func() *automock.Repository { 163 repo := &automock.Repository{} 164 repo.On("List", ctx, tenantID, 2, after).Return(nil, testErr).Once() 165 return repo 166 }, 167 PageSize: 2, 168 ExpectedResult: nil, 169 ExpectedErrMessage: testErr.Error(), 170 }, 171 } 172 173 for _, testCase := range testCases { 174 t.Run(testCase.Name, func(t *testing.T) { 175 repo := testCase.RepositoryFn() 176 177 svc := scenarioassignment.NewService(repo, nil) 178 179 // WHEN 180 items, err := svc.List(ctx, testCase.PageSize, after) 181 182 // THEN 183 if testCase.ExpectedErrMessage == "" { 184 require.NoError(t, err) 185 assert.Equal(t, testCase.ExpectedResult, items) 186 } else { 187 require.Error(t, err) 188 assert.Contains(t, err.Error(), testCase.ExpectedErrMessage) 189 } 190 191 repo.AssertExpectations(t) 192 }) 193 } 194 t.Run("Error when tenant not in context", func(t *testing.T) { 195 svc := scenarioassignment.NewService(nil, nil) 196 // WHEN 197 _, err := svc.List(context.TODO(), 5, "") 198 // THEN 199 require.Error(t, err) 200 assert.Contains(t, err.Error(), "cannot read tenant from context") 201 }) 202 }