package collector import ( "context" "testing" "queryorchestration/internal/database" "queryorchestration/internal/database/repository" "queryorchestration/internal/serviceconfig" "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/require" ) func TestGetCreateParams(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() require.NoError(t, err) cfg := &serviceconfig.BaseConfig{} cfg.DBPool = pool cfg.DBQueries = repository.New(pool) svc := Service{ cfg: cfg, svc: &Services{}, } minCleanV := int32(1) minTextV := int32(1) params := CreateParams{ JobID: uuid.New(), MinCleanVersion: &minCleanV, MinTextVersion: &minTextV, Fields: &map[string]uuid.UUID{ "example_key": uuid.New(), }, } pool.ExpectQuery("name: AllQueriesExist :one").WithArgs(database.MustToDBUUIDArray([]uuid.UUID{(*params.Fields)["example_key"]})).WillReturnRows( pgxmock.NewRows([]string{"all_exist"}). AddRow(true), ) dbparams, err := svc.getCreateParams(ctx, ¶ms) assert.NoError(t, err) assert.EqualExportedValues(t, &dbCreateParams{ JobID: database.MustToDBUUID(params.JobID), MinCleanVersion: &minCleanV, MinTextVersion: &minTextV, Fields: &map[string]pgtype.UUID{ "example_key": database.MustToDBUUID((*params.Fields)["example_key"]), }, }, dbparams) (*params.Fields)["second_key"] = (*params.Fields)["example_key"] assert.Len(t, *params.Fields, 2) _, err = svc.getCreateParams(ctx, ¶ms) assert.Error(t, err) } func TestSubmitCreate(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() require.NoError(t, err) cfg := &serviceconfig.BaseConfig{} cfg.DBPool = pool cfg.DBQueries = repository.New(pool) svc := Service{ cfg: cfg, svc: &Services{}, } minCleanV := int32(2) minTextV := int32(4) params := dbCreateParams{ JobID: database.MustToDBUUID(uuid.New()), MinCleanVersion: &minCleanV, MinTextVersion: &minTextV, Fields: &map[string]pgtype.UUID{ "example_key": database.MustToDBUUID(uuid.New()), }, } pool.ExpectBeginTx(pgx.TxOptions{}) pool.ExpectQuery("name: AddLatestCollectorVersion :one").WithArgs(params.JobID).WillReturnRows( pgxmock.NewRows([]string{"version"}). AddRow(int32(1)), ) pool.ExpectExec("name: SetActiveCollectorVersion :exec").WithArgs(params.JobID, int32(1)). WillReturnResult(pgxmock.NewResult("", 1)) pool.ExpectExec("name: SetCollectorCleanVersion :exec").WithArgs(params.JobID, int32(1), *params.MinCleanVersion). WillReturnResult(pgxmock.NewResult("", 1)) pool.ExpectExec("name: SetCollectorTextVersion :exec").WithArgs(params.JobID, int32(1), *params.MinTextVersion). WillReturnResult(pgxmock.NewResult("", 1)) pool.ExpectExec("name: AddCollectorQuery :exec").WithArgs(params.JobID, "example_key", (*params.Fields)["example_key"], int32(1)). WillReturnResult(pgxmock.NewResult("", 1)) pool.ExpectCommit() err = svc.submitCreate(ctx, ¶ms) assert.NoError(t, err) } func TestNormalizeFieldsToDB(t *testing.T) { ctx := context.Background() pool, err := pgxmock.NewPool() require.NoError(t, err) cfg := &serviceconfig.BaseConfig{} cfg.DBPool = pool cfg.DBQueries = repository.New(pool) svc := Service{ cfg: cfg, svc: &Services{}, } fields := map[string]uuid.UUID{ "example_key": uuid.New(), } pool.ExpectQuery("name: AllQueriesExist :one").WithArgs(database.MustToDBUUIDArray([]uuid.UUID{fields["example_key"]})).WillReturnRows( pgxmock.NewRows([]string{"all_exist"}). AddRow(true), ) dbparams, err := svc.NormalizeFieldsToDB(ctx, &fields) assert.NoError(t, err) assert.EqualExportedValues(t, &map[string]pgtype.UUID{ "example_key": database.MustToDBUUID(fields["example_key"]), }, dbparams) fields["second_key"] = fields["example_key"] pool.ExpectQuery("name: AllQueriesExist :one").WithArgs(database.MustToDBUUIDArray([]uuid.UUID{fields["example_key"]})).WillReturnRows( pgxmock.NewRows([]string{"all_exist"}). AddRow(true), ) _, err = svc.NormalizeFieldsToDB(ctx, &fields) assert.Error(t, err) }