package doctextrunner_test import ( "context" "testing" doctextrunner "queryorchestration/api/docTextRunner" "queryorchestration/internal/database/repository" "queryorchestration/internal/document" documenttext "queryorchestration/internal/document/text" "queryorchestration/internal/server/runner" "queryorchestration/internal/serviceconfig/aws" "queryorchestration/internal/serviceconfig/objectstore" "queryorchestration/internal/serviceconfig/queue/querysync" "queryorchestration/internal/serviceconfig/textract" objectstoremock "queryorchestration/mocks/objectstore" queuemock "queryorchestration/mocks/queue" textractmock "queryorchestration/mocks/textract" awstextract "github.com/aws/aws-sdk-go-v2/service/textract" "github.com/go-playground/validator/v10" "github.com/google/uuid" "github.com/pashagolub/pgxmock/v3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ) type DocTextConfig struct { runner.BaseConfig[doctextrunner.Body] aws.AWSConfig querysync.QuerySyncConfig textract.TextractConfig objectstore.ObjectStoreConfig } func TestDocCleanRunner(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() require.NoError(t, err) cfg := &DocTextConfig{} cfg.DBPool = pool cfg.DBQueries = repository.New(pool) mockSQS := queuemock.NewMockSQSClient(t) cfg.QueueClient = mockSQS cfg.QuerySyncURL = "/i/am/here" mockS3 := objectstoremock.NewMockS3Client(t) cfg.StoreClient = mockS3 mockTextract := textractmock.NewMockTextractClient(t) cfg.TextractClient = mockTextract runner := doctextrunner.New(validator.New(), &doctextrunner.Services{ Text: documenttext.New(cfg), }) assert.NotNil(t, runner) t.Run("valid", func(t *testing.T) { doc := doctextrunner.Body{ DocumentID: uuid.New(), } cleanId := uuid.New() inloc := document.Location{ Bucket: "bucket_name", Key: "/i/am/here", } hash := "example" pool.ExpectQuery("name: IsDocumentTextExtracted :one").WithArgs(doc.DocumentID).WillReturnRows( pgxmock.NewRows([]string{"isextracted"}). AddRow(false), ) mimeType := "application/pdf" dbmimetype := repository.NullCleanmimetype{ Valid: true, Cleanmimetype: repository.Cleanmimetype(mimeType), } pool.ExpectQuery("name: GetCleanEntryByDocId :one").WithArgs(doc.DocumentID).WillReturnRows( pgxmock.NewRows([]string{"id", "documentId", "bucket", "key", "version", "hash", "mimetype", "fail", "externalClientId"}). AddRow(cleanId, doc.DocumentID, &inloc.Bucket, &inloc.Key, int64(1), &hash, dbmimetype, repository.NullCleanfailtype{}, "clientId"), ) jobId := "hello" triggerId := uuid.New() pool.ExpectBegin() pool.ExpectQuery("name: AddDocumentTextTrigger :one").WithArgs(cleanId, pgxmock.AnyArg()).WillReturnRows( pgxmock.NewRows([]string{"id"}).AddRow(triggerId), ) mockTextract.EXPECT(). StartDocumentTextDetection( mock.Anything, mock.MatchedBy(func(in *awstextract.StartDocumentTextDetectionInput) bool { return true }), mock.Anything, ). Return(&awstextract.StartDocumentTextDetectionOutput{ JobId: &jobId, }, nil) pool.ExpectExec("name: AddDocumentTextTriggerJobId :exec").WithArgs(&jobId, triggerId). WillReturnResult(pgxmock.NewResult("", 1)) pool.ExpectCommit() assert.True(t, runner.Process(ctx, doc)) }) }