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  }