package query_test import ( "context" "errors" "queryorchestration/internal/database" "queryorchestration/internal/database/repository" "queryorchestration/internal/query" resultprocessor "queryorchestration/internal/query/result/processor" "testing" "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/pashagolub/pgxmock/v3" "github.com/stretchr/testify/assert" ) func TestCreate(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 := query.New(db, &query.Services{}) config := "{\"path\":\"example_path\"}" q := query.Query{ ID: uuid.New(), Type: resultprocessor.TypeJsonExtractor, RequiredQueryIDs: &[]uuid.UUID{ uuid.New(), }, Config: &config, } create := &resultprocessor.Create{ Type: q.Type, RequiredQueryIDs: q.RequiredQueryIDs, Config: q.Config, } dbType, err := resultprocessor.ToDBQueryType(create.Type) assert.Nil(t, err) pool.ExpectQuery("name: AllQueriesExist :one").WithArgs(database.MustToDBUUIDArray(*create.RequiredQueryIDs)).WillReturnRows( pgxmock.NewRows([]string{"all_exist"}).AddRow(true), ) 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.Create(ctx, create) assert.Nil(t, err) assert.Equal(t, q.ID, id) } func TestCreateMinimal(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 := query.New(db, &query.Services{}) q := query.Query{ ID: uuid.New(), Type: resultprocessor.TypeJsonExtractor, } create := &resultprocessor.Create{ Type: q.Type, } dbType, err := resultprocessor.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.Create(ctx, create) assert.Nil(t, err) assert.Equal(t, q.ID, id) } func TestCreateRollback(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 := query.New(db, &query.Services{}) create := &resultprocessor.Create{ Type: resultprocessor.TypeJsonExtractor, } dbType, err := resultprocessor.ToDBQueryType(create.Type) assert.Nil(t, err) pool.ExpectBeginTx(pgx.TxOptions{}) msg := "database failure" pool.ExpectQuery("name: CreateQuery :one").WithArgs(dbType).WillReturnError(errors.New(msg)) pool.ExpectRollback() _, err = svc.Create(ctx, create) assert.EqualError(t, err, msg) }