github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/scenarioassignment/repository_test.go (about) 1 package scenarioassignment_test 2 3 import ( 4 "context" 5 "fmt" 6 "regexp" 7 "testing" 8 9 "github.com/pkg/errors" 10 11 "github.com/kyma-incubator/compass/components/director/internal/model" 12 13 "github.com/DATA-DOG/go-sqlmock" 14 "github.com/kyma-incubator/compass/components/director/internal/domain/scenarioassignment" 15 "github.com/kyma-incubator/compass/components/director/internal/domain/scenarioassignment/automock" 16 "github.com/kyma-incubator/compass/components/director/internal/repo/testdb" 17 "github.com/kyma-incubator/compass/components/director/pkg/persistence" 18 "github.com/stretchr/testify/assert" 19 "github.com/stretchr/testify/require" 20 ) 21 22 func TestRepository_Create(t *testing.T) { 23 t.Run("Success", func(t *testing.T) { 24 // GIVEN 25 26 mockConverter := &automock.EntityConverter{} 27 mockConverter.On("ToEntity", fixModel()).Return(fixEntity()).Once() 28 defer mockConverter.AssertExpectations(t) 29 30 db, dbMock := testdb.MockDatabase(t) 31 defer dbMock.AssertExpectations(t) 32 33 dbMock.ExpectExec(regexp.QuoteMeta(`INSERT INTO public.automatic_scenario_assignments ( scenario, tenant_id, target_tenant_id ) VALUES ( ?, ?, ? )`)). 34 WithArgs(scenarioName, tenantID, targetTenantID). 35 WillReturnResult(sqlmock.NewResult(-1, 1)) 36 37 ctx := persistence.SaveToContext(context.TODO(), db) 38 repo := scenarioassignment.NewRepository(mockConverter) 39 40 // WHEN 41 err := repo.Create(ctx, fixModel()) 42 43 // THEN 44 assert.NoError(t, err) 45 }) 46 47 t.Run("DB error", func(t *testing.T) { 48 // GIVEN 49 50 mockConverter := &automock.EntityConverter{} 51 mockConverter.On("ToEntity", fixModel()).Return(fixEntity()).Once() 52 defer mockConverter.AssertExpectations(t) 53 54 db, dbMock := testdb.MockDatabase(t) 55 defer dbMock.AssertExpectations(t) 56 57 dbMock.ExpectExec("INSERT INTO .*").WillReturnError(fixError()) 58 59 ctx := persistence.SaveToContext(context.TODO(), db) 60 repo := scenarioassignment.NewRepository(mockConverter) 61 62 // WHEN 63 err := repo.Create(ctx, fixModel()) 64 65 // THEN 66 require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 67 }) 68 } 69 70 func TestRepository_GetByScenarioName(t *testing.T) { 71 ent := scenarioassignment.Entity{ 72 Scenario: scenarioName, 73 TenantID: tenantID, 74 TargetTenantID: targetTenantID, 75 } 76 77 selectQuery := `SELECT scenario, tenant_id, target_tenant_id FROM public.automatic_scenario_assignments WHERE tenant_id = \$1 AND scenario = \$2` 78 79 t.Run("Success", func(t *testing.T) { 80 db, dbMock := testdb.MockDatabase(t) 81 defer dbMock.AssertExpectations(t) 82 rows := sqlmock.NewRows(fixAutomaticScenarioAssignmentColumns()). 83 AddRow(fixAutomaticScenarioAssignmentRow(scenarioName, tenantID, targetTenantID)...) 84 85 dbMock.ExpectQuery(selectQuery). 86 WithArgs(tenantID, scenarioName). 87 WillReturnRows(rows) 88 89 ctx := persistence.SaveToContext(context.TODO(), db) 90 convMock := &automock.EntityConverter{} 91 convMock.On("FromEntity", ent).Return(fixModel()).Once() 92 defer convMock.AssertExpectations(t) 93 repo := scenarioassignment.NewRepository(convMock) 94 // WHEN 95 _, err := repo.GetForScenarioName(ctx, tenantID, scenarioName) 96 // THEN 97 require.NoError(t, err) 98 }) 99 100 t.Run("DB error", func(t *testing.T) { 101 // GIVEN 102 db, dbMock := testdb.MockDatabase(t) 103 defer dbMock.AssertExpectations(t) 104 105 dbMock.ExpectQuery(selectQuery). 106 WithArgs(tenantID, scenarioName). 107 WillReturnError(fixError()) 108 109 ctx := persistence.SaveToContext(context.TODO(), db) 110 repo := scenarioassignment.NewRepository(nil) 111 112 // WHEN 113 _, err := repo.GetForScenarioName(ctx, tenantID, scenarioName) 114 115 // THEN 116 require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 117 }) 118 } 119 120 func TestRepository_ListAll(t *testing.T) { 121 t.Run("Success", func(t *testing.T) { 122 // GIVEN 123 scenarioEntities := []scenarioassignment.Entity{fixEntityWithScenarioName(scenarioName), 124 fixEntityWithScenarioName("scenario-B")} 125 scenarioModels := []model.AutomaticScenarioAssignment{fixModelWithScenarioName(scenarioName), 126 fixModelWithScenarioName("scenario-B")} 127 128 mockConverter := &automock.EntityConverter{} 129 mockConverter.On("FromEntity", scenarioEntities[0]).Return(scenarioModels[0]).Once() 130 mockConverter.On("FromEntity", scenarioEntities[1]).Return(scenarioModels[1]).Once() 131 defer mockConverter.AssertExpectations(t) 132 133 db, dbMock := testdb.MockDatabase(t) 134 defer dbMock.AssertExpectations(t) 135 rowsToReturn := fixSQLRows([]sqlRow{ 136 {scenario: scenarioName, tenantID: tenantID, targetTenantID: targetTenantID}, 137 {scenario: "scenario-B", tenantID: tenantID, targetTenantID: targetTenantID}, 138 }) 139 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT scenario, tenant_id, target_tenant_id FROM public.automatic_scenario_assignments WHERE tenant_id = $1`)). 140 WithArgs(tenantID). 141 WillReturnRows(rowsToReturn) 142 143 ctx := persistence.SaveToContext(context.TODO(), db) 144 repo := scenarioassignment.NewRepository(mockConverter) 145 146 // WHEN 147 result, err := repo.ListAll(ctx, tenantID) 148 149 // THEN 150 assert.NoError(t, err) 151 assert.Equal(t, scenarioModels[0], *result[0]) 152 assert.Equal(t, scenarioModels[1], *result[1]) 153 }) 154 155 t.Run("DB error", func(t *testing.T) { 156 // GIVEN 157 158 db, dbMock := testdb.MockDatabase(t) 159 defer dbMock.AssertExpectations(t) 160 161 dbMock.ExpectQuery("SELECT .*").WillReturnError(fixError()) 162 163 ctx := persistence.SaveToContext(context.TODO(), db) 164 repo := scenarioassignment.NewRepository(nil) 165 166 // WHEN 167 result, err := repo.ListAll(ctx, tenantID) 168 169 // THEN 170 require.EqualError(t, err, "while getting automatic scenario assignments from db: Internal Server Error: Unexpected error while executing SQL query") 171 assert.Nil(t, result) 172 }) 173 } 174 175 func TestRepository_ListForTargetTenant(t *testing.T) { 176 t.Run("Success", func(t *testing.T) { 177 // GIVEN 178 scenarioEntities := []scenarioassignment.Entity{fixEntityWithScenarioName(scenarioName), 179 fixEntityWithScenarioName("scenario-B")} 180 scenarioModels := []model.AutomaticScenarioAssignment{fixModelWithScenarioName(scenarioName), 181 fixModelWithScenarioName("scenario-B")} 182 183 mockConverter := &automock.EntityConverter{} 184 mockConverter.On("FromEntity", scenarioEntities[0]).Return(scenarioModels[0]).Once() 185 mockConverter.On("FromEntity", scenarioEntities[1]).Return(scenarioModels[1]).Once() 186 defer mockConverter.AssertExpectations(t) 187 188 db, dbMock := testdb.MockDatabase(t) 189 defer dbMock.AssertExpectations(t) 190 rowsToReturn := fixSQLRows([]sqlRow{ 191 {scenario: scenarioName, tenantID: tenantID, targetTenantID: targetTenantID}, 192 {scenario: "scenario-B", tenantID: tenantID, targetTenantID: targetTenantID}, 193 }) 194 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT scenario, tenant_id, target_tenant_id FROM public.automatic_scenario_assignments WHERE tenant_id = $1 AND target_tenant_id = $2`)). 195 WithArgs(tenantID, targetTenantID). 196 WillReturnRows(rowsToReturn) 197 198 ctx := persistence.SaveToContext(context.TODO(), db) 199 repo := scenarioassignment.NewRepository(mockConverter) 200 201 // WHEN 202 result, err := repo.ListForTargetTenant(ctx, tenantID, targetTenantID) 203 204 // THEN 205 assert.NoError(t, err) 206 assert.Equal(t, scenarioModels[0], *result[0]) 207 assert.Equal(t, scenarioModels[1], *result[1]) 208 }) 209 210 t.Run("DB error", func(t *testing.T) { 211 // GIVEN 212 213 db, dbMock := testdb.MockDatabase(t) 214 defer dbMock.AssertExpectations(t) 215 216 dbMock.ExpectQuery("SELECT .*").WillReturnError(fixError()) 217 218 ctx := persistence.SaveToContext(context.TODO(), db) 219 repo := scenarioassignment.NewRepository(nil) 220 221 // WHEN 222 result, err := repo.ListForTargetTenant(ctx, tenantID, targetTenantID) 223 224 // THEN 225 require.EqualError(t, err, "while getting automatic scenario assignments from db: Internal Server Error: Unexpected error while executing SQL query") 226 assert.Nil(t, result) 227 }) 228 } 229 230 func TestRepository_List(t *testing.T) { 231 // GIVEN 232 ExpectedLimit := 3 233 ExpectedOffset := 0 234 235 inputPageSize := 3 236 inputCursor := "" 237 totalCount := 2 238 239 scenarioName1 := "foo" 240 scenarioName2 := "bar" 241 242 ent1 := fixEntityWithScenarioName(scenarioName1) 243 ent2 := fixEntityWithScenarioName(scenarioName2) 244 245 mod1 := fixModelWithScenarioName(scenarioName1) 246 mod2 := fixModelWithScenarioName(scenarioName2) 247 248 selectQuery := fmt.Sprintf(`^SELECT (.+) FROM public.automatic_scenario_assignments 249 WHERE tenant_id = \$1 250 ORDER BY scenario LIMIT %d OFFSET %d`, ExpectedLimit, ExpectedOffset) 251 252 rawCountQuery := `SELECT COUNT(*) FROM public.automatic_scenario_assignments WHERE tenant_id = $1` 253 countQuery := regexp.QuoteMeta(rawCountQuery) 254 255 t.Run("Success", func(t *testing.T) { 256 sqlxDB, sqlMock := testdb.MockDatabase(t) 257 rows := sqlmock.NewRows(fixAutomaticScenarioAssignmentColumns()). 258 AddRow(fixAutomaticScenarioAssignmentRow(scenarioName1, tenantID, targetTenantID)...). 259 AddRow(fixAutomaticScenarioAssignmentRow(scenarioName2, tenantID, targetTenantID)...) 260 261 sqlMock.ExpectQuery(selectQuery). 262 WithArgs(tenantID). 263 WillReturnRows(rows) 264 265 sqlMock.ExpectQuery(countQuery). 266 WithArgs(tenantID). 267 WillReturnRows(testdb.RowCount(2)) 268 269 ctx := persistence.SaveToContext(context.TODO(), sqlxDB) 270 convMock := &automock.EntityConverter{} 271 convMock.On("FromEntity", ent1).Return(mod1) 272 convMock.On("FromEntity", ent2).Return(mod2) 273 repo := scenarioassignment.NewRepository(convMock) 274 // WHEN 275 modelAssignment, err := repo.List(ctx, tenantID, inputPageSize, inputCursor) 276 // THEN 277 require.NoError(t, err) 278 require.Len(t, modelAssignment.Data, 2) 279 assert.Equal(t, scenarioName1, modelAssignment.Data[0].ScenarioName) 280 assert.Equal(t, scenarioName2, modelAssignment.Data[1].ScenarioName) 281 assert.Equal(t, "", modelAssignment.PageInfo.StartCursor) 282 assert.Equal(t, totalCount, modelAssignment.TotalCount) 283 284 convMock.AssertExpectations(t) 285 sqlMock.AssertExpectations(t) 286 }) 287 288 t.Run("DB Error", func(t *testing.T) { 289 // GIVEN 290 repo := scenarioassignment.NewRepository(nil) 291 sqlxDB, sqlMock := testdb.MockDatabase(t) 292 testError := errors.New("test error") 293 294 sqlMock.ExpectQuery(selectQuery). 295 WithArgs(tenantID). 296 WillReturnError(testError) 297 ctx := persistence.SaveToContext(context.TODO(), sqlxDB) 298 299 // WHEN 300 modelAssignment, err := repo.List(ctx, tenantID, inputPageSize, inputCursor) 301 302 // THEN 303 sqlMock.AssertExpectations(t) 304 305 assert.Nil(t, modelAssignment) 306 require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 307 }) 308 } 309 310 func TestRepository_DeleteForTargetTenant(t *testing.T) { 311 deleteQuery := regexp.QuoteMeta(`DELETE FROM public.automatic_scenario_assignments WHERE tenant_id = $1 AND target_tenant_id = $2`) 312 313 t.Run("Success", func(t *testing.T) { 314 // GIVEN 315 db, dbMock := testdb.MockDatabase(t) 316 defer dbMock.AssertExpectations(t) 317 318 dbMock.ExpectExec(deleteQuery). 319 WithArgs(tenantID, targetTenantID). 320 WillReturnResult(sqlmock.NewResult(-1, 1)) 321 322 ctx := persistence.SaveToContext(context.TODO(), db) 323 repo := scenarioassignment.NewRepository(nil) 324 325 // WHEN 326 err := repo.DeleteForTargetTenant(ctx, tenantID, targetTenantID) 327 328 // THEN 329 require.NoError(t, err) 330 }) 331 332 t.Run("DB error", func(t *testing.T) { 333 // GIVEN 334 db, dbMock := testdb.MockDatabase(t) 335 defer dbMock.AssertExpectations(t) 336 337 dbMock.ExpectExec(deleteQuery). 338 WithArgs(tenantID, targetTenantID). 339 WillReturnError(fixError()) 340 341 ctx := persistence.SaveToContext(context.TODO(), db) 342 repo := scenarioassignment.NewRepository(nil) 343 344 // WHEN 345 err := repo.DeleteForTargetTenant(ctx, tenantID, targetTenantID) 346 347 // THEN 348 require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 349 }) 350 } 351 352 func TestRepository_DeleteForScenarioName(t *testing.T) { 353 t.Run("Success", func(t *testing.T) { 354 // GIVEN 355 db, dbMock := testdb.MockDatabase(t) 356 defer dbMock.AssertExpectations(t) 357 358 dbMock.ExpectExec(`^DELETE FROM public.automatic_scenario_assignments WHERE tenant_id = \$1 AND scenario = \$2$`). 359 WithArgs(tenantID, scenarioName). 360 WillReturnResult(sqlmock.NewResult(-1, 1)) 361 362 ctx := persistence.SaveToContext(context.TODO(), db) 363 repo := scenarioassignment.NewRepository(nil) 364 365 // WHEN 366 err := repo.DeleteForScenarioName(ctx, tenantID, scenarioName) 367 368 // THEN 369 require.NoError(t, err) 370 }) 371 372 t.Run("Database error", func(t *testing.T) { 373 // GIVEN 374 db, dbMock := testdb.MockDatabase(t) 375 defer dbMock.AssertExpectations(t) 376 dbMock.ExpectExec(`^DELETE FROM public.automatic_scenario_assignments WHERE tenant_id = \$1 AND scenario = \$2$`). 377 WithArgs(tenantID, scenarioName). 378 WillReturnError(fixError()) 379 380 ctx := persistence.SaveToContext(context.TODO(), db) 381 repo := scenarioassignment.NewRepository(nil) 382 383 // WHEN 384 err := repo.DeleteForScenarioName(ctx, tenantID, scenarioName) 385 386 // THEN 387 require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 388 }) 389 }