github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/fetchrequest/repository_test.go (about)

     1  package fetchrequest_test
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"database/sql/driver"
     7  	"regexp"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/kyma-incubator/compass/components/director/pkg/apperrors"
    12  	"github.com/kyma-incubator/compass/components/director/pkg/persistence"
    13  	"github.com/stretchr/testify/require"
    14  
    15  	"github.com/DATA-DOG/go-sqlmock"
    16  	"github.com/kyma-incubator/compass/components/director/internal/domain/fetchrequest"
    17  	"github.com/kyma-incubator/compass/components/director/internal/domain/fetchrequest/automock"
    18  	"github.com/kyma-incubator/compass/components/director/internal/model"
    19  	"github.com/kyma-incubator/compass/components/director/internal/repo/testdb"
    20  )
    21  
    22  func TestRepository_Create(t *testing.T) {
    23  	timestamp := time.Now()
    24  	var nilFrModel *model.FetchRequest
    25  	apiFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.APISpecFetchRequestReference)
    26  	apiFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.APISpecFetchRequestReference)
    27  	eventFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.EventSpecFetchRequestReference)
    28  	eventFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.EventSpecFetchRequestReference)
    29  	docFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.DocumentFetchRequestReference)
    30  	docFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.DocumentFetchRequestReference)
    31  
    32  	apiFRSuite := testdb.RepoCreateTestSuite{
    33  		Name: "Create API FR",
    34  		SQLQueryDetails: []testdb.SQLQueryDetails{
    35  			{
    36  				Query:    regexp.QuoteMeta("SELECT 1 FROM api_specifications_tenants WHERE tenant_id = $1 AND id = $2 AND owner = $3"),
    37  				Args:     []driver.Value{tenantID, refID, true},
    38  				IsSelect: true,
    39  				ValidRowsProvider: func() []*sqlmock.Rows {
    40  					return []*sqlmock.Rows{testdb.RowWhenObjectExist()}
    41  				},
    42  				InvalidRowsProvider: func() []*sqlmock.Rows {
    43  					return []*sqlmock.Rows{testdb.RowWhenObjectDoesNotExist()}
    44  				},
    45  			},
    46  			{
    47  				Query:       regexp.QuoteMeta("INSERT INTO public.fetch_requests ( id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"),
    48  				Args:        []driver.Value{givenID(), sql.NullString{}, "foo.bar", apiFREntity.Auth, apiFREntity.Mode, apiFREntity.Filter, apiFREntity.StatusCondition, apiFREntity.StatusMessage, apiFREntity.StatusTimestamp, refID},
    49  				ValidResult: sqlmock.NewResult(-1, 1),
    50  			},
    51  		},
    52  		ConverterMockProvider: func() testdb.Mock {
    53  			return &automock.Converter{}
    54  		},
    55  		RepoConstructorFunc: fetchrequest.NewRepository,
    56  		ModelEntity:         apiFRModel,
    57  		DBEntity:            apiFREntity,
    58  		NilModelEntity:      nilFrModel,
    59  		TenantID:            tenantID,
    60  	}
    61  
    62  	eventFRSuite := testdb.RepoCreateTestSuite{
    63  		Name: "Create Event FR",
    64  		SQLQueryDetails: []testdb.SQLQueryDetails{
    65  			{
    66  				Query:    regexp.QuoteMeta("SELECT 1 FROM event_specifications_tenants WHERE tenant_id = $1 AND id = $2 AND owner = $3"),
    67  				Args:     []driver.Value{tenantID, refID, true},
    68  				IsSelect: true,
    69  				ValidRowsProvider: func() []*sqlmock.Rows {
    70  					return []*sqlmock.Rows{testdb.RowWhenObjectExist()}
    71  				},
    72  				InvalidRowsProvider: func() []*sqlmock.Rows {
    73  					return []*sqlmock.Rows{testdb.RowWhenObjectDoesNotExist()}
    74  				},
    75  			},
    76  			{
    77  				Query:       regexp.QuoteMeta("INSERT INTO public.fetch_requests ( id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"),
    78  				Args:        []driver.Value{givenID(), sql.NullString{}, "foo.bar", eventFREntity.Auth, eventFREntity.Mode, eventFREntity.Filter, eventFREntity.StatusCondition, eventFREntity.StatusMessage, eventFREntity.StatusTimestamp, refID},
    79  				ValidResult: sqlmock.NewResult(-1, 1),
    80  			},
    81  		},
    82  		ConverterMockProvider: func() testdb.Mock {
    83  			return &automock.Converter{}
    84  		},
    85  		RepoConstructorFunc: fetchrequest.NewRepository,
    86  		ModelEntity:         eventFRModel,
    87  		DBEntity:            eventFREntity,
    88  		NilModelEntity:      nilFrModel,
    89  		TenantID:            tenantID,
    90  	}
    91  
    92  	docFRSuite := testdb.RepoCreateTestSuite{
    93  		Name: "Create Doc FR",
    94  		SQLQueryDetails: []testdb.SQLQueryDetails{
    95  			{
    96  				Query:    regexp.QuoteMeta("SELECT 1 FROM documents_tenants WHERE tenant_id = $1 AND id = $2 AND owner = $3"),
    97  				Args:     []driver.Value{tenantID, refID, true},
    98  				IsSelect: true,
    99  				ValidRowsProvider: func() []*sqlmock.Rows {
   100  					return []*sqlmock.Rows{testdb.RowWhenObjectExist()}
   101  				},
   102  				InvalidRowsProvider: func() []*sqlmock.Rows {
   103  					return []*sqlmock.Rows{testdb.RowWhenObjectDoesNotExist()}
   104  				},
   105  			},
   106  			{
   107  				Query:       regexp.QuoteMeta("INSERT INTO public.fetch_requests ( id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"),
   108  				Args:        []driver.Value{givenID(), refID, "foo.bar", docFREntity.Auth, docFREntity.Mode, docFREntity.Filter, docFREntity.StatusCondition, docFREntity.StatusMessage, docFREntity.StatusTimestamp, sql.NullString{}},
   109  				ValidResult: sqlmock.NewResult(-1, 1),
   110  			},
   111  		},
   112  		ConverterMockProvider: func() testdb.Mock {
   113  			return &automock.Converter{}
   114  		},
   115  		RepoConstructorFunc: fetchrequest.NewRepository,
   116  		ModelEntity:         docFRModel,
   117  		DBEntity:            docFREntity,
   118  		NilModelEntity:      nilFrModel,
   119  		TenantID:            tenantID,
   120  	}
   121  
   122  	apiFRSuite.Run(t)
   123  	eventFRSuite.Run(t)
   124  	docFRSuite.Run(t)
   125  }
   126  
   127  func TestRepository_CreateGlobal(t *testing.T) {
   128  	timestamp := time.Now()
   129  	var nilFrModel *model.FetchRequest
   130  	apiFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.APISpecFetchRequestReference)
   131  	apiFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.APISpecFetchRequestReference)
   132  
   133  	apiFRSuite := testdb.RepoCreateTestSuite{
   134  		Name: "Create API FR",
   135  		SQLQueryDetails: []testdb.SQLQueryDetails{
   136  			{
   137  				Query:       regexp.QuoteMeta("INSERT INTO public.fetch_requests ( id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"),
   138  				Args:        []driver.Value{givenID(), sql.NullString{}, "foo.bar", apiFREntity.Auth, apiFREntity.Mode, apiFREntity.Filter, apiFREntity.StatusCondition, apiFREntity.StatusMessage, apiFREntity.StatusTimestamp, refID},
   139  				ValidResult: sqlmock.NewResult(-1, 1),
   140  			},
   141  		},
   142  		ConverterMockProvider: func() testdb.Mock {
   143  			return &automock.Converter{}
   144  		},
   145  		RepoConstructorFunc: fetchrequest.NewRepository,
   146  		ModelEntity:         apiFRModel,
   147  		DBEntity:            apiFREntity,
   148  		NilModelEntity:      nilFrModel,
   149  		IsGlobal:            true,
   150  		MethodName:          "CreateGlobal",
   151  	}
   152  
   153  	apiFRSuite.Run(t)
   154  }
   155  
   156  func TestRepository_Update(t *testing.T) {
   157  	timestamp := time.Now()
   158  	var nilFrModel *model.FetchRequest
   159  	apiFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.APISpecFetchRequestReference)
   160  	apiFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.APISpecFetchRequestReference)
   161  	eventFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.EventSpecFetchRequestReference)
   162  	eventFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.EventSpecFetchRequestReference)
   163  	docFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.DocumentFetchRequestReference)
   164  	docFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.DocumentFetchRequestReference)
   165  
   166  	apiFRSuite := testdb.RepoUpdateTestSuite{
   167  		Name: "Update API Fetch Request",
   168  		SQLQueryDetails: []testdb.SQLQueryDetails{
   169  			{
   170  				Query:         regexp.QuoteMeta(`UPDATE public.fetch_requests SET status_condition = ?, status_message = ?, status_timestamp = ? WHERE id = ? AND (id IN (SELECT id FROM api_specifications_fetch_requests_tenants WHERE tenant_id = ? AND owner = true))`),
   171  				Args:          []driver.Value{apiFREntity.StatusCondition, apiFREntity.StatusMessage, apiFREntity.StatusTimestamp, givenID(), tenantID},
   172  				ValidResult:   sqlmock.NewResult(-1, 1),
   173  				InvalidResult: sqlmock.NewResult(-1, 0),
   174  			},
   175  		},
   176  		ConverterMockProvider: func() testdb.Mock {
   177  			return &automock.Converter{}
   178  		},
   179  		RepoConstructorFunc: fetchrequest.NewRepository,
   180  		ModelEntity:         apiFRModel,
   181  		DBEntity:            apiFREntity,
   182  		NilModelEntity:      nilFrModel,
   183  		TenantID:            tenantID,
   184  	}
   185  
   186  	apiFRSuite.Run(t)
   187  
   188  	eventFRSuite := testdb.RepoUpdateTestSuite{
   189  		Name: "Update Event Fetch Request",
   190  		SQLQueryDetails: []testdb.SQLQueryDetails{
   191  			{
   192  				Query:         regexp.QuoteMeta(`UPDATE public.fetch_requests SET status_condition = ?, status_message = ?, status_timestamp = ? WHERE id = ? AND (id IN (SELECT id FROM event_specifications_fetch_requests_tenants WHERE tenant_id = ? AND owner = true))`),
   193  				Args:          []driver.Value{eventFREntity.StatusCondition, eventFREntity.StatusMessage, eventFREntity.StatusTimestamp, givenID(), tenantID},
   194  				ValidResult:   sqlmock.NewResult(-1, 1),
   195  				InvalidResult: sqlmock.NewResult(-1, 0),
   196  			},
   197  		},
   198  		ConverterMockProvider: func() testdb.Mock {
   199  			return &automock.Converter{}
   200  		},
   201  		RepoConstructorFunc: fetchrequest.NewRepository,
   202  		ModelEntity:         eventFRModel,
   203  		DBEntity:            eventFREntity,
   204  		NilModelEntity:      nilFrModel,
   205  		TenantID:            tenantID,
   206  	}
   207  
   208  	eventFRSuite.Run(t)
   209  
   210  	docFRSuite := testdb.RepoUpdateTestSuite{
   211  		Name: "Update Document Fetch Request",
   212  		SQLQueryDetails: []testdb.SQLQueryDetails{
   213  			{
   214  				Query:         regexp.QuoteMeta(`UPDATE public.fetch_requests SET status_condition = ?, status_message = ?, status_timestamp = ? WHERE id = ? AND (id IN (SELECT id FROM document_fetch_requests_tenants WHERE tenant_id = ? AND owner = true))`),
   215  				Args:          []driver.Value{docFREntity.StatusCondition, docFREntity.StatusMessage, docFREntity.StatusTimestamp, givenID(), tenantID},
   216  				ValidResult:   sqlmock.NewResult(-1, 1),
   217  				InvalidResult: sqlmock.NewResult(-1, 0),
   218  			},
   219  		},
   220  		ConverterMockProvider: func() testdb.Mock {
   221  			return &automock.Converter{}
   222  		},
   223  		RepoConstructorFunc: fetchrequest.NewRepository,
   224  		ModelEntity:         docFRModel,
   225  		DBEntity:            docFREntity,
   226  		NilModelEntity:      nilFrModel,
   227  		TenantID:            tenantID,
   228  	}
   229  
   230  	docFRSuite.Run(t)
   231  }
   232  
   233  func TestRepository_UpdateGlobal(t *testing.T) {
   234  	timestamp := time.Now()
   235  	var nilFrModel *model.FetchRequest
   236  	apiFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.APISpecFetchRequestReference)
   237  	apiFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.APISpecFetchRequestReference)
   238  
   239  	apiFRSuite := testdb.RepoUpdateTestSuite{
   240  		Name: "Update API Fetch Request",
   241  		SQLQueryDetails: []testdb.SQLQueryDetails{
   242  			{
   243  				Query:         regexp.QuoteMeta(`UPDATE public.fetch_requests SET status_condition = ?, status_message = ?, status_timestamp = ? WHERE id = ?`),
   244  				Args:          []driver.Value{apiFREntity.StatusCondition, apiFREntity.StatusMessage, apiFREntity.StatusTimestamp, givenID()},
   245  				ValidResult:   sqlmock.NewResult(-1, 1),
   246  				InvalidResult: sqlmock.NewResult(-1, 0),
   247  			},
   248  		},
   249  		ConverterMockProvider: func() testdb.Mock {
   250  			return &automock.Converter{}
   251  		},
   252  		RepoConstructorFunc: fetchrequest.NewRepository,
   253  		ModelEntity:         apiFRModel,
   254  		DBEntity:            apiFREntity,
   255  		NilModelEntity:      nilFrModel,
   256  		IsGlobal:            true,
   257  		UpdateMethodName:    "UpdateGlobal",
   258  	}
   259  
   260  	apiFRSuite.Run(t)
   261  }
   262  
   263  func TestRepository_GetByReferenceObjectID(t *testing.T) {
   264  	timestamp := time.Now()
   265  	apiFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.APISpecFetchRequestReference)
   266  	apiFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.APISpecFetchRequestReference)
   267  	eventFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.EventSpecFetchRequestReference)
   268  	eventFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.EventSpecFetchRequestReference)
   269  	docFRModel := fixFullFetchRequestModel(givenID(), timestamp, model.DocumentFetchRequestReference)
   270  	docFREntity := fixFullFetchRequestEntity(t, givenID(), timestamp, model.DocumentFetchRequestReference)
   271  
   272  	apiFRSuite := testdb.RepoGetTestSuite{
   273  		Name: "Get Fetch Request by API ReferenceObjectID",
   274  		SQLQueryDetails: []testdb.SQLQueryDetails{
   275  			{
   276  				Query:    regexp.QuoteMeta(`SELECT id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id FROM public.fetch_requests WHERE spec_id = $1 AND (id IN (SELECT id FROM api_specifications_fetch_requests_tenants WHERE tenant_id = $2))`),
   277  				Args:     []driver.Value{refID, tenantID},
   278  				IsSelect: true,
   279  				ValidRowsProvider: func() []*sqlmock.Rows {
   280  					return []*sqlmock.Rows{
   281  						sqlmock.NewRows(fixColumns()).
   282  							AddRow(givenID(), apiFREntity.DocumentID, "foo.bar", apiFREntity.Auth, apiFREntity.Mode, apiFREntity.Filter, apiFREntity.StatusCondition, apiFREntity.StatusMessage, apiFREntity.StatusTimestamp, apiFREntity.SpecID),
   283  					}
   284  				},
   285  				InvalidRowsProvider: func() []*sqlmock.Rows {
   286  					return []*sqlmock.Rows{
   287  						sqlmock.NewRows(fixColumns()),
   288  					}
   289  				},
   290  			},
   291  		},
   292  		ConverterMockProvider: func() testdb.Mock {
   293  			return &automock.Converter{}
   294  		},
   295  		RepoConstructorFunc:     fetchrequest.NewRepository,
   296  		ExpectedModelEntity:     apiFRModel,
   297  		ExpectedDBEntity:        apiFREntity,
   298  		MethodArgs:              []interface{}{tenantID, model.APISpecFetchRequestReference, refID},
   299  		AdditionalConverterArgs: []interface{}{model.APISpecFetchRequestReference},
   300  		MethodName:              "GetByReferenceObjectID",
   301  	}
   302  
   303  	eventFRSuite := testdb.RepoGetTestSuite{
   304  		Name: "Get Fetch Request by Event ReferenceObjectID",
   305  		SQLQueryDetails: []testdb.SQLQueryDetails{
   306  			{
   307  				Query:    regexp.QuoteMeta(`SELECT id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id FROM public.fetch_requests WHERE spec_id = $1 AND (id IN (SELECT id FROM event_specifications_fetch_requests_tenants WHERE tenant_id = $2))`),
   308  				Args:     []driver.Value{refID, tenantID},
   309  				IsSelect: true,
   310  				ValidRowsProvider: func() []*sqlmock.Rows {
   311  					return []*sqlmock.Rows{
   312  						sqlmock.NewRows(fixColumns()).
   313  							AddRow(givenID(), eventFREntity.DocumentID, "foo.bar", eventFREntity.Auth, eventFREntity.Mode, eventFREntity.Filter, eventFREntity.StatusCondition, eventFREntity.StatusMessage, eventFREntity.StatusTimestamp, eventFREntity.SpecID),
   314  					}
   315  				},
   316  				InvalidRowsProvider: func() []*sqlmock.Rows {
   317  					return []*sqlmock.Rows{
   318  						sqlmock.NewRows(fixColumns()),
   319  					}
   320  				},
   321  			},
   322  		},
   323  		ConverterMockProvider: func() testdb.Mock {
   324  			return &automock.Converter{}
   325  		},
   326  		RepoConstructorFunc:     fetchrequest.NewRepository,
   327  		ExpectedModelEntity:     eventFRModel,
   328  		ExpectedDBEntity:        eventFREntity,
   329  		MethodArgs:              []interface{}{tenantID, model.EventSpecFetchRequestReference, refID},
   330  		AdditionalConverterArgs: []interface{}{model.EventSpecFetchRequestReference},
   331  		MethodName:              "GetByReferenceObjectID",
   332  	}
   333  
   334  	docFRSuite := testdb.RepoGetTestSuite{
   335  		Name: "Get Fetch Request by Document ReferenceObjectID",
   336  		SQLQueryDetails: []testdb.SQLQueryDetails{
   337  			{
   338  				Query:    regexp.QuoteMeta(`SELECT id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id FROM public.fetch_requests WHERE document_id = $1 AND (id IN (SELECT id FROM document_fetch_requests_tenants WHERE tenant_id = $2))`),
   339  				Args:     []driver.Value{refID, tenantID},
   340  				IsSelect: true,
   341  				ValidRowsProvider: func() []*sqlmock.Rows {
   342  					return []*sqlmock.Rows{
   343  						sqlmock.NewRows(fixColumns()).
   344  							AddRow(givenID(), docFREntity.DocumentID, "foo.bar", docFREntity.Auth, docFREntity.Mode, docFREntity.Filter, docFREntity.StatusCondition, docFREntity.StatusMessage, docFREntity.StatusTimestamp, docFREntity.SpecID),
   345  					}
   346  				},
   347  				InvalidRowsProvider: func() []*sqlmock.Rows {
   348  					return []*sqlmock.Rows{
   349  						sqlmock.NewRows(fixColumns()),
   350  					}
   351  				},
   352  			},
   353  		},
   354  		ConverterMockProvider: func() testdb.Mock {
   355  			return &automock.Converter{}
   356  		},
   357  		RepoConstructorFunc:     fetchrequest.NewRepository,
   358  		ExpectedModelEntity:     docFRModel,
   359  		ExpectedDBEntity:        docFREntity,
   360  		MethodArgs:              []interface{}{tenantID, model.DocumentFetchRequestReference, refID},
   361  		AdditionalConverterArgs: []interface{}{model.DocumentFetchRequestReference},
   362  		MethodName:              "GetByReferenceObjectID",
   363  	}
   364  
   365  	apiFRSuite.Run(t)
   366  	eventFRSuite.Run(t)
   367  	docFRSuite.Run(t)
   368  
   369  	// Additional tests
   370  	t.Run("Error - Invalid Object Reference Type", func(t *testing.T) {
   371  		// GIVEN
   372  		db, dbMock := testdb.MockDatabase(t)
   373  		defer dbMock.AssertExpectations(t)
   374  
   375  		ctx := persistence.SaveToContext(context.TODO(), db)
   376  		repo := fetchrequest.NewRepository(nil)
   377  		// WHEN
   378  		_, err := repo.GetByReferenceObjectID(ctx, tenantID, "test", givenID())
   379  		// THEN
   380  		require.EqualError(t, err, apperrors.NewInternalError("Invalid type of the Fetch Request reference object").Error())
   381  	})
   382  }
   383  
   384  func TestRepository_Delete(t *testing.T) {
   385  	apiFRSuite := testdb.RepoDeleteTestSuite{
   386  		Name: "API Fetch Request Delete",
   387  		SQLQueryDetails: []testdb.SQLQueryDetails{
   388  			{
   389  				Query:         regexp.QuoteMeta(`DELETE FROM public.fetch_requests WHERE id = $1 AND (id IN (SELECT id FROM api_specifications_fetch_requests_tenants WHERE tenant_id = $2 AND owner = true))`),
   390  				Args:          []driver.Value{givenID(), tenantID},
   391  				ValidResult:   sqlmock.NewResult(-1, 1),
   392  				InvalidResult: sqlmock.NewResult(-1, 2),
   393  			},
   394  		},
   395  		ConverterMockProvider: func() testdb.Mock {
   396  			return &automock.Converter{}
   397  		},
   398  		RepoConstructorFunc: fetchrequest.NewRepository,
   399  		MethodArgs:          []interface{}{tenantID, givenID(), model.APISpecFetchRequestReference},
   400  	}
   401  
   402  	eventFRSuite := testdb.RepoDeleteTestSuite{
   403  		Name: "Event Fetch Request Delete",
   404  		SQLQueryDetails: []testdb.SQLQueryDetails{
   405  			{
   406  				Query:         regexp.QuoteMeta(`DELETE FROM public.fetch_requests WHERE id = $1 AND (id IN (SELECT id FROM event_specifications_fetch_requests_tenants WHERE tenant_id = $2 AND owner = true))`),
   407  				Args:          []driver.Value{givenID(), tenantID},
   408  				ValidResult:   sqlmock.NewResult(-1, 1),
   409  				InvalidResult: sqlmock.NewResult(-1, 2),
   410  			},
   411  		},
   412  		ConverterMockProvider: func() testdb.Mock {
   413  			return &automock.Converter{}
   414  		},
   415  		RepoConstructorFunc: fetchrequest.NewRepository,
   416  		MethodArgs:          []interface{}{tenantID, givenID(), model.EventSpecFetchRequestReference},
   417  	}
   418  
   419  	docFRSuite := testdb.RepoDeleteTestSuite{
   420  		Name: "Documents Fetch Request Delete",
   421  		SQLQueryDetails: []testdb.SQLQueryDetails{
   422  			{
   423  				Query:         regexp.QuoteMeta(`DELETE FROM public.fetch_requests WHERE id = $1 AND (id IN (SELECT id FROM document_fetch_requests_tenants WHERE tenant_id = $2 AND owner = true))`),
   424  				Args:          []driver.Value{givenID(), tenantID},
   425  				ValidResult:   sqlmock.NewResult(-1, 1),
   426  				InvalidResult: sqlmock.NewResult(-1, 2),
   427  			},
   428  		},
   429  		ConverterMockProvider: func() testdb.Mock {
   430  			return &automock.Converter{}
   431  		},
   432  		RepoConstructorFunc: fetchrequest.NewRepository,
   433  		MethodArgs:          []interface{}{tenantID, givenID(), model.DocumentFetchRequestReference},
   434  	}
   435  
   436  	apiFRSuite.Run(t)
   437  	eventFRSuite.Run(t)
   438  	docFRSuite.Run(t)
   439  }
   440  
   441  func TestRepository_DeleteByReferenceObjectID(t *testing.T) {
   442  	apiFRSuite := testdb.RepoDeleteTestSuite{
   443  		Name: "API Fetch Request Delete By ObjectID",
   444  		SQLQueryDetails: []testdb.SQLQueryDetails{
   445  			{
   446  				Query:         regexp.QuoteMeta(`DELETE FROM public.fetch_requests WHERE spec_id = $1 AND (id IN (SELECT id FROM api_specifications_fetch_requests_tenants WHERE tenant_id = $2 AND owner = true))`),
   447  				Args:          []driver.Value{refID, tenantID},
   448  				ValidResult:   sqlmock.NewResult(-1, 1),
   449  				InvalidResult: sqlmock.NewResult(-1, 2),
   450  			},
   451  		},
   452  		ConverterMockProvider: func() testdb.Mock {
   453  			return &automock.Converter{}
   454  		},
   455  		RepoConstructorFunc: fetchrequest.NewRepository,
   456  		MethodArgs:          []interface{}{tenantID, model.APISpecFetchRequestReference, refID},
   457  		MethodName:          "DeleteByReferenceObjectID",
   458  		IsDeleteMany:        true,
   459  	}
   460  
   461  	eventFRSuite := testdb.RepoDeleteTestSuite{
   462  		Name: "Event Fetch Request Delete",
   463  		SQLQueryDetails: []testdb.SQLQueryDetails{
   464  			{
   465  				Query:         regexp.QuoteMeta(`DELETE FROM public.fetch_requests WHERE spec_id = $1 AND (id IN (SELECT id FROM event_specifications_fetch_requests_tenants WHERE tenant_id = $2 AND owner = true))`),
   466  				Args:          []driver.Value{refID, tenantID},
   467  				ValidResult:   sqlmock.NewResult(-1, 1),
   468  				InvalidResult: sqlmock.NewResult(-1, 2),
   469  			},
   470  		},
   471  		ConverterMockProvider: func() testdb.Mock {
   472  			return &automock.Converter{}
   473  		},
   474  		RepoConstructorFunc: fetchrequest.NewRepository,
   475  		MethodArgs:          []interface{}{tenantID, model.EventSpecFetchRequestReference, refID},
   476  		MethodName:          "DeleteByReferenceObjectID",
   477  		IsDeleteMany:        true,
   478  	}
   479  
   480  	docFRSuite := testdb.RepoDeleteTestSuite{
   481  		Name: "Documents Fetch Request Delete",
   482  		SQLQueryDetails: []testdb.SQLQueryDetails{
   483  			{
   484  				Query:         regexp.QuoteMeta(`DELETE FROM public.fetch_requests WHERE document_id = $1 AND (id IN (SELECT id FROM document_fetch_requests_tenants WHERE tenant_id = $2 AND owner = true))`),
   485  				Args:          []driver.Value{refID, tenantID},
   486  				ValidResult:   sqlmock.NewResult(-1, 1),
   487  				InvalidResult: sqlmock.NewResult(-1, 2),
   488  			},
   489  		},
   490  		ConverterMockProvider: func() testdb.Mock {
   491  			return &automock.Converter{}
   492  		},
   493  		RepoConstructorFunc: fetchrequest.NewRepository,
   494  		MethodArgs:          []interface{}{tenantID, model.DocumentFetchRequestReference, refID},
   495  		MethodName:          "DeleteByReferenceObjectID",
   496  		IsDeleteMany:        true,
   497  	}
   498  
   499  	apiFRSuite.Run(t)
   500  	eventFRSuite.Run(t)
   501  	docFRSuite.Run(t)
   502  }
   503  
   504  func TestRepository_DeleteByReferenceObjectIDGlobal(t *testing.T) {
   505  	apiFRSuite := testdb.RepoDeleteTestSuite{
   506  		Name: "API Fetch Request Delete By ObjectID",
   507  		SQLQueryDetails: []testdb.SQLQueryDetails{
   508  			{
   509  				Query:         regexp.QuoteMeta(`DELETE FROM public.fetch_requests WHERE spec_id = $1`),
   510  				Args:          []driver.Value{refID},
   511  				ValidResult:   sqlmock.NewResult(-1, 1),
   512  				InvalidResult: sqlmock.NewResult(-1, 2),
   513  			},
   514  		},
   515  		ConverterMockProvider: func() testdb.Mock {
   516  			return &automock.Converter{}
   517  		},
   518  		RepoConstructorFunc: fetchrequest.NewRepository,
   519  		MethodArgs:          []interface{}{model.APISpecFetchRequestReference, refID},
   520  		MethodName:          "DeleteByReferenceObjectIDGlobal",
   521  		IsDeleteMany:        true,
   522  		IsGlobal:            true,
   523  	}
   524  
   525  	eventFRSuite := testdb.RepoDeleteTestSuite{
   526  		Name: "Event Fetch Request Delete",
   527  		SQLQueryDetails: []testdb.SQLQueryDetails{
   528  			{
   529  				Query:         regexp.QuoteMeta(`DELETE FROM public.fetch_requests WHERE spec_id = $1`),
   530  				Args:          []driver.Value{refID},
   531  				ValidResult:   sqlmock.NewResult(-1, 1),
   532  				InvalidResult: sqlmock.NewResult(-1, 2),
   533  			},
   534  		},
   535  		ConverterMockProvider: func() testdb.Mock {
   536  			return &automock.Converter{}
   537  		},
   538  		RepoConstructorFunc: fetchrequest.NewRepository,
   539  		MethodArgs:          []interface{}{model.EventSpecFetchRequestReference, refID},
   540  		MethodName:          "DeleteByReferenceObjectIDGlobal",
   541  		IsDeleteMany:        true,
   542  		IsGlobal:            true,
   543  	}
   544  
   545  	docFRSuite := testdb.RepoDeleteTestSuite{
   546  		Name: "Documents Fetch Request Delete",
   547  		SQLQueryDetails: []testdb.SQLQueryDetails{
   548  			{
   549  				Query:         regexp.QuoteMeta(`DELETE FROM public.fetch_requests WHERE document_id = $1`),
   550  				Args:          []driver.Value{refID},
   551  				ValidResult:   sqlmock.NewResult(-1, 1),
   552  				InvalidResult: sqlmock.NewResult(-1, 2),
   553  			},
   554  		},
   555  		ConverterMockProvider: func() testdb.Mock {
   556  			return &automock.Converter{}
   557  		},
   558  		RepoConstructorFunc: fetchrequest.NewRepository,
   559  		MethodArgs:          []interface{}{model.DocumentFetchRequestReference, refID},
   560  		MethodName:          "DeleteByReferenceObjectIDGlobal",
   561  		IsDeleteMany:        true,
   562  		IsGlobal:            true,
   563  	}
   564  
   565  	apiFRSuite.Run(t)
   566  	eventFRSuite.Run(t)
   567  	docFRSuite.Run(t)
   568  }
   569  
   570  func TestRepository_ListByReferenceObjectIDs(t *testing.T) {
   571  	timestamp := time.Now()
   572  	firstFrID := "111111111-1111-1111-1111-111111111111"
   573  	firstRefID := "refID1"
   574  	secondFrID := "222222222-2222-2222-2222-222222222222"
   575  	secondRefID := "refID2"
   576  
   577  	firstAPIFRModel := fixFullFetchRequestModelWithRefID(firstFrID, timestamp, model.APISpecFetchRequestReference, firstRefID)
   578  	firstAPIFREntity := fixFullFetchRequestEntityWithRefID(t, firstFrID, timestamp, model.APISpecFetchRequestReference, firstRefID)
   579  	secondAPIFRModel := fixFullFetchRequestModelWithRefID(secondFrID, timestamp, model.APISpecFetchRequestReference, secondRefID)
   580  	secondAPIFREntity := fixFullFetchRequestEntityWithRefID(t, secondFrID, timestamp, model.APISpecFetchRequestReference, secondRefID)
   581  
   582  	apiFRSuite := testdb.RepoListTestSuite{
   583  		Name: "List API Fetch Requests by Object IDs",
   584  		SQLQueryDetails: []testdb.SQLQueryDetails{
   585  			{
   586  				Query:    regexp.QuoteMeta(`SELECT id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id FROM public.fetch_requests WHERE spec_id IN ($1, $2) AND (id IN (SELECT id FROM api_specifications_fetch_requests_tenants WHERE tenant_id = $3))`),
   587  				Args:     []driver.Value{firstRefID, secondRefID, tenantID},
   588  				IsSelect: true,
   589  				ValidRowsProvider: func() []*sqlmock.Rows {
   590  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns()).
   591  						AddRow(firstFrID, firstAPIFREntity.DocumentID, "foo.bar", firstAPIFREntity.Auth, firstAPIFREntity.Mode, firstAPIFREntity.Filter, firstAPIFREntity.StatusCondition, firstAPIFREntity.StatusMessage, firstAPIFREntity.StatusTimestamp, firstAPIFREntity.SpecID).
   592  						AddRow(secondFrID, secondAPIFREntity.DocumentID, "foo.bar", secondAPIFREntity.Auth, secondAPIFREntity.Mode, secondAPIFREntity.Filter, secondAPIFREntity.StatusCondition, secondAPIFREntity.StatusMessage, secondAPIFREntity.StatusTimestamp, secondAPIFREntity.SpecID),
   593  					}
   594  				},
   595  				InvalidRowsProvider: func() []*sqlmock.Rows {
   596  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns())}
   597  				},
   598  			},
   599  		},
   600  		ConverterMockProvider: func() testdb.Mock {
   601  			return &automock.Converter{}
   602  		},
   603  		AdditionalConverterArgs: []interface{}{model.APISpecFetchRequestReference},
   604  		RepoConstructorFunc:     fetchrequest.NewRepository,
   605  		ExpectedModelEntities:   []interface{}{firstAPIFRModel, secondAPIFRModel},
   606  		ExpectedDBEntities:      []interface{}{firstAPIFREntity, secondAPIFREntity},
   607  		MethodArgs:              []interface{}{tenantID, model.APISpecFetchRequestReference, []string{firstRefID, secondRefID}},
   608  		MethodName:              "ListByReferenceObjectIDs",
   609  		DisableEmptySliceTest:   true,
   610  	}
   611  
   612  	firstEventFRModel := fixFullFetchRequestModelWithRefID(firstFrID, timestamp, model.EventSpecFetchRequestReference, firstRefID)
   613  	firstEventFREntity := fixFullFetchRequestEntityWithRefID(t, firstFrID, timestamp, model.EventSpecFetchRequestReference, firstRefID)
   614  	secondEventFRModel := fixFullFetchRequestModelWithRefID(secondFrID, timestamp, model.EventSpecFetchRequestReference, secondRefID)
   615  	secondEventFREntity := fixFullFetchRequestEntityWithRefID(t, secondFrID, timestamp, model.EventSpecFetchRequestReference, secondRefID)
   616  
   617  	eventFRSuite := testdb.RepoListTestSuite{
   618  		Name: "List Event Fetch Requests by Object IDs",
   619  		SQLQueryDetails: []testdb.SQLQueryDetails{
   620  			{
   621  				Query:    regexp.QuoteMeta(`SELECT id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id FROM public.fetch_requests WHERE spec_id IN ($1, $2) AND (id IN (SELECT id FROM event_specifications_fetch_requests_tenants WHERE tenant_id = $3))`),
   622  				Args:     []driver.Value{firstRefID, secondRefID, tenantID},
   623  				IsSelect: true,
   624  				ValidRowsProvider: func() []*sqlmock.Rows {
   625  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns()).
   626  						AddRow(firstFrID, firstEventFREntity.DocumentID, "foo.bar", firstEventFREntity.Auth, firstEventFREntity.Mode, firstEventFREntity.Filter, firstEventFREntity.StatusCondition, firstEventFREntity.StatusMessage, firstEventFREntity.StatusTimestamp, firstEventFREntity.SpecID).
   627  						AddRow(secondFrID, secondEventFREntity.DocumentID, "foo.bar", secondEventFREntity.Auth, secondEventFREntity.Mode, secondEventFREntity.Filter, secondEventFREntity.StatusCondition, secondEventFREntity.StatusMessage, secondEventFREntity.StatusTimestamp, secondEventFREntity.SpecID),
   628  					}
   629  				},
   630  				InvalidRowsProvider: func() []*sqlmock.Rows {
   631  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns())}
   632  				},
   633  			},
   634  		},
   635  		ConverterMockProvider: func() testdb.Mock {
   636  			return &automock.Converter{}
   637  		},
   638  		AdditionalConverterArgs: []interface{}{model.EventSpecFetchRequestReference},
   639  		RepoConstructorFunc:     fetchrequest.NewRepository,
   640  		ExpectedModelEntities:   []interface{}{firstEventFRModel, secondEventFRModel},
   641  		ExpectedDBEntities:      []interface{}{firstEventFREntity, secondEventFREntity},
   642  		MethodArgs:              []interface{}{tenantID, model.EventSpecFetchRequestReference, []string{firstRefID, secondRefID}},
   643  		MethodName:              "ListByReferenceObjectIDs",
   644  		DisableEmptySliceTest:   true,
   645  	}
   646  
   647  	firstDocFRModel := fixFullFetchRequestModelWithRefID(firstFrID, timestamp, model.DocumentFetchRequestReference, firstRefID)
   648  	firstDocFREntity := fixFullFetchRequestEntityWithRefID(t, firstFrID, timestamp, model.DocumentFetchRequestReference, firstRefID)
   649  	secondDocFRModel := fixFullFetchRequestModelWithRefID(secondFrID, timestamp, model.DocumentFetchRequestReference, secondRefID)
   650  	secondDocFREntity := fixFullFetchRequestEntityWithRefID(t, secondFrID, timestamp, model.DocumentFetchRequestReference, secondRefID)
   651  
   652  	docFRSuite := testdb.RepoListTestSuite{
   653  		Name: "List Doc Fetch Requests by Object IDs",
   654  		SQLQueryDetails: []testdb.SQLQueryDetails{
   655  			{
   656  				Query:    regexp.QuoteMeta(`SELECT id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id FROM public.fetch_requests WHERE document_id IN ($1, $2) AND (id IN (SELECT id FROM document_fetch_requests_tenants WHERE tenant_id = $3))`),
   657  				Args:     []driver.Value{firstRefID, secondRefID, tenantID},
   658  				IsSelect: true,
   659  				ValidRowsProvider: func() []*sqlmock.Rows {
   660  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns()).
   661  						AddRow(firstFrID, firstDocFREntity.DocumentID, "foo.bar", firstDocFREntity.Auth, firstDocFREntity.Mode, firstDocFREntity.Filter, firstDocFREntity.StatusCondition, firstDocFREntity.StatusMessage, firstDocFREntity.StatusTimestamp, firstDocFREntity.SpecID).
   662  						AddRow(secondFrID, secondDocFREntity.DocumentID, "foo.bar", secondDocFREntity.Auth, secondDocFREntity.Mode, secondDocFREntity.Filter, secondDocFREntity.StatusCondition, secondDocFREntity.StatusMessage, secondDocFREntity.StatusTimestamp, secondDocFREntity.SpecID),
   663  					}
   664  				},
   665  				InvalidRowsProvider: func() []*sqlmock.Rows {
   666  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns())}
   667  				},
   668  			},
   669  		},
   670  		ConverterMockProvider: func() testdb.Mock {
   671  			return &automock.Converter{}
   672  		},
   673  		AdditionalConverterArgs: []interface{}{model.DocumentFetchRequestReference},
   674  		RepoConstructorFunc:     fetchrequest.NewRepository,
   675  		ExpectedModelEntities:   []interface{}{firstDocFRModel, secondDocFRModel},
   676  		ExpectedDBEntities:      []interface{}{firstDocFREntity, secondDocFREntity},
   677  		MethodArgs:              []interface{}{tenantID, model.DocumentFetchRequestReference, []string{firstRefID, secondRefID}},
   678  		MethodName:              "ListByReferenceObjectIDs",
   679  		DisableEmptySliceTest:   true,
   680  	}
   681  
   682  	apiFRSuite.Run(t)
   683  	eventFRSuite.Run(t)
   684  	docFRSuite.Run(t)
   685  }
   686  
   687  func TestRepository_ListByReferenceObjectIDsGlobal(t *testing.T) {
   688  	timestamp := time.Now()
   689  	firstFrID := "111111111-1111-1111-1111-111111111111"
   690  	firstRefID := "refID1"
   691  	secondFrID := "222222222-2222-2222-2222-222222222222"
   692  	secondRefID := "refID2"
   693  
   694  	firstAPIFRModel := fixFullFetchRequestModelWithRefID(firstFrID, timestamp, model.APISpecFetchRequestReference, firstRefID)
   695  	firstAPIFREntity := fixFullFetchRequestEntityWithRefID(t, firstFrID, timestamp, model.APISpecFetchRequestReference, firstRefID)
   696  	secondAPIFRModel := fixFullFetchRequestModelWithRefID(secondFrID, timestamp, model.APISpecFetchRequestReference, secondRefID)
   697  	secondAPIFREntity := fixFullFetchRequestEntityWithRefID(t, secondFrID, timestamp, model.APISpecFetchRequestReference, secondRefID)
   698  
   699  	apiFRSuite := testdb.RepoListTestSuite{
   700  		Name: "List API Fetch Requests by Object IDs Global",
   701  		SQLQueryDetails: []testdb.SQLQueryDetails{
   702  			{
   703  				Query:    regexp.QuoteMeta(`SELECT id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id FROM public.fetch_requests WHERE spec_id IN ($1, $2)`),
   704  				Args:     []driver.Value{firstRefID, secondRefID},
   705  				IsSelect: true,
   706  				ValidRowsProvider: func() []*sqlmock.Rows {
   707  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns()).
   708  						AddRow(firstFrID, firstAPIFREntity.DocumentID, "foo.bar", firstAPIFREntity.Auth, firstAPIFREntity.Mode, firstAPIFREntity.Filter, firstAPIFREntity.StatusCondition, firstAPIFREntity.StatusMessage, firstAPIFREntity.StatusTimestamp, firstAPIFREntity.SpecID).
   709  						AddRow(secondFrID, secondAPIFREntity.DocumentID, "foo.bar", secondAPIFREntity.Auth, secondAPIFREntity.Mode, secondAPIFREntity.Filter, secondAPIFREntity.StatusCondition, secondAPIFREntity.StatusMessage, secondAPIFREntity.StatusTimestamp, secondAPIFREntity.SpecID),
   710  					}
   711  				},
   712  				InvalidRowsProvider: func() []*sqlmock.Rows {
   713  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns())}
   714  				},
   715  			},
   716  		},
   717  		ConverterMockProvider: func() testdb.Mock {
   718  			return &automock.Converter{}
   719  		},
   720  		AdditionalConverterArgs: []interface{}{model.APISpecFetchRequestReference},
   721  		RepoConstructorFunc:     fetchrequest.NewRepository,
   722  		ExpectedModelEntities:   []interface{}{firstAPIFRModel, secondAPIFRModel},
   723  		ExpectedDBEntities:      []interface{}{firstAPIFREntity, secondAPIFREntity},
   724  		MethodArgs:              []interface{}{model.APISpecFetchRequestReference, []string{firstRefID, secondRefID}},
   725  		MethodName:              "ListByReferenceObjectIDsGlobal",
   726  		DisableEmptySliceTest:   true,
   727  	}
   728  
   729  	firstEventFRModel := fixFullFetchRequestModelWithRefID(firstFrID, timestamp, model.EventSpecFetchRequestReference, firstRefID)
   730  	firstEventFREntity := fixFullFetchRequestEntityWithRefID(t, firstFrID, timestamp, model.EventSpecFetchRequestReference, firstRefID)
   731  	secondEventFRModel := fixFullFetchRequestModelWithRefID(secondFrID, timestamp, model.EventSpecFetchRequestReference, secondRefID)
   732  	secondEventFREntity := fixFullFetchRequestEntityWithRefID(t, secondFrID, timestamp, model.EventSpecFetchRequestReference, secondRefID)
   733  
   734  	eventFRSuite := testdb.RepoListTestSuite{
   735  		Name: "List Event Fetch Requests by Object IDs Global",
   736  		SQLQueryDetails: []testdb.SQLQueryDetails{
   737  			{
   738  				Query:    regexp.QuoteMeta(`SELECT id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id FROM public.fetch_requests WHERE spec_id IN ($1, $2)`),
   739  				Args:     []driver.Value{firstRefID, secondRefID},
   740  				IsSelect: true,
   741  				ValidRowsProvider: func() []*sqlmock.Rows {
   742  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns()).
   743  						AddRow(firstFrID, firstEventFREntity.DocumentID, "foo.bar", firstEventFREntity.Auth, firstEventFREntity.Mode, firstEventFREntity.Filter, firstEventFREntity.StatusCondition, firstEventFREntity.StatusMessage, firstEventFREntity.StatusTimestamp, firstEventFREntity.SpecID).
   744  						AddRow(secondFrID, secondEventFREntity.DocumentID, "foo.bar", secondEventFREntity.Auth, secondEventFREntity.Mode, secondEventFREntity.Filter, secondEventFREntity.StatusCondition, secondEventFREntity.StatusMessage, secondEventFREntity.StatusTimestamp, secondEventFREntity.SpecID),
   745  					}
   746  				},
   747  				InvalidRowsProvider: func() []*sqlmock.Rows {
   748  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns())}
   749  				},
   750  			},
   751  		},
   752  		ConverterMockProvider: func() testdb.Mock {
   753  			return &automock.Converter{}
   754  		},
   755  		AdditionalConverterArgs: []interface{}{model.EventSpecFetchRequestReference},
   756  		RepoConstructorFunc:     fetchrequest.NewRepository,
   757  		ExpectedModelEntities:   []interface{}{firstEventFRModel, secondEventFRModel},
   758  		ExpectedDBEntities:      []interface{}{firstEventFREntity, secondEventFREntity},
   759  		MethodArgs:              []interface{}{model.EventSpecFetchRequestReference, []string{firstRefID, secondRefID}},
   760  		MethodName:              "ListByReferenceObjectIDsGlobal",
   761  		DisableEmptySliceTest:   true,
   762  	}
   763  
   764  	firstDocFRModel := fixFullFetchRequestModelWithRefID(firstFrID, timestamp, model.DocumentFetchRequestReference, firstRefID)
   765  	firstDocFREntity := fixFullFetchRequestEntityWithRefID(t, firstFrID, timestamp, model.DocumentFetchRequestReference, firstRefID)
   766  	secondDocFRModel := fixFullFetchRequestModelWithRefID(secondFrID, timestamp, model.DocumentFetchRequestReference, secondRefID)
   767  	secondDocFREntity := fixFullFetchRequestEntityWithRefID(t, secondFrID, timestamp, model.DocumentFetchRequestReference, secondRefID)
   768  
   769  	docFRSuite := testdb.RepoListTestSuite{
   770  		Name: "List Doc Fetch Requests by Object IDs Global",
   771  		SQLQueryDetails: []testdb.SQLQueryDetails{
   772  			{
   773  				Query:    regexp.QuoteMeta(`SELECT id, document_id, url, auth, mode, filter, status_condition, status_message, status_timestamp, spec_id FROM public.fetch_requests WHERE document_id IN ($1, $2)`),
   774  				Args:     []driver.Value{firstRefID, secondRefID},
   775  				IsSelect: true,
   776  				ValidRowsProvider: func() []*sqlmock.Rows {
   777  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns()).
   778  						AddRow(firstFrID, firstDocFREntity.DocumentID, "foo.bar", firstDocFREntity.Auth, firstDocFREntity.Mode, firstDocFREntity.Filter, firstDocFREntity.StatusCondition, firstDocFREntity.StatusMessage, firstDocFREntity.StatusTimestamp, firstDocFREntity.SpecID).
   779  						AddRow(secondFrID, secondDocFREntity.DocumentID, "foo.bar", secondDocFREntity.Auth, secondDocFREntity.Mode, secondDocFREntity.Filter, secondDocFREntity.StatusCondition, secondDocFREntity.StatusMessage, secondDocFREntity.StatusTimestamp, secondDocFREntity.SpecID),
   780  					}
   781  				},
   782  				InvalidRowsProvider: func() []*sqlmock.Rows {
   783  					return []*sqlmock.Rows{sqlmock.NewRows(fixColumns())}
   784  				},
   785  			},
   786  		},
   787  		ConverterMockProvider: func() testdb.Mock {
   788  			return &automock.Converter{}
   789  		},
   790  		AdditionalConverterArgs: []interface{}{model.DocumentFetchRequestReference},
   791  		RepoConstructorFunc:     fetchrequest.NewRepository,
   792  		ExpectedModelEntities:   []interface{}{firstDocFRModel, secondDocFRModel},
   793  		ExpectedDBEntities:      []interface{}{firstDocFREntity, secondDocFREntity},
   794  		MethodArgs:              []interface{}{model.DocumentFetchRequestReference, []string{firstRefID, secondRefID}},
   795  		MethodName:              "ListByReferenceObjectIDsGlobal",
   796  		DisableEmptySliceTest:   true,
   797  	}
   798  
   799  	apiFRSuite.Run(t)
   800  	eventFRSuite.Run(t)
   801  	docFRSuite.Run(t)
   802  }
   803  
   804  func givenID() string {
   805  	return "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
   806  }