package query import ( "context" "queryorchestration/internal/database" "queryorchestration/internal/database/repository" queryprocessor "queryorchestration/internal/query/processor" "testing" "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/pashagolub/pgxmock/v3" "github.com/stretchr/testify/assert" ) func TestGetCreator(t *testing.T) { 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, } svc := New(db) queryType := queryprocessor.Type(queryprocessor.TypeContextFull) creator, err := svc.getCreator(queryType) assert.Nil(t, err) assert.NotNil(t, creator) queryType = queryprocessor.Type(queryprocessor.TypeJsonExtractor) creator, err = svc.getCreator(queryType) assert.Nil(t, err) assert.NotNil(t, creator) queryType = queryprocessor.Type(-1) _, err = svc.getCreator(queryType) assert.NotNil(t, err) } func TestParseCreateQuery(t *testing.T) { cfg := "{\"key\":\"value\"}" cQuery := &queryprocessor.Create{ Type: queryprocessor.TypeContextFull, RequiredQueryIDs: &[]uuid.UUID{ uuid.New(), }, Config: &cfg, } resultQuery, err := parseCreateQuery(cQuery) assert.Nil(t, err) rQIDs := database.MustToDBUUIDArray(*cQuery.RequiredQueryIDs) qcfg := []byte(*cQuery.Config) assert.EqualExportedValues(t, createQuery{ Type: repository.QuerytypeContextFull, RequiredQueryIDs: &rQIDs, Config: &qcfg, }, *resultQuery) } func TestParseCreateQueryInvalidType(t *testing.T) { cfg := "{\"key\":\"value\"}" cQuery := &queryprocessor.Create{ Type: queryprocessor.Type(-1), RequiredQueryIDs: &[]uuid.UUID{ uuid.New(), }, Config: &cfg, } _, err := parseCreateQuery(cQuery) assert.EqualError(t, err, "invalid database query type") } func TestSubmitCreate(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, } svc := New(db) config := "{\"path\":\"example_path\"}" q := Query{ ID: uuid.New(), Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: &[]uuid.UUID{ uuid.New(), }, Config: &config, } create := &queryprocessor.Create{ Type: q.Type, RequiredQueryIDs: q.RequiredQueryIDs, Config: q.Config, } dbType, err := queryprocessor.ToDBQueryType(create.Type) assert.Nil(t, err) pool.ExpectBeginTx(pgx.TxOptions{}) pool.ExpectQuery("name: CreateQuery :one").WithArgs(dbType).WillReturnRows( pgxmock.NewRows([]string{"id"}). AddRow(database.MustToDBUUID(q.ID)), ) for _, req := range *create.RequiredQueryIDs { pool.ExpectExec("name: AddRequiredQuery :exec").WithArgs(database.MustToDBUUID(q.ID), database.MustToDBUUID(req), int32(1)). WillReturnResult(pgxmock.NewResult("", 1)) } pool.ExpectExec("name: AddQueryConfig :exec").WithArgs(database.MustToDBUUID(q.ID), []byte(*create.Config), int32(1)). WillReturnResult(pgxmock.NewResult("", 1)) pool.ExpectCommit() id, err := svc.submitCreate(ctx, create) assert.Nil(t, err) assert.Equal(t, q.ID, id) } func TestSubmitCreateNoReqsOrConfig(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, } svc := New(db) q := Query{ ID: uuid.New(), Type: queryprocessor.TypeJsonExtractor, } create := &queryprocessor.Create{ Type: q.Type, } dbType, err := queryprocessor.ToDBQueryType(create.Type) assert.Nil(t, err) pool.ExpectBeginTx(pgx.TxOptions{}) pool.ExpectQuery("name: CreateQuery :one").WithArgs(dbType).WillReturnRows( pgxmock.NewRows([]string{"id"}). AddRow(database.MustToDBUUID(q.ID)), ) pool.ExpectCommit() id, err := svc.submitCreate(ctx, create) assert.Nil(t, err) assert.Equal(t, q.ID, id) } func TestNormalizeCreate(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, } svc := New(db) create := &queryprocessor.Create{ Type: queryprocessor.TypeJsonExtractor, RequiredQueryIDs: &[]uuid.UUID{}, } dbids := database.MustToDBUUIDArray(*create.RequiredQueryIDs) pool.ExpectQuery("name: AllQueriesExist :one").WithArgs(dbids).WillReturnRows( pgxmock.NewRows([]string{"all_exist"}). AddRow(true), ) err = svc.normalizeCreate(ctx, create) assert.Nil(t, err) assert.EqualExportedValues(t, queryprocessor.Create{ Type: queryprocessor.TypeJsonExtractor, Config: nil, RequiredQueryIDs: nil, }, *create) }