package document_test import ( "context" "errors" "queryorchestration/internal/database" "queryorchestration/internal/database/repository" "queryorchestration/internal/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", } dbCollectorId := database.MustToDBUUID(uuid.New()) dbJobID := database.MustToDBUUID(doc.JobID) minCleanVersion := int32(1) minTextVersion := int32(1) pool.ExpectQuery("name: GetCollectorFromJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion"}). AddRow(dbCollectorId, dbJobID, minCleanVersion, minTextVersion), ) pool.ExpectQuery("name: ListResultsByDocumentID :many").WithArgs(database.MustToDBUUID(doc.ID), minCleanVersion, minTextVersion). WillReturnRows( pgxmock.NewRows([]string{"id", "queryId", "queryVersion"}). AddRow(pgtype.UUID{}, pgtype.UUID{}, int32(1)), ) pool.ExpectQuery("name: GetCollectorQueries :many").WithArgs(dbCollectorId). WillReturnRows( pgxmock.NewRows([]string{"collectorId", "queryId", "type", "queryVersion", "requiredIds"}). AddRow(dbCollectorId, pgtype.UUID{}, repository.NullQuerytype{Querytype: repository.QuerytypeJsonExtractor, Valid: true}, pgtype.Int4{Int32: int32(1), Valid: true}, []pgtype.UUID{}), ) docSvc := document.New(db) 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: GetCollectorFromJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion"}), ) docSvc := document.New(db) err = docSvc.Sync(ctx, &doc) assert.EqualError(t, err, "no rows in result set") pool.ExpectQuery("name: GetCollectorFromJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion"}). AddRow(dbCollectorId, dbJobID, minCleanVersion, minTextVersion), ) dbErr := "database failure" pool.ExpectQuery("name: ListResultsByDocumentID :many").WithArgs(database.MustToDBUUID(doc.ID), minCleanVersion, minTextVersion). WillReturnError(errors.New(dbErr)) docSvc = document.New(db) err = docSvc.Sync(ctx, &doc) assert.EqualError(t, err, dbErr) pool.ExpectQuery("name: GetCollectorFromJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion"}). AddRow(dbCollectorId, dbJobID, minCleanVersion, minTextVersion), ) 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: GetCollectorQueries :many").WithArgs(dbCollectorId). WillReturnError(errors.New(dbErr)) docSvc = document.New(db) err = docSvc.Sync(ctx, &doc) assert.EqualError(t, err, dbErr) pool.ExpectQuery("name: GetCollectorFromJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion"}). AddRow(dbCollectorId, dbJobID, minCleanVersion, minTextVersion), ) 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: GetCollectorQueries :many").WithArgs(dbCollectorId). WillReturnRows( pgxmock.NewRows([]string{"collectorId", "queryId", "type", "queryVersion", "requiredIds"}). AddRow(dbCollectorId, dbQueryID, repository.NullQuerytype{Querytype: repository.QuerytypeJsonExtractor, Valid: true}, pgtype.Int4{Int32: int32(1), Valid: true}, []pgtype.UUID{}), ) pool.ExpectQuery("name: ListResultValuesByID :many").WithArgs([]pgtype.UUID{}). WillReturnError(errors.New(dbErr)) docSvc = document.New(db) 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: GetCollectorFromJobID :one").WithArgs(dbJobID). WillReturnRows( pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion"}). AddRow(dbCollectorId, dbJobID, minCleanVersion, minTextVersion), ) pool.ExpectQuery("name: ListResultsByDocumentID :many").WithArgs(database.MustToDBUUID(doc.ID), minCleanVersion, minTextVersion). WillReturnRows( pgxmock.NewRows([]string{"id", "queryId", "queryVersion"}), ) pool.ExpectQuery("name: GetCollectorQueries :many").WithArgs(dbCollectorId). WillReturnRows( pgxmock.NewRows([]string{"collectorId", "queryId", "type", "queryVersion", "requiredIds"}). AddRow(dbCollectorId, dbQueryID, repository.NullQuerytype{Querytype: repository.QuerytypeJsonExtractor, Valid: true}, pgtype.Int4{Int32: int32(1), Valid: true}, []pgtype.UUID{}), ) pool.ExpectQuery("name: ListResultValuesByID :many").WithArgs([]pgtype.UUID{}). WillReturnRows( pgxmock.NewRows([]string{"id", "queryId", "value"}), ) docSvc := document.New(db) err = docSvc.Sync(ctx, &doc) assert.EqualError(t, err, "JSON Extraction requires 1 result") }