package queryupdate_test import ( "fmt" "testing" "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" "github.com/stretchr/testify/require" "github.com/aws/aws-sdk-go-v2/service/sqs" "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/pashagolub/pgxmock/v3" "github.com/stretchr/testify/mock" ) type QueryUpdateConfig struct { serviceconfig.BaseConfig queryversionsync.QueryVersionSyncConfig } func TestUpdate(t *testing.T) { ctx := t.Context() pool, err := pgxmock.NewPool() require.NoError(t, 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(update.ID).WillReturnRows( pgxmock.NewRows([]string{"id", "type", "activeVersion", "latestVersion", "config", "requiredIds"}). AddRow(existing.ID, repository.QuerytypeJsonExtractor, existing.ActiveVersion, existing.LatestVersion, []byte(config), []uuid.UUID{}), ) pool.ExpectBeginTx(pgx.TxOptions{}) pool.ExpectQuery("name: AddLatestQueryVersion :one").WithArgs(update.ID).WillReturnRows( pgxmock.NewRows([]string{"version"}). AddRow(int32(2)), ) pool.ExpectExec("name: AddActiveQueryVersion :exec").WithArgs(update.ID, av). WillReturnResult(pgxmock.NewResult("", 1)) pool.ExpectExec("name: SetQueryConfig :exec").WithArgs(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) require.NoError(t, err) }