package queryupdate_test import ( "context" "fmt" "queryorchestration/internal/database" "queryorchestration/internal/database/repository" "queryorchestration/internal/query" resultprocessor "queryorchestration/internal/query/result/processor" queryupdate "queryorchestration/internal/query/update" "queryorchestration/internal/serviceconfig" "queryorchestration/internal/serviceconfig/queue/queryversionsync" queuemock "queryorchestration/mocks/queue" "testing" "github.com/aws/aws-sdk-go-v2/service/sqs" "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" "github.com/pashagolub/pgxmock/v3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) type QueryUpdateConfig struct { serviceconfig.BaseConfig queryversionsync.QueryVersionSyncConfig } func TestUpdate(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() if err != nil { t.Fatalf("failed to open pgxmock database: %v", err) } cfg := &QueryUpdateConfig{} cfg.DBPool = pool cfg.DBQueries = repository.New(pool) mockSQS := queuemock.NewMockSQSClient(t) cfg.QueueClient = mockSQS cfg.QueryVersionSyncURL = "/here" svc := queryupdate.New(cfg, &queryupdate.Services{ Query: query.New(cfg), }) config := "{\"path\":\"example_path\"}" existing := query.Query{ ID: uuid.New(), ActiveVersion: int32(1), LatestVersion: int32(1), } av := int32(2) jcfg := `{"path":"id"}` update := &resultprocessor.Update{ ID: existing.ID, ActiveVersion: &av, Config: &jcfg, } pool.ExpectQuery("name: GetQuery :one").WithArgs(database.MustToDBUUID(update.ID)).WillReturnRows( pgxmock.NewRows([]string{"id", "type", "activeVersion", "latestVersion", "config", "requiredIds"}). AddRow(database.MustToDBUUID(existing.ID), repository.QuerytypeJsonExtractor, existing.ActiveVersion, existing.LatestVersion, []byte(config), []pgtype.UUID{}), ) pool.ExpectBeginTx(pgx.TxOptions{}) pool.ExpectQuery("name: AddLatestQueryVersion :one").WithArgs(database.MustToDBUUID(update.ID)).WillReturnRows( pgxmock.NewRows([]string{"version"}). AddRow(int32(2)), ) pool.ExpectExec("name: AddActiveQueryVersion :exec").WithArgs(database.MustToDBUUID(update.ID), av). WillReturnResult(pgxmock.NewResult("", 1)) pool.ExpectExec("name: SetQueryConfig :exec").WithArgs(database.MustToDBUUID(update.ID), []byte(*update.Config), int32(2)). WillReturnResult(pgxmock.NewResult("", 1)) pool.ExpectCommit() mockSQS.EXPECT(). SendMessage( mock.Anything, mock.MatchedBy(func(in *sqs.SendMessageInput) bool { return *in.QueueUrl == cfg.QueryVersionSyncURL && *in.MessageBody == fmt.Sprintf("{\"id\":\"%s\"}", existing.ID.String()) }), mock.Anything, ). Return(&sqs.SendMessageOutput{}, nil) err = svc.Update(ctx, update) assert.NoError(t, err) }