github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/eventdef/repository_test.go (about) 1 package eventdef_test 2 3 import ( 4 "context" 5 "database/sql/driver" 6 "regexp" 7 "testing" 8 9 "github.com/kyma-incubator/compass/components/director/pkg/resource" 10 11 "github.com/kyma-incubator/compass/components/director/pkg/persistence" 12 "github.com/stretchr/testify/require" 13 14 "github.com/kyma-incubator/compass/components/director/pkg/pagination" 15 16 "github.com/DATA-DOG/go-sqlmock" 17 event "github.com/kyma-incubator/compass/components/director/internal/domain/eventdef" 18 "github.com/kyma-incubator/compass/components/director/internal/domain/eventdef/automock" 19 "github.com/kyma-incubator/compass/components/director/internal/model" 20 "github.com/kyma-incubator/compass/components/director/internal/repo/testdb" 21 ) 22 23 func TestPgRepository_GetByID(t *testing.T) { 24 eventDefModel := fixEventDefinitionModel(eventID, "placeholder") 25 eventDefEntity := fixFullEntityEventDefinition(eventID, "placeholder") 26 27 suite := testdb.RepoGetTestSuite{ 28 Name: "Get Event Definition", 29 SQLQueryDetails: []testdb.SQLQueryDetails{ 30 { 31 Query: regexp.QuoteMeta(`SELECT id, app_id, app_template_version_id, package_id, name, description, group_name, ord_id, local_tenant_id, short_description, system_instance_aware, policy_level, custom_policy_level, changelog_entries, links, tags, countries, release_status, sunset_date, labels, visibility, disabled, part_of_products, line_of_business, industry, version_value, version_deprecated, version_deprecated_since, version_for_removal, ready, created_at, updated_at, deleted_at, error, extensible, successors, resource_hash, hierarchy, documentation_labels FROM "public"."event_api_definitions" WHERE id = $1 AND (id IN (SELECT id FROM event_api_definitions_tenants WHERE tenant_id = $2))`), 32 Args: []driver.Value{eventID, tenantID}, 33 IsSelect: true, 34 ValidRowsProvider: func() []*sqlmock.Rows { 35 return []*sqlmock.Rows{ 36 sqlmock.NewRows(fixEventDefinitionColumns()). 37 AddRow(fixEventDefinitionRow(eventID, "placeholder")...), 38 } 39 }, 40 InvalidRowsProvider: func() []*sqlmock.Rows { 41 return []*sqlmock.Rows{ 42 sqlmock.NewRows(fixEventDefinitionColumns()), 43 } 44 }, 45 }, 46 }, 47 ConverterMockProvider: func() testdb.Mock { 48 return &automock.EventAPIDefinitionConverter{} 49 }, 50 RepoConstructorFunc: event.NewRepository, 51 ExpectedModelEntity: eventDefModel, 52 ExpectedDBEntity: eventDefEntity, 53 MethodArgs: []interface{}{tenantID, eventID}, 54 DisableConverterErrorTest: true, 55 } 56 57 suite.Run(t) 58 } 59 60 func TestPgRepository_GetByIDGlobal(t *testing.T) { 61 eventDefModel := fixEventDefinitionModel(eventID, "placeholder") 62 eventDefEntity := fixFullEntityEventDefinition(eventID, "placeholder") 63 64 suite := testdb.RepoGetTestSuite{ 65 Name: "Get Event Definition Global", 66 SQLQueryDetails: []testdb.SQLQueryDetails{ 67 { 68 Query: regexp.QuoteMeta(`SELECT id, app_id, app_template_version_id, package_id, name, description, group_name, ord_id, local_tenant_id, short_description, system_instance_aware, policy_level, custom_policy_level, changelog_entries, links, tags, countries, release_status, sunset_date, labels, visibility, disabled, part_of_products, line_of_business, industry, version_value, version_deprecated, version_deprecated_since, version_for_removal, ready, created_at, updated_at, deleted_at, error, extensible, successors, resource_hash, hierarchy, documentation_labels FROM "public"."event_api_definitions" WHERE id = $1`), 69 Args: []driver.Value{eventID}, 70 IsSelect: true, 71 ValidRowsProvider: func() []*sqlmock.Rows { 72 return []*sqlmock.Rows{ 73 sqlmock.NewRows(fixEventDefinitionColumns()). 74 AddRow(fixEventDefinitionRow(eventID, "placeholder")...), 75 } 76 }, 77 InvalidRowsProvider: func() []*sqlmock.Rows { 78 return []*sqlmock.Rows{ 79 sqlmock.NewRows(fixEventDefinitionColumns()), 80 } 81 }, 82 }, 83 }, 84 ConverterMockProvider: func() testdb.Mock { 85 return &automock.EventAPIDefinitionConverter{} 86 }, 87 RepoConstructorFunc: event.NewRepository, 88 ExpectedModelEntity: eventDefModel, 89 ExpectedDBEntity: eventDefEntity, 90 MethodArgs: []interface{}{eventID}, 91 DisableConverterErrorTest: true, 92 MethodName: "GetByIDGlobal", 93 } 94 95 suite.Run(t) 96 } 97 98 func TestPgRepository_ListByResourceID(t *testing.T) { 99 firstEventDefID := "111111111-1111-1111-1111-111111111111" 100 firstEventDefModel := fixEventDefinitionModel(firstEventDefID, "placeholder") 101 firstEventDefEntity := fixFullEntityEventDefinition(firstEventDefID, "placeholder") 102 secondEventDefID := "222222222-2222-2222-2222-222222222222" 103 secondEventDefModel := fixEventDefinitionModel(secondEventDefID, "placeholder") 104 secondEventDefEntity := fixFullEntityEventDefinition(secondEventDefID, "placeholder") 105 106 suite := testdb.RepoListTestSuite{ 107 Name: "List APIs", 108 SQLQueryDetails: []testdb.SQLQueryDetails{ 109 { 110 Query: regexp.QuoteMeta(`SELECT id, app_id, app_template_version_id, package_id, name, description, group_name, ord_id, local_tenant_id, short_description, system_instance_aware, policy_level, custom_policy_level, changelog_entries, links, tags, countries, release_status, sunset_date, labels, visibility, disabled, part_of_products, line_of_business, industry, version_value, version_deprecated, version_deprecated_since, version_for_removal, ready, created_at, updated_at, deleted_at, error, extensible, successors, resource_hash, hierarchy, documentation_labels FROM "public"."event_api_definitions" WHERE app_id = $1 AND (id IN (SELECT id FROM event_api_definitions_tenants WHERE tenant_id = $2)) FOR UPDATE`), 111 Args: []driver.Value{appID, tenantID}, 112 IsSelect: true, 113 ValidRowsProvider: func() []*sqlmock.Rows { 114 return []*sqlmock.Rows{sqlmock.NewRows(fixEventDefinitionColumns()).AddRow(fixEventDefinitionRow(firstEventDefID, "placeholder")...).AddRow(fixEventDefinitionRow(secondEventDefID, "placeholder")...)} 115 }, 116 InvalidRowsProvider: func() []*sqlmock.Rows { 117 return []*sqlmock.Rows{sqlmock.NewRows(fixEventDefinitionColumns())} 118 }, 119 }, 120 }, 121 ConverterMockProvider: func() testdb.Mock { 122 return &automock.EventAPIDefinitionConverter{} 123 }, 124 RepoConstructorFunc: event.NewRepository, 125 ExpectedModelEntities: []interface{}{firstEventDefModel, secondEventDefModel}, 126 ExpectedDBEntities: []interface{}{firstEventDefEntity, secondEventDefEntity}, 127 MethodArgs: []interface{}{tenantID, appID, resource.Application}, 128 MethodName: "ListByResourceID", 129 DisableConverterErrorTest: true, 130 } 131 132 suite.Run(t) 133 } 134 135 func TestPgRepository_ListByApplicationIDPage(t *testing.T) { 136 pageSize := 1 137 cursor := "" 138 139 firstEventDefID := "firstEventDefID" 140 firstEventDef, _, _ := fixFullEventDefinitionModelWithID(firstEventDefID, "placeholder") 141 firstEntity := fixFullEntityEventDefinition(firstEventDefID, "placeholder") 142 143 suite := testdb.RepoListPageableTestSuite{ 144 Name: "List Events with paging", 145 SQLQueryDetails: []testdb.SQLQueryDetails{ 146 { 147 Query: regexp.QuoteMeta(`SELECT id, app_id, app_template_version_id, package_id, name, description, group_name, ord_id, local_tenant_id, short_description, system_instance_aware, policy_level, custom_policy_level, changelog_entries, links, tags, countries, release_status, sunset_date, labels, visibility, disabled, part_of_products, line_of_business, industry, version_value, version_deprecated, version_deprecated_since, version_for_removal, ready, created_at, updated_at, deleted_at, error, extensible, successors, resource_hash, hierarchy, documentation_labels FROM "public"."event_api_definitions" WHERE (app_id = $1 AND (id IN (SELECT id FROM event_api_definitions_tenants WHERE tenant_id = $2)))`), 148 Args: []driver.Value{appID, tenantID}, 149 IsSelect: true, 150 ValidRowsProvider: func() []*sqlmock.Rows { 151 return []*sqlmock.Rows{sqlmock.NewRows(fixEventDefinitionColumns()).AddRow(fixEventDefinitionRow(firstEventDefID, "placeholder")...)} 152 }, 153 }, 154 { 155 Query: regexp.QuoteMeta(`SELECT COUNT(*) FROM "public"."event_api_definitions" WHERE (app_id = $1 AND (id IN (SELECT id FROM event_api_definitions_tenants WHERE tenant_id = $2)))`), 156 Args: []driver.Value{appID, tenantID}, 157 IsSelect: true, 158 ValidRowsProvider: func() []*sqlmock.Rows { 159 return []*sqlmock.Rows{sqlmock.NewRows([]string{"count"}).AddRow(1)} 160 }, 161 }, 162 }, 163 Pages: []testdb.PageDetails{ 164 { 165 ExpectedModelEntities: []interface{}{&firstEventDef}, 166 ExpectedDBEntities: []interface{}{firstEntity}, 167 ExpectedPage: &model.EventDefinitionPage{ 168 Data: []*model.EventDefinition{&firstEventDef}, 169 PageInfo: &pagination.Page{ 170 StartCursor: "", 171 EndCursor: "", 172 HasNextPage: false, 173 }, 174 TotalCount: 1, 175 }, 176 }, 177 }, 178 ConverterMockProvider: func() testdb.Mock { 179 return &automock.EventAPIDefinitionConverter{} 180 }, 181 RepoConstructorFunc: event.NewRepository, 182 MethodName: "ListByApplicationIDPage", 183 MethodArgs: []interface{}{tenantID, appID, pageSize, cursor}, 184 DisableConverterErrorTest: true, 185 } 186 187 suite.Run(t) 188 } 189 190 func TestPgRepository_ListAllForBundle(t *testing.T) { 191 pageSize := 1 192 cursor := "" 193 194 emptyPageBundleID := "emptyPageBundleID" 195 196 onePageBundleID := "onePageBundleID" 197 firstEventDefID := "firstEventDefID" 198 firstEventDef, _, _ := fixFullEventDefinitionModelWithID(firstEventDefID, "placeholder") 199 firstEntity := fixFullEntityEventDefinition(firstEventDefID, "placeholder") 200 firstBundleRef := fixModelBundleReference(onePageBundleID, firstEventDefID) 201 202 multiplePagesBundleID := "multiplePagesBundleID" 203 204 secondEventDefID := "secondEventDefID" 205 secondEventDef, _, _ := fixFullEventDefinitionModelWithID(secondEventDefID, "placeholder") 206 secondEntity := fixFullEntityEventDefinition(secondEventDefID, "placeholder") 207 secondBundleRef := fixModelBundleReference(multiplePagesBundleID, secondEventDefID) 208 209 totalCounts := map[string]int{ 210 emptyPageBundleID: 0, 211 onePageBundleID: 1, 212 multiplePagesBundleID: 2, 213 } 214 215 suite := testdb.RepoListPageableTestSuite{ 216 Name: "List Events for multiple bundles with paging", 217 SQLQueryDetails: []testdb.SQLQueryDetails{ 218 { 219 Query: regexp.QuoteMeta(`SELECT id, app_id, app_template_version_id, package_id, name, description, group_name, ord_id, local_tenant_id, short_description, system_instance_aware, policy_level, custom_policy_level, changelog_entries, links, tags, countries, release_status, sunset_date, labels, visibility, disabled, part_of_products, line_of_business, industry, version_value, version_deprecated, version_deprecated_since, version_for_removal, ready, created_at, updated_at, deleted_at, error, extensible, successors, resource_hash, hierarchy, documentation_labels FROM "public"."event_api_definitions" WHERE id IN ($1, $2) AND (id IN (SELECT id FROM event_api_definitions_tenants WHERE tenant_id = $3))`), 220 Args: []driver.Value{firstEventDefID, secondEventDefID, tenantID}, 221 IsSelect: true, 222 ValidRowsProvider: func() []*sqlmock.Rows { 223 return []*sqlmock.Rows{sqlmock.NewRows(fixEventDefinitionColumns()).AddRow(fixEventDefinitionRow(firstEventDefID, "placeholder")...).AddRow(fixEventDefinitionRow(secondEventDefID, "placeholder")...)} 224 }, 225 }, 226 }, 227 Pages: []testdb.PageDetails{ 228 { 229 ExpectedModelEntities: nil, 230 ExpectedDBEntities: nil, 231 ExpectedPage: &model.EventDefinitionPage{ 232 Data: []*model.EventDefinition{}, 233 PageInfo: &pagination.Page{ 234 StartCursor: "", 235 EndCursor: "", 236 HasNextPage: false, 237 }, 238 TotalCount: 0, 239 }, 240 }, 241 { 242 ExpectedModelEntities: []interface{}{&firstEventDef}, 243 ExpectedDBEntities: []interface{}{firstEntity}, 244 ExpectedPage: &model.EventDefinitionPage{ 245 Data: []*model.EventDefinition{&firstEventDef}, 246 PageInfo: &pagination.Page{ 247 StartCursor: "", 248 EndCursor: "", 249 HasNextPage: false, 250 }, 251 TotalCount: 1, 252 }, 253 }, 254 { 255 ExpectedModelEntities: []interface{}{&secondEventDef}, 256 ExpectedDBEntities: []interface{}{secondEntity}, 257 ExpectedPage: &model.EventDefinitionPage{ 258 Data: []*model.EventDefinition{&secondEventDef}, 259 PageInfo: &pagination.Page{ 260 StartCursor: "", 261 EndCursor: pagination.EncodeNextOffsetCursor(0, pageSize), 262 HasNextPage: true, 263 }, 264 TotalCount: 2, 265 }, 266 }, 267 }, 268 ConverterMockProvider: func() testdb.Mock { 269 return &automock.EventAPIDefinitionConverter{} 270 }, 271 RepoConstructorFunc: event.NewRepository, 272 MethodName: "ListByBundleIDs", 273 MethodArgs: []interface{}{tenantID, []string{emptyPageBundleID, onePageBundleID, multiplePagesBundleID}, 274 []*model.BundleReference{firstBundleRef, secondBundleRef}, totalCounts, pageSize, cursor}, 275 DisableConverterErrorTest: true, 276 } 277 278 suite.Run(t) 279 } 280 281 func TestPgRepository_Create(t *testing.T) { 282 // GIVEN 283 var nilEventDefModel *model.EventDefinition 284 eventDefModel, _, _ := fixFullEventDefinitionModel("placeholder") 285 eventDefEntity := fixFullEntityEventDefinition(eventID, "placeholder") 286 287 suite := testdb.RepoCreateTestSuite{ 288 Name: "Create Event", 289 SQLQueryDetails: []testdb.SQLQueryDetails{ 290 { 291 Query: regexp.QuoteMeta("SELECT 1 FROM tenant_applications WHERE tenant_id = $1 AND id = $2 AND owner = $3"), 292 Args: []driver.Value{tenantID, appID, true}, 293 IsSelect: true, 294 ValidRowsProvider: func() []*sqlmock.Rows { 295 return []*sqlmock.Rows{testdb.RowWhenObjectExist()} 296 }, 297 InvalidRowsProvider: func() []*sqlmock.Rows { 298 return []*sqlmock.Rows{testdb.RowWhenObjectDoesNotExist()} 299 }, 300 }, 301 { 302 Query: `^INSERT INTO "public"."event_api_definitions" \(.+\) VALUES \(.+\)$`, 303 Args: fixEventCreateArgs(eventID, &eventDefModel), 304 ValidResult: sqlmock.NewResult(-1, 1), 305 }, 306 }, 307 ConverterMockProvider: func() testdb.Mock { 308 return &automock.EventAPIDefinitionConverter{} 309 }, 310 RepoConstructorFunc: event.NewRepository, 311 ModelEntity: &eventDefModel, 312 DBEntity: eventDefEntity, 313 NilModelEntity: nilEventDefModel, 314 TenantID: tenantID, 315 DisableConverterErrorTest: true, 316 } 317 318 suite.Run(t) 319 } 320 321 func TestPgRepository_CreateGlobal(t *testing.T) { 322 // GIVEN 323 var nilEventDefModel *model.EventDefinition 324 eventDefModel, _, _ := fixFullEventDefinitionModel("placeholder") 325 eventDefEntity := fixFullEntityEventDefinition(eventID, "placeholder") 326 327 suite := testdb.RepoCreateTestSuite{ 328 Name: "Create Event Global", 329 SQLQueryDetails: []testdb.SQLQueryDetails{ 330 { 331 Query: `^INSERT INTO "public"."event_api_definitions" \(.+\) VALUES \(.+\)$`, 332 Args: fixEventCreateArgs(eventID, &eventDefModel), 333 ValidResult: sqlmock.NewResult(-1, 1), 334 }, 335 }, 336 ConverterMockProvider: func() testdb.Mock { 337 return &automock.EventAPIDefinitionConverter{} 338 }, 339 RepoConstructorFunc: event.NewRepository, 340 ModelEntity: &eventDefModel, 341 DBEntity: eventDefEntity, 342 NilModelEntity: nilEventDefModel, 343 DisableConverterErrorTest: true, 344 IsGlobal: true, 345 MethodName: "CreateGlobal", 346 } 347 348 suite.Run(t) 349 } 350 351 func TestPgRepository_CreateMany(t *testing.T) { 352 insertQuery := `^INSERT INTO "public"."event_api_definitions" (.+) VALUES (.+)$` 353 354 t.Run("success", func(t *testing.T) { 355 sqlxDB, sqlMock := testdb.MockDatabase(t) 356 ctx := persistence.SaveToContext(context.TODO(), sqlxDB) 357 first, _, _ := fixFullEventDefinitionModel("first") 358 second, _, _ := fixFullEventDefinitionModel("second") 359 third, _, _ := fixFullEventDefinitionModel("third") 360 items := []*model.EventDefinition{&first, &second, &third} 361 362 convMock := &automock.EventAPIDefinitionConverter{} 363 for _, item := range items { 364 convMock.On("ToEntity", item).Return(fixFullEntityEventDefinition(item.ID, item.Name), nil).Once() 365 sqlMock.ExpectQuery(regexp.QuoteMeta("SELECT 1 FROM tenant_applications WHERE tenant_id = $1 AND id = $2 AND owner = $3")).WithArgs(tenantID, appID, true).WillReturnRows(testdb.RowWhenObjectExist()) 366 sqlMock.ExpectExec(insertQuery). 367 WithArgs(fixEventCreateArgs(item.ID, item)...). 368 WillReturnResult(sqlmock.NewResult(-1, 1)) 369 } 370 pgRepository := event.NewRepository(convMock) 371 // WHEN 372 err := pgRepository.CreateMany(ctx, tenantID, items) 373 // THEN 374 require.NoError(t, err) 375 convMock.AssertExpectations(t) 376 sqlMock.AssertExpectations(t) 377 }) 378 } 379 380 func TestPgRepository_Update(t *testing.T) { 381 updateQuery := regexp.QuoteMeta(`UPDATE "public"."event_api_definitions" SET package_id = ?, name = ?, description = ?, group_name = ?, ord_id = ?, local_tenant_id = ?, 382 short_description = ?, system_instance_aware = ?, policy_level = ?, custom_policy_level = ?, changelog_entries = ?, links = ?, tags = ?, countries = ?, release_status = ?, 383 sunset_date = ?, labels = ?, visibility = ?, disabled = ?, part_of_products = ?, line_of_business = ?, industry = ?, version_value = ?, version_deprecated = ?, version_deprecated_since = ?, 384 version_for_removal = ?, ready = ?, created_at = ?, updated_at = ?, deleted_at = ?, error = ?, extensible = ?, successors = ?, resource_hash = ?, hierarchy = ?, documentation_labels = ? WHERE id = ? AND (id IN (SELECT id FROM event_api_definitions_tenants WHERE tenant_id = ? AND owner = true))`) 385 386 var nilEventDefModel *model.EventDefinition 387 eventModel, _, _ := fixFullEventDefinitionModel("update") 388 entity := fixFullEntityEventDefinition(eventID, "update") 389 entity.UpdatedAt = &fixedTimestamp 390 entity.DeletedAt = &fixedTimestamp // This is needed as workaround so that updatedAt timestamp is not updated 391 392 suite := testdb.RepoUpdateTestSuite{ 393 Name: "Update Event", 394 SQLQueryDetails: []testdb.SQLQueryDetails{ 395 { 396 Query: updateQuery, 397 Args: []driver.Value{entity.PackageID, entity.Name, entity.Description, entity.GroupName, entity.OrdID, entity.LocalTenantID, entity.ShortDescription, entity.SystemInstanceAware, entity.PolicyLevel, entity.CustomPolicyLevel, 398 entity.ChangeLogEntries, entity.Links, entity.Tags, entity.Countries, entity.ReleaseStatus, entity.SunsetDate, entity.Labels, entity.Visibility, 399 entity.Disabled, entity.PartOfProducts, entity.LineOfBusiness, entity.Industry, entity.Version.Value, entity.Version.Deprecated, entity.Version.DeprecatedSince, entity.Version.ForRemoval, 400 entity.Ready, entity.CreatedAt, entity.UpdatedAt, entity.DeletedAt, entity.Error, entity.Extensible, entity.Successors, entity.ResourceHash, entity.Hierarchy, entity.DocumentationLabels, entity.ID, tenantID}, 401 ValidResult: sqlmock.NewResult(-1, 1), 402 InvalidResult: sqlmock.NewResult(-1, 0), 403 }, 404 }, 405 ConverterMockProvider: func() testdb.Mock { 406 return &automock.EventAPIDefinitionConverter{} 407 }, 408 RepoConstructorFunc: event.NewRepository, 409 ModelEntity: &eventModel, 410 DBEntity: entity, 411 NilModelEntity: nilEventDefModel, 412 TenantID: tenantID, 413 DisableConverterErrorTest: true, 414 } 415 416 suite.Run(t) 417 } 418 419 func TestPgRepository_Delete(t *testing.T) { 420 suite := testdb.RepoDeleteTestSuite{ 421 Name: "Event Delete", 422 SQLQueryDetails: []testdb.SQLQueryDetails{ 423 { 424 Query: regexp.QuoteMeta(`DELETE FROM "public"."event_api_definitions" WHERE id = $1 AND (id IN (SELECT id FROM event_api_definitions_tenants WHERE tenant_id = $2 AND owner = true))`), 425 Args: []driver.Value{eventID, tenantID}, 426 ValidResult: sqlmock.NewResult(-1, 1), 427 InvalidResult: sqlmock.NewResult(-1, 2), 428 }, 429 }, 430 ConverterMockProvider: func() testdb.Mock { 431 return &automock.EventAPIDefinitionConverter{} 432 }, 433 RepoConstructorFunc: event.NewRepository, 434 MethodArgs: []interface{}{tenantID, eventID}, 435 } 436 437 suite.Run(t) 438 } 439 440 func TestPgRepository_DeleteGlobal(t *testing.T) { 441 suite := testdb.RepoDeleteTestSuite{ 442 Name: "Event Delete Global", 443 SQLQueryDetails: []testdb.SQLQueryDetails{ 444 { 445 Query: regexp.QuoteMeta(`DELETE FROM "public"."event_api_definitions" WHERE id = $1`), 446 Args: []driver.Value{eventID}, 447 ValidResult: sqlmock.NewResult(-1, 1), 448 InvalidResult: sqlmock.NewResult(-1, 2), 449 }, 450 }, 451 ConverterMockProvider: func() testdb.Mock { 452 return &automock.EventAPIDefinitionConverter{} 453 }, 454 RepoConstructorFunc: event.NewRepository, 455 MethodArgs: []interface{}{eventID}, 456 IsGlobal: true, 457 MethodName: "DeleteGlobal", 458 } 459 460 suite.Run(t) 461 } 462 463 func TestPgRepository_DeleteAllByBundleID(t *testing.T) { 464 suite := testdb.RepoDeleteTestSuite{ 465 Name: "Event Delete By BundleID", 466 SQLQueryDetails: []testdb.SQLQueryDetails{ 467 { 468 Query: regexp.QuoteMeta(`DELETE FROM "public"."event_api_definitions" WHERE id IN (SELECT event_def_id FROM public.bundle_references WHERE bundle_id = $1 AND event_def_id IS NOT NULL) AND (id IN (SELECT id FROM event_api_definitions_tenants WHERE tenant_id = $2 AND owner = true))`), 469 Args: []driver.Value{bundleID, tenantID}, 470 ValidResult: sqlmock.NewResult(-1, 1), 471 InvalidResult: sqlmock.NewResult(-1, 2), 472 }, 473 }, 474 ConverterMockProvider: func() testdb.Mock { 475 return &automock.EventAPIDefinitionConverter{} 476 }, 477 RepoConstructorFunc: event.NewRepository, 478 MethodName: "DeleteAllByBundleID", 479 MethodArgs: []interface{}{tenantID, bundleID}, 480 IsDeleteMany: true, 481 } 482 483 suite.Run(t) 484 } 485 486 func TestPgRepository_Exists(t *testing.T) { 487 suite := testdb.RepoExistTestSuite{ 488 Name: "Event Exists", 489 SQLQueryDetails: []testdb.SQLQueryDetails{ 490 { 491 Query: regexp.QuoteMeta(`SELECT 1 FROM "public"."event_api_definitions" WHERE id = $1 AND (id IN (SELECT id FROM event_api_definitions_tenants WHERE tenant_id = $2))`), 492 Args: []driver.Value{eventID, tenantID}, 493 IsSelect: true, 494 ValidRowsProvider: func() []*sqlmock.Rows { 495 return []*sqlmock.Rows{testdb.RowWhenObjectExist()} 496 }, 497 InvalidRowsProvider: func() []*sqlmock.Rows { 498 return []*sqlmock.Rows{testdb.RowWhenObjectDoesNotExist()} 499 }, 500 }, 501 }, 502 ConverterMockProvider: func() testdb.Mock { 503 return &automock.EventAPIDefinitionConverter{} 504 }, 505 RepoConstructorFunc: event.NewRepository, 506 TargetID: eventID, 507 TenantID: tenantID, 508 MethodName: "Exists", 509 MethodArgs: []interface{}{tenantID, eventID}, 510 } 511 512 suite.Run(t) 513 }