package result import ( "context" "queryorchestration/internal/database" "queryorchestration/internal/database/repository" "queryorchestration/internal/query" resultprocessor "queryorchestration/internal/query/result/processor" jsonextractor "queryorchestration/internal/query/types/jsonExtractor" "queryorchestration/internal/serviceconfig" "testing" "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" "github.com/pashagolub/pgxmock/v3" "github.com/stretchr/testify/assert" ) func TestProcess(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() if err != nil { t.Fatalf("failed to open pgxmock database: %v", err) } cfg := &serviceconfig.BaseConfig{} cfg.DBPool = pool cfg.DBQueries = repository.New(pool) svc := Service{ cfg: cfg, svc: &Services{ Query: query.New(cfg), }, } qcfg := "{\"path\":\"examplekey\"}" query := &resultprocessor.Query{ ID: uuid.New(), Version: 2, RequiredQueryIDs: &[]uuid.UUID{uuid.New()}, Config: &qcfg, } params := Process{ DocumentID: uuid.New(), QueryID: query.ID, QueryVersion: query.Version, } pool.ExpectQuery("name: GetQueryWithVersion :one").WithArgs(database.MustToDBUUID(query.ID), query.Version).WillReturnRows( pgxmock.NewRows([]string{"id", "type", "activeVersion", "latestVersion", "config", "requiredIds"}). AddRow(database.MustToDBUUID(query.ID), repository.QuerytypeJsonExtractor, query.Version, query.Version, []byte(*query.Config), database.MustToDBUUIDArray(*query.RequiredQueryIDs)), ) pool.ExpectQuery("name: ListQueryRequirementValues :many").WithArgs(database.MustToDBUUID(params.DocumentID), database.MustToDBUUID(query.ID), query.Version). WillReturnRows( pgxmock.NewRows([]string{"queryId", "type", "value"}). AddRow(database.MustToDBUUID(query.ID), repository.QuerytypeContextFull, "{\"examplekey\":\"example_value\"}"), ) pool.ExpectQuery("name: GetQueryConfig :one").WithArgs(database.MustToDBUUID(query.ID), query.Version).WillReturnRows( pgxmock.NewRows([]string{"id", "config"}). AddRow(pgtype.UUID{}, []byte(qcfg)), ) val, err := svc.Process(ctx, ¶ms) assert.NoError(t, err) assert.NotNil(t, val) assert.Equal(t, "example_value", val.GetStoreValue()) } func TestListRequiredValue(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() if err != nil { t.Fatalf("failed to open pgxmock database: %v", err) } cfg := &serviceconfig.BaseConfig{} cfg.DBPool = pool cfg.DBQueries = repository.New(pool) svc := Service{ cfg: cfg, } pr, err := svc.listRequiredValues(ctx, nil, nil) assert.NoError(t, err) assert.Nil(t, pr) pr, err = svc.listRequiredValues(ctx, &Process{}, &resultprocessor.Query{}) assert.NoError(t, err) assert.Nil(t, pr) pr, err = svc.listRequiredValues(ctx, &Process{}, &resultprocessor.Query{ RequiredQueryIDs: &[]uuid.UUID{}, }, ) assert.NoError(t, err) assert.Nil(t, pr) query := &resultprocessor.Query{ ID: uuid.New(), Version: 2, RequiredQueryIDs: &[]uuid.UUID{uuid.New()}, } params := Process{ DocumentID: uuid.New(), QueryID: query.ID, QueryVersion: query.Version, } pool.ExpectQuery("name: ListQueryRequirementValues :many").WithArgs(database.MustToDBUUID(params.DocumentID), database.MustToDBUUID(query.ID), query.Version). WillReturnRows( pgxmock.NewRows([]string{"queryId", "type", "value"}). AddRow(database.MustToDBUUID((*query.RequiredQueryIDs)[0]), repository.QuerytypeJsonExtractor, "example_value"), ) pr, err = svc.listRequiredValues(ctx, ¶ms, query) assert.NoError(t, err) assert.ElementsMatch(t, []resultprocessor.Value{ jsonextractor.NewResult("example_value"), }, *pr) } func TestGetProcessor(t *testing.T) { svc := Service{} pr, err := svc.getProcessor(resultprocessor.TypeJsonExtractor) assert.NoError(t, err) assert.NotNil(t, pr) pr, err = svc.getProcessor(resultprocessor.TypeContextFull) assert.NoError(t, err) assert.NotNil(t, pr) _, err = svc.getProcessor(resultprocessor.Type(-1)) assert.Error(t, err) } func TestParseQueryRequirementValueArray(t *testing.T) { in := []*repository.ListQueryRequirementValuesRow{ { Queryid: database.MustToDBUUID(uuid.New()), Value: "example_value", Type: repository.QuerytypeJsonExtractor, }, } out, err := parseQueryRequirementValueArray(in) assert.NoError(t, err) assert.ElementsMatch(t, []resultprocessor.Value{ jsonextractor.NewResult("example_value"), }, *out) }