package db import ( "io/fs" "path" "strings" "testing" "evobgp/migrations" ) func TestPostgresEmbeddedMigrationsTransactional(t *testing.T) { entries, err := fs.ReadDir(migrations.Postgres, "postgres") if err != nil { t.Fatal(err) } for _, entry := range entries { if !strings.HasSuffix(entry.Name(), ".up.sql") { continue } body, err := fs.ReadFile(migrations.Postgres, path.Join("postgres", entry.Name())) if err != nil { t.Fatal(err) } if bad := unsupportedMigrationStatement(string(body)); bad != "" { t.Errorf("%s contains unsupported transaction control or DDL: %q", entry.Name(), bad) } } } func TestPostgresMigrationRejectsTransactionControl(t *testing.T) { for _, statement := range []string{ "COMMIT;", "END;", "ROLLBACK;", "ABORT;", "BEGIN;", "CREATE INDEX CONCURRENTLY idx ON t (id);", "VACUUM t;", "CREATE TABLE t(id int); /* boundary */ COMMIT; SELECT 1/0;", "/* comment */COMMIT;", "-- comment\nCOMMIT;", "/* nested /* comment */ still comment */ END;", "CREATE TABLE foo$tag$ (id int); COMMIT; -- $tag$", "-- comment\rCOMMIT;", `foo$E'abc\'; COMMIT;`, `éE'abc\'; COMMIT;`, } { if unsupportedMigrationStatement(statement) == "" { t.Errorf("did not reject %q", statement) } } } func TestPostgresMigrationIgnoresQuotedControlWords(t *testing.T) { for _, statement := range []string{ "SELECT 'COMMIT;'::text;", "SELECT $$COMMIT;$$;", "SELECT $tag$END;$tag$;", "SELECT E'ABORT;\\'';", "SELECT \"ROLLBACK\" FROM t;", "-- COMMIT;\nSELECT 1;", } { if bad := unsupportedMigrationStatement(statement); bad != "" { t.Errorf("rejected quoted or commented SQL %q: %s", statement, bad) } } }