Files
query-orchestration/internal/query/queue/execute_test.go
T

180 lines
8.2 KiB
Go
Raw Normal View History

2025-01-07 16:30:45 +00:00
package queryqueue_test
2024-12-20 17:35:33 +00:00
import (
"context"
2024-12-24 17:13:48 +00:00
"fmt"
"queryorchestration/internal/database"
"queryorchestration/internal/database/repository"
"queryorchestration/internal/job/collector"
queryprocessor "queryorchestration/internal/query/processor"
queryqueue "queryorchestration/internal/query/queue"
"queryorchestration/internal/query/result"
2024-12-20 17:35:33 +00:00
"testing"
"github.com/google/uuid"
"github.com/jackc/pgx/v5/pgtype"
"github.com/pashagolub/pgxmock/v3"
"github.com/stretchr/testify/assert"
)
func TestExecute(t *testing.T) {
2024-12-20 17:35:33 +00:00
ctx := context.Background()
2025-01-06 13:30:20 +00:00
pool, err := pgxmock.NewPool()
2024-12-20 17:35:33 +00:00
if err != nil {
t.Fatalf("failed to open pgxmock database: %v", err)
}
2025-01-06 13:30:20 +00:00
queries := repository.New(pool)
db := &database.Connection{
Queries: queries,
Pool: pool,
}
2024-12-20 17:35:33 +00:00
jobID := uuid.New()
dbJobID := database.MustToDBUUID(jobID)
collectorID := uuid.New()
dbCollectorID := database.MustToDBUUID(collectorID)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: GetCollectorFromJobID :one").WithArgs(dbJobID).
2024-12-20 17:35:33 +00:00
WillReturnRows(
pgxmock.NewRows([]string{"id", "jobId", "minCleanVersion", "minTextVersion"}).
AddRow(dbCollectorID, dbJobID, int32(1), int32(1)),
)
2025-01-06 13:30:20 +00:00
coll, err := collector.NewByJobId(ctx, db, jobID)
2024-12-20 17:35:33 +00:00
assert.Nil(t, err)
queryOneID := uuid.New()
queryOneVersion := int32(1)
queryTwoID := uuid.New()
queryTwoVersion := int32(2)
queryThreeID := uuid.New()
queryThreeVersion := int32(3)
queryFourID := uuid.New()
queryFourVersion := int32(4)
queryFiveID := uuid.New()
queryFiveVersion := int32(5)
querySixID := uuid.New()
querySixVersion := int32(6)
2024-12-24 17:13:48 +00:00
contextID := uuid.New()
contextVersion := int32(1)
2025-01-03 13:41:07 +00:00
collectorQueries := []queryprocessor.Query{
{ID: contextID, Type: queryprocessor.TypeContextFull, RequiredQueryIDs: []uuid.UUID{}, Version: contextVersion},
{ID: queryOneID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{contextID}, Version: queryOneVersion},
{ID: queryTwoID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{queryOneID}, Version: queryTwoVersion},
{ID: queryThreeID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{queryOneID}, Version: queryThreeVersion},
{ID: queryFourID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{contextID}, Version: queryFourVersion},
{ID: queryFiveID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{querySixID}, Version: queryFiveVersion},
{ID: querySixID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{contextID}, Version: querySixVersion},
2024-12-20 17:35:33 +00:00
}
2025-01-03 13:41:07 +00:00
rows := pgxmock.NewRows([]string{"collectorId", "queryId", "type", "queryVersion", "requiredIds"})
2024-12-20 17:35:33 +00:00
for _, q := range collectorQueries {
dbID := database.MustToDBUUID(q.ID)
dbReqIDs := database.MustToDBUUIDArray(q.RequiredQueryIDs)
2025-01-06 13:30:20 +00:00
ty, err := queryprocessor.ToDBNullQueryType(q.Type)
2024-12-24 12:47:40 +00:00
assert.Nil(t, err)
2024-12-20 17:35:33 +00:00
rows = rows.
AddRow(dbCollectorID, dbID, ty, &q.Version, dbReqIDs)
2024-12-20 17:35:33 +00:00
}
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: GetCollectorQueries :many").WithArgs(dbCollectorID).WillReturnRows(rows)
2024-12-20 17:35:33 +00:00
2024-12-24 17:13:48 +00:00
contextResultID := uuid.New()
2025-01-06 15:31:39 +00:00
results := []*result.Result{
2024-12-24 17:13:48 +00:00
{ID: contextResultID, QueryID: contextID, QueryVersion: contextVersion},
2024-12-20 17:35:33 +00:00
{ID: uuid.New(), QueryID: queryFourID, QueryVersion: queryFourVersion},
{ID: uuid.New(), QueryID: querySixID, QueryVersion: querySixVersion - 1},
{ID: uuid.New(), QueryID: queryOneID, QueryVersion: queryOneVersion - 1},
}
2025-01-06 15:31:39 +00:00
expectedQueries := []*queryprocessor.Query{
2025-01-03 13:41:07 +00:00
{ID: querySixID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{contextID}, Version: querySixVersion},
{ID: queryFiveID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{querySixID}, Version: queryFiveVersion},
{ID: queryOneID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{contextID}, Version: queryOneVersion},
{ID: queryThreeID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{queryOneID}, Version: queryThreeVersion},
{ID: queryTwoID, Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: []uuid.UUID{queryOneID}, Version: queryTwoVersion},
2024-12-20 17:35:33 +00:00
}
docID := uuid.New()
cleanVersion := int32(1)
textVersion := int32(1)
2025-01-07 16:30:45 +00:00
q, err := queryqueue.New(ctx, db, coll, results, docID, cleanVersion, textVersion)
2024-12-20 17:35:33 +00:00
assert.Nil(t, err)
assert.Equal(t, expectedQueries, q.GetQueue())
2024-12-24 17:13:48 +00:00
keyLayerOne := "key"
keyLayerTwo := "key5"
valueLayerTwo := "value"
valueLayerOne := fmt.Sprintf("{\"%s\":\"%s\"}", keyLayerTwo, valueLayerTwo)
valueContext := fmt.Sprintf("{\"%s\":%s}", keyLayerOne, valueLayerOne)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: ListResultValuesByID :many").WithArgs([]pgtype.UUID{database.MustToDBUUID(contextResultID)}).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "queryId", "value"}).
AddRow(database.MustToDBUUID(contextResultID), database.MustToDBUUID(contextID), valueContext),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: GetQueryConfig :one").WithArgs(database.MustToDBUUID(querySixID), querySixVersion).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "config"}).
AddRow(pgtype.UUID{}, []byte(fmt.Sprintf("{\"path\":\"%s\"}", keyLayerOne))),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: SetResult :one").WithArgs(database.MustToDBUUID(querySixID), database.MustToDBUUID(docID), valueLayerOne, cleanVersion, textVersion, querySixVersion).
2025-01-07 13:01:14 +00:00
WillReturnRows(
2025-01-06 13:30:20 +00:00
pgxmock.NewRows([]string{"id"}).AddRow(pgtype.UUID{}),
2025-01-07 13:01:14 +00:00
)
2024-12-24 17:13:48 +00:00
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: ListResultValuesByID :many").WithArgs(pgxmock.AnyArg()).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "queryId", "value"}).
AddRow(pgtype.UUID{}, database.MustToDBUUID(querySixID), valueLayerOne),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: GetQueryConfig :one").WithArgs(database.MustToDBUUID(queryFiveID), queryFiveVersion).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "config"}).
AddRow(pgtype.UUID{}, []byte(fmt.Sprintf("{\"path\":\"%s\"}", keyLayerTwo))),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: SetResult :one").WithArgs(database.MustToDBUUID(queryFiveID), database.MustToDBUUID(docID), valueLayerTwo, cleanVersion, textVersion, queryFiveVersion).
2025-01-07 13:01:14 +00:00
WillReturnRows(
2025-01-06 13:30:20 +00:00
pgxmock.NewRows([]string{"id"}).AddRow(pgtype.UUID{}),
2025-01-07 13:01:14 +00:00
)
2024-12-24 17:13:48 +00:00
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: ListResultValuesByID :many").WithArgs(pgxmock.AnyArg()).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "queryId", "value"}).
AddRow(database.MustToDBUUID(contextResultID), database.MustToDBUUID(contextID), valueContext),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: GetQueryConfig :one").WithArgs(database.MustToDBUUID(queryOneID), queryOneVersion).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "config"}).
AddRow(pgtype.UUID{}, []byte(fmt.Sprintf("{\"path\":\"%s\"}", keyLayerOne))),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: SetResult :one").WithArgs(database.MustToDBUUID(queryOneID), database.MustToDBUUID(docID), valueLayerOne, cleanVersion, textVersion, queryOneVersion).
2025-01-07 13:01:14 +00:00
WillReturnRows(
2025-01-06 13:30:20 +00:00
pgxmock.NewRows([]string{"id"}).AddRow(pgtype.UUID{}),
2025-01-07 13:01:14 +00:00
)
2024-12-24 17:13:48 +00:00
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: ListResultValuesByID :many").WithArgs(pgxmock.AnyArg()).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "queryId", "value"}).
AddRow(pgtype.UUID{}, database.MustToDBUUID(queryOneID), valueLayerOne),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: GetQueryConfig :one").WithArgs(database.MustToDBUUID(queryThreeID), queryThreeVersion).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "config"}).
AddRow(pgtype.UUID{}, []byte(fmt.Sprintf("{\"path\":\"%s\"}", keyLayerTwo))),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: SetResult :one").WithArgs(database.MustToDBUUID(queryThreeID), database.MustToDBUUID(docID), valueLayerTwo, cleanVersion, textVersion, queryThreeVersion).
2025-01-07 13:01:14 +00:00
WillReturnRows(
2025-01-06 13:30:20 +00:00
pgxmock.NewRows([]string{"id"}).AddRow(pgtype.UUID{}),
2025-01-07 13:01:14 +00:00
)
2024-12-24 17:13:48 +00:00
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: ListResultValuesByID :many").WithArgs(pgxmock.AnyArg()).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "queryId", "value"}).
AddRow(pgtype.UUID{}, database.MustToDBUUID(queryOneID), valueLayerOne),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: GetQueryConfig :one").WithArgs(database.MustToDBUUID(queryTwoID), queryTwoVersion).WillReturnRows(
2024-12-24 17:13:48 +00:00
pgxmock.NewRows([]string{"id", "config"}).
AddRow(pgtype.UUID{}, []byte(fmt.Sprintf("{\"path\":\"%s\"}", keyLayerTwo))),
)
2025-01-06 13:30:20 +00:00
pool.ExpectQuery("name: SetResult :one").WithArgs(database.MustToDBUUID(queryTwoID), database.MustToDBUUID(docID), valueLayerTwo, cleanVersion, textVersion, queryTwoVersion).
2025-01-07 13:01:14 +00:00
WillReturnRows(
2025-01-06 13:30:20 +00:00
pgxmock.NewRows([]string{"id"}).AddRow(pgtype.UUID{}),
2025-01-07 13:01:14 +00:00
)
2024-12-20 17:35:33 +00:00
err = q.Execute(ctx)
2024-12-24 17:13:48 +00:00
assert.Nil(t, err)
2024-12-20 17:35:33 +00:00
}