package document_test import ( "context" "errors" "queryorchestration/internal/database" "queryorchestration/internal/database/repository" "queryorchestration/internal/job/collector" "queryorchestration/internal/query/document" "testing" "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" "github.com/pashagolub/pgxmock/v3" "github.com/stretchr/testify/assert" ) func TestSyncIsSynced(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() if err != nil { t.Fatalf("failed to open pgxmock database: %v", err) } queries := repository.New(pool) db := &database.Connection{ Queries: queries, Pool: pool, } doc := document.Document{ ID: uuid.New(), JobID: uuid.New(), Name: "document_name", } queryVersion := int32(1) coll := collector.Collector{ ID: uuid.New(), JobID: doc.JobID, MinCleanVersion: int32(1), MinTextVersion: int32(2), } pool.ExpectQuery("name: GetCollectorByJobID :one").WithArgs(database.MustToDBUUID(doc.JobID)). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion", "activeVersion", "latestVersion", "fields"}). AddRow(database.MustToDBUUID(coll.ID), database.MustToDBUUID(coll.JobID), &coll.MinCleanVersion, &coll.MinTextVersion, int32(1), int32(2), []byte("")), ) pool.ExpectQuery("name: ListResultsByDocumentID :many").WithArgs(database.MustToDBUUID(doc.ID), coll.MinCleanVersion, coll.MinTextVersion). WillReturnRows( pgxmock.NewRows([]string{"id", "queryId", "queryVersion"}). AddRow(pgtype.UUID{}, pgtype.UUID{}, queryVersion), ) pool.ExpectQuery("name: ListCollectorQueries :many").WithArgs(database.MustToDBUUID(coll.ID)). WillReturnRows( pgxmock.NewRows([]string{"collectorId", "queryId", "type", "queryVersion", "requiredIds"}). AddRow(database.MustToDBUUID(coll.ID), pgtype.UUID{}, repository.QuerytypeJsonExtractor, queryVersion, []pgtype.UUID{}), ) docSvc := document.New(db, &document.Services{ Collector: collector.New(db, &collector.Services{}), }) err = docSvc.Sync(ctx, &doc) assert.Nil(t, err) } func TestSyncDBFail(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() if err != nil { t.Fatalf("failed to open pgxmock database: %v", err) } queries := repository.New(pool) db := &database.Connection{ Queries: queries, Pool: pool, } doc := document.Document{ ID: uuid.New(), JobID: uuid.New(), Name: "document_name", } dbCollectorId := database.MustToDBUUID(uuid.New()) dbJobID := database.MustToDBUUID(doc.JobID) dbQueryID := database.MustToDBUUID(uuid.New()) minCleanVersion := int32(1) minTextVersion := int32(1) pool.ExpectQuery("name: GetCollectorByJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion", "activeVersion", "latestVersion", "fields"}), ) docSvc := document.New(db, &document.Services{ Collector: collector.New(db, &collector.Services{}), }) err = docSvc.Sync(ctx, &doc) assert.EqualError(t, err, "no rows in result set") pool.ExpectQuery("name: GetCollectorByJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion", "activeVersion", "latestVersion", "fields"}). AddRow(dbCollectorId, dbJobID, &minCleanVersion, &minTextVersion, int32(1), int32(2), []byte("")), ) dbErr := "database failure" pool.ExpectQuery("name: ListResultsByDocumentID :many").WithArgs(database.MustToDBUUID(doc.ID), minCleanVersion, minTextVersion). WillReturnError(errors.New(dbErr)) docSvc = document.New(db, &document.Services{ Collector: collector.New(db, &collector.Services{}), }) err = docSvc.Sync(ctx, &doc) assert.EqualError(t, err, dbErr) pool.ExpectQuery("name: GetCollectorByJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion", "activeVersion", "latestVersion", "fields"}). AddRow(dbCollectorId, dbJobID, &minCleanVersion, &minTextVersion, int32(1), int32(2), []byte("")), ) pool.ExpectQuery("name: ListResultsByDocumentID :many").WithArgs(database.MustToDBUUID(doc.ID), minCleanVersion, minTextVersion). WillReturnRows( pgxmock.NewRows([]string{"id", "queryId", "queryVersion"}), ) dbErr = "database failure" pool.ExpectQuery("name: ListCollectorQueries :many").WithArgs(dbCollectorId). WillReturnError(errors.New(dbErr)) docSvc = document.New(db, &document.Services{ Collector: collector.New(db, &collector.Services{}), }) err = docSvc.Sync(ctx, &doc) assert.EqualError(t, err, dbErr) pool.ExpectQuery("name: GetCollectorByJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion", "activeVersion", "latestVersion", "fields"}). AddRow(dbCollectorId, dbJobID, &minCleanVersion, &minTextVersion, int32(1), int32(2), []byte("")), ) qV := int32(1) reqID := database.MustToDBUUID(uuid.New()) resID := database.MustToDBUUID(uuid.New()) pool.ExpectQuery("name: ListResultsByDocumentID :many").WithArgs(database.MustToDBUUID(doc.ID), minCleanVersion, minTextVersion). WillReturnRows( pgxmock.NewRows([]string{"id", "queryId", "queryVersion"}). AddRow(resID, reqID, qV), ) dbErr = "database failure" pool.ExpectQuery("name: ListCollectorQueries :many").WithArgs(dbCollectorId). WillReturnRows( pgxmock.NewRows([]string{"collectorId", "queryId", "type", "queryVersion", "requiredIds"}). AddRow(dbCollectorId, dbQueryID, repository.QuerytypeJsonExtractor, qV, []pgtype.UUID{reqID}). AddRow(dbCollectorId, reqID, repository.QuerytypeContextFull, qV, []pgtype.UUID{}), ) pool.ExpectQuery("name: ListResultValuesByID :many").WithArgs([]pgtype.UUID{resID}). WillReturnError(errors.New(dbErr)) docSvc = document.New(db, &document.Services{ Collector: collector.New(db, &collector.Services{}), }) err = docSvc.Sync(ctx, &doc) assert.EqualError(t, err, dbErr) } func TestSync(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() if err != nil { t.Fatalf("failed to open pgxmock database: %v", err) } queries := repository.New(pool) db := &database.Connection{ Queries: queries, Pool: pool, } doc := document.Document{ ID: uuid.New(), JobID: uuid.New(), Name: "document_name", } dbCollectorId := database.MustToDBUUID(uuid.New()) dbJobID := database.MustToDBUUID(doc.JobID) dbQueryID := database.MustToDBUUID(uuid.New()) minCleanVersion := int32(1) minTextVersion := int32(1) pool.ExpectQuery("name: GetCollectorByJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion", "activeVersion", "latestVersion", "fields"}). AddRow(dbCollectorId, dbJobID, &minCleanVersion, &minTextVersion, int32(1), int32(2), []byte("")), ) pool.ExpectQuery("name: ListResultsByDocumentID :many").WithArgs(database.MustToDBUUID(doc.ID), minCleanVersion, minTextVersion). WillReturnRows( pgxmock.NewRows([]string{"id", "queryId", "queryVersion"}), ) qV := int32(1) pool.ExpectQuery("name: ListCollectorQueries :many").WithArgs(dbCollectorId). WillReturnRows( pgxmock.NewRows([]string{"collectorId", "queryId", "type", "queryVersion", "requiredIds"}). AddRow(dbCollectorId, dbQueryID, repository.QuerytypeJsonExtractor, qV, []pgtype.UUID{}), ) pool.ExpectQuery("name: ListResultValuesByID :many").WithArgs([]pgtype.UUID{}). WillReturnRows( pgxmock.NewRows([]string{"id", "queryId", "value"}), ) docSvc := document.New(db, &document.Services{ Collector: collector.New(db, &collector.Services{}), }) err = docSvc.Sync(ctx, &doc) assert.EqualError(t, err, "JSON Extraction requires 1 result") }