2025-01-20 13:31:48 +00:00
|
|
|
package query
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
|
|
|
|
"queryorchestration/internal/database"
|
|
|
|
|
"queryorchestration/internal/database/repository"
|
|
|
|
|
queryprocessor "queryorchestration/internal/query/processor"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/google/uuid"
|
|
|
|
|
"github.com/pashagolub/pgxmock/v3"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestNormalizeConfig(t *testing.T) {
|
|
|
|
|
s := Service{}
|
|
|
|
|
|
|
|
|
|
err := s.normalizeConfig(nil)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
|
|
entity := queryprocessor.Create{}
|
|
|
|
|
|
|
|
|
|
entity.Config = nil
|
|
|
|
|
err = s.normalizeConfig(&entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.Nil(t, entity.Config)
|
|
|
|
|
|
|
|
|
|
cfg := ""
|
|
|
|
|
entity.Config = &cfg
|
|
|
|
|
err = s.normalizeConfig(&entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.Nil(t, entity.Config)
|
|
|
|
|
|
|
|
|
|
cfg = " "
|
|
|
|
|
entity.Config = &cfg
|
|
|
|
|
err = s.normalizeConfig(&entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.Nil(t, entity.Config)
|
|
|
|
|
|
|
|
|
|
cfg = "{}"
|
|
|
|
|
entity.Config = &cfg
|
|
|
|
|
err = s.normalizeConfig(&entity)
|
|
|
|
|
assert.Nil(t, err)
|
2025-01-21 18:24:14 +00:00
|
|
|
assert.Equal(t, "{}", *(entity.Config))
|
2025-01-20 13:31:48 +00:00
|
|
|
|
|
|
|
|
cfg = "{\"hello\":\"bye\"}"
|
|
|
|
|
entity.Config = &cfg
|
|
|
|
|
err = s.normalizeConfig(&entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.Equal(t, "{\"hello\":\"bye\"}", *(entity.Config))
|
|
|
|
|
|
|
|
|
|
cfg = " { \"hello\" : \"bye\" } "
|
|
|
|
|
entity.Config = &cfg
|
|
|
|
|
err = s.normalizeConfig(&entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.Equal(t, "{\"hello\":\"bye\"}", *(entity.Config))
|
|
|
|
|
|
|
|
|
|
cfg = "{'hello':'bye'}"
|
|
|
|
|
entity.Config = &cfg
|
|
|
|
|
err = s.normalizeConfig(&entity)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
|
|
|
|
|
cfg = "{\"hello\":\"}"
|
|
|
|
|
entity.Config = &cfg
|
|
|
|
|
err = s.normalizeConfig(&entity)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestNormalizeQueryIDs(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,
|
|
|
|
|
}
|
|
|
|
|
s := Service{db: db}
|
|
|
|
|
|
|
|
|
|
err = s.normalizeQueryIDs(ctx, nil)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
|
|
entity := queryprocessor.Create{}
|
|
|
|
|
|
|
|
|
|
entity.RequiredQueryIDs = nil
|
|
|
|
|
err = s.normalizeQueryIDs(ctx, &entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.Nil(t, entity.RequiredQueryIDs)
|
|
|
|
|
|
|
|
|
|
entity.RequiredQueryIDs = &[]uuid.UUID{}
|
|
|
|
|
err = s.normalizeQueryIDs(ctx, &entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.Nil(t, entity.RequiredQueryIDs)
|
|
|
|
|
|
|
|
|
|
ids := []uuid.UUID{uuid.New()}
|
|
|
|
|
entity.RequiredQueryIDs = &ids
|
|
|
|
|
dbids := database.MustToDBUUIDArray(*entity.RequiredQueryIDs)
|
|
|
|
|
|
|
|
|
|
pool.ExpectQuery("name: AllQueriesExist :one").WithArgs(dbids).WillReturnRows(
|
|
|
|
|
pgxmock.NewRows([]string{"all_exist"}).
|
|
|
|
|
AddRow(true),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
err = s.normalizeQueryIDs(ctx, &entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.ElementsMatch(t, ids, *entity.RequiredQueryIDs)
|
|
|
|
|
|
|
|
|
|
pool.ExpectQuery("name: AllQueriesExist :one").WithArgs(dbids).WillReturnRows(
|
|
|
|
|
pgxmock.NewRows([]string{"all_exist"}).
|
|
|
|
|
AddRow(false),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
err = s.normalizeQueryIDs(ctx, &entity)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
assert.ElementsMatch(t, ids, *entity.RequiredQueryIDs)
|
|
|
|
|
|
|
|
|
|
pool.ExpectQuery("name: AllQueriesExist :one").WithArgs(dbids).
|
|
|
|
|
WillReturnError(errors.New("database failure"))
|
|
|
|
|
|
|
|
|
|
err = s.normalizeQueryIDs(ctx, &entity)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
assert.ElementsMatch(t, ids, *entity.RequiredQueryIDs)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestNormalizeActiveVersion(t *testing.T) {
|
|
|
|
|
s := Service{}
|
|
|
|
|
|
|
|
|
|
err := s.normalizeActiveVersion(nil, nil)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
|
|
|
|
|
current := Query{
|
|
|
|
|
ActiveVersion: 2,
|
|
|
|
|
LatestVersion: 4,
|
|
|
|
|
}
|
|
|
|
|
entity := queryprocessor.Update{}
|
|
|
|
|
|
|
|
|
|
err = s.normalizeActiveVersion(nil, &entity)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
|
|
|
|
|
err = s.normalizeActiveVersion(¤t, nil)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
|
|
err = s.normalizeActiveVersion(¤t, &entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
|
|
entity.ActiveVersion = ¤t.ActiveVersion
|
|
|
|
|
err = s.normalizeActiveVersion(¤t, &entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.Nil(t, entity.ActiveVersion)
|
|
|
|
|
|
|
|
|
|
aV := current.ActiveVersion + 1
|
|
|
|
|
entity.ActiveVersion = &aV
|
|
|
|
|
err = s.normalizeActiveVersion(¤t, &entity)
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
assert.Equal(t, aV, *entity.ActiveVersion)
|
|
|
|
|
|
|
|
|
|
aV = current.LatestVersion + 2
|
|
|
|
|
entity.ActiveVersion = &aV
|
|
|
|
|
err = s.normalizeActiveVersion(¤t, &entity)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
|
|
|
|
|
aV = 0
|
|
|
|
|
entity.ActiveVersion = &aV
|
|
|
|
|
err = s.normalizeActiveVersion(¤t, &entity)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
}
|