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 }