From 19f81faf4dd8032974e61a11ca6b431a64f3c0ea Mon Sep 17 00:00:00 2001 From: neon <18559658+neonsolstice@users.noreply.github.com> Date: Sun, 12 Apr 2026 17:12:36 -0600 Subject: [PATCH] ci: reorganize project scripts and E2E workflows by type --- .github/workflows/ci.yml | 2 +- .github/workflows/e2e-runner.yml | 2 +- .github/workflows/e2e.yml | 2 +- DEVELOPMENT.md | 2 +- package.json | 12 ++++++------ scripts/{setup.sh => bootstrap/local.sh} | 2 +- scripts/db/{seed.sh => seed-baseline.sh} | 0 .../list-suites-json.mjs => e2e/list-matrix.mjs} | 2 +- scripts/{db/prepare-e2e.sh => e2e/prepare-db.sh} | 0 .../{test/run-e2e-suite.mjs => e2e/run-suite.mjs} | 2 +- scripts/{test/run-e2e-suite.sh => e2e/run-suite.sh} | 2 +- .../select-matrix.mjs} | 2 +- .../{test/e2e-suites.mjs => e2e/suite-registry.mjs} | 6 +++++- .../seed-reading-sessions.sh} | 2 +- 14 files changed, 21 insertions(+), 17 deletions(-) rename scripts/{setup.sh => bootstrap/local.sh} (86%) rename scripts/db/{seed.sh => seed-baseline.sh} (100%) rename scripts/{test/list-suites-json.mjs => e2e/list-matrix.mjs} (67%) rename scripts/{db/prepare-e2e.sh => e2e/prepare-db.sh} (100%) rename scripts/{test/run-e2e-suite.mjs => e2e/run-suite.mjs} (98%) rename scripts/{test/run-e2e-suite.sh => e2e/run-suite.sh} (73%) rename scripts/{test/select-e2e-suites-json.mjs => e2e/select-matrix.mjs} (96%) rename scripts/{test/e2e-suites.mjs => e2e/suite-registry.mjs} (99%) rename scripts/{seed/reading-sessions.sh => fixtures/seed-reading-sessions.sh} (98%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d22f818c0..c87ce1ba1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -363,7 +363,7 @@ jobs: GITHUB_BASE_SHA: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} GITHUB_HEAD_SHA: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} run: | - MATRIX=$(node scripts/test/select-e2e-suites-json.mjs) + MATRIX=$(node scripts/e2e/select-matrix.mjs) echo "matrix=$(echo "$MATRIX" | jq -c .)" >> "$GITHUB_OUTPUT" echo "selected_suites=$(echo "$MATRIX" | jq -c .)" diff --git a/.github/workflows/e2e-runner.yml b/.github/workflows/e2e-runner.yml index 2523c72a7..e45c8bbb4 100644 --- a/.github/workflows/e2e-runner.yml +++ b/.github/workflows/e2e-runner.yml @@ -4,7 +4,7 @@ on: workflow_call: inputs: suite-id: - description: "E2E suite id from scripts/test/e2e-suites.mjs (e.g. scanner-scenarios)" + description: "E2E suite id from scripts/e2e/suite-registry.mjs (e.g. scanner-scenarios)" required: true type: string check-name: diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 0f53a8e34..72f4a596f 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -40,7 +40,7 @@ jobs: - name: Build matrix id: build shell: bash - run: echo "matrix=$(node scripts/test/list-suites-json.mjs)" >> "$GITHUB_OUTPUT" + run: echo "matrix=$(node scripts/e2e/list-matrix.mjs)" >> "$GITHUB_OUTPUT" e2e: needs: setup diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 450412fdb..325029a33 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -146,7 +146,7 @@ pnpm run e2e:run -- scanner-scenarios --testNamePattern=book-per-folder-disc-fol ### E2E runner architecture -- All suite metadata lives in `scripts/test/e2e-suites.mjs` (suite id, spec file, JUnit output, DB prep mode). +- All suite metadata lives in `scripts/e2e/suite-registry.mjs` (suite id, spec file, JUnit output, DB prep mode). - Local and CI use the same command: `pnpm run e2e:run -- `. - Use `all` as a composite suite id to run every configured suite in order, or use `pnpm run e2e:all`. - Dedicated-db suites auto-start local PostgreSQL when `CI != true`, then reset and migrate the e2e database through `pnpm run e2e:db:prepare`. diff --git a/package.json b/package.json index 892848499..09c002d7b 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "projectx", "private": true, "scripts": { - "setup": "bash ./scripts/setup.sh", + "setup": "bash ./scripts/bootstrap/local.sh", "dev": "concurrently --names \"types,server,client\" --prefix-colors \"cyan,blue,green\" \"pnpm --filter @projectx/types dev\" \"npm run dev:server\" \"npm run dev:client\"", "dev:client": "cd client && npm run dev -- --host", "dev:server": "cd server && npm run start:dev", @@ -22,9 +22,9 @@ "test": "pnpm run test:server && pnpm run test:client", "test:server": "pnpm --filter server test", "test:client": "pnpm --filter client test:unit --run", - "e2e:run": "node ./scripts/test/run-e2e-suite.mjs", - "e2e:all": "node ./scripts/test/run-e2e-suite.mjs all", - "e2e:list": "node ./scripts/test/run-e2e-suite.mjs --list", + "e2e:run": "node ./scripts/e2e/run-suite.mjs", + "e2e:all": "node ./scripts/e2e/run-suite.mjs all", + "e2e:list": "node ./scripts/e2e/run-suite.mjs --list", "coverage": "pnpm run coverage:server && pnpm run coverage:client", "coverage:server": "pnpm --filter server test:cov", "coverage:client": "pnpm --filter client test:cov --run", @@ -33,8 +33,8 @@ "prod:down": "docker compose down", "db:migrate": "pnpm --filter server db:migrate", "db:reset": "bash ./scripts/db/reset.sh", - "db:seed": "bash ./scripts/db/seed.sh", - "e2e:db:prepare": "bash ./scripts/db/prepare-e2e.sh", + "db:seed": "bash ./scripts/db/seed-baseline.sh", + "e2e:db:prepare": "bash ./scripts/e2e/prepare-db.sh", "e2e:db:migrate": "pnpm --filter server e2e:db:migrate", "prepare": "husky" }, diff --git a/scripts/setup.sh b/scripts/bootstrap/local.sh similarity index 86% rename from scripts/setup.sh rename to scripts/bootstrap/local.sh index ecddae8fd..92f3b1a4c 100644 --- a/scripts/setup.sh +++ b/scripts/bootstrap/local.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$ROOT_DIR" if [[ ! -f server/.env ]]; then diff --git a/scripts/db/seed.sh b/scripts/db/seed-baseline.sh similarity index 100% rename from scripts/db/seed.sh rename to scripts/db/seed-baseline.sh diff --git a/scripts/test/list-suites-json.mjs b/scripts/e2e/list-matrix.mjs similarity index 67% rename from scripts/test/list-suites-json.mjs rename to scripts/e2e/list-matrix.mjs index 7f73d9934..49fdb8bf4 100644 --- a/scripts/test/list-suites-json.mjs +++ b/scripts/e2e/list-matrix.mjs @@ -1,3 +1,3 @@ -import { listE2ESuites } from "./e2e-suites.mjs"; +import { listE2ESuites } from "./suite-registry.mjs"; process.stdout.write(JSON.stringify(listE2ESuites().map(({ id, name, timeout }) => ({ id, name, timeout })))); diff --git a/scripts/db/prepare-e2e.sh b/scripts/e2e/prepare-db.sh similarity index 100% rename from scripts/db/prepare-e2e.sh rename to scripts/e2e/prepare-db.sh diff --git a/scripts/test/run-e2e-suite.mjs b/scripts/e2e/run-suite.mjs similarity index 98% rename from scripts/test/run-e2e-suite.mjs rename to scripts/e2e/run-suite.mjs index 9cf948cee..a5bf1901b 100644 --- a/scripts/test/run-e2e-suite.mjs +++ b/scripts/e2e/run-suite.mjs @@ -6,7 +6,7 @@ import { dirname, join } from "node:path"; import process from "node:process"; import { fileURLToPath } from "node:url"; -import { getE2ESuite, listE2ESuites } from "./e2e-suites.mjs"; +import { getE2ESuite, listE2ESuites } from "./suite-registry.mjs"; const DEFAULT_E2E_DATABASE_URL = "postgres://projectx:projectx@localhost:5432/projectx_e2e"; diff --git a/scripts/test/run-e2e-suite.sh b/scripts/e2e/run-suite.sh similarity index 73% rename from scripts/test/run-e2e-suite.sh rename to scripts/e2e/run-suite.sh index 4c2f0f2fc..738ca0623 100755 --- a/scripts/test/run-e2e-suite.sh +++ b/scripts/e2e/run-suite.sh @@ -4,4 +4,4 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$ROOT_DIR" -node ./scripts/test/run-e2e-suite.mjs "$@" +node ./scripts/e2e/run-suite.mjs "$@" diff --git a/scripts/test/select-e2e-suites-json.mjs b/scripts/e2e/select-matrix.mjs similarity index 96% rename from scripts/test/select-e2e-suites-json.mjs rename to scripts/e2e/select-matrix.mjs index fabda8dc6..77a5f77a2 100644 --- a/scripts/test/select-e2e-suites-json.mjs +++ b/scripts/e2e/select-matrix.mjs @@ -2,7 +2,7 @@ import { execFileSync } from "node:child_process"; import { matchesGlob } from "node:path"; import process from "node:process"; -import { E2E_GLOBAL_CHANGE_PATHS, listE2ESuites } from "./e2e-suites.mjs"; +import { E2E_GLOBAL_CHANGE_PATHS, listE2ESuites } from "./suite-registry.mjs"; const ZERO_SHA_PATTERN = /^0+$/; diff --git a/scripts/test/e2e-suites.mjs b/scripts/e2e/suite-registry.mjs similarity index 99% rename from scripts/test/e2e-suites.mjs rename to scripts/e2e/suite-registry.mjs index b2d467b91..088b2f877 100644 --- a/scripts/test/e2e-suites.mjs +++ b/scripts/e2e/suite-registry.mjs @@ -9,7 +9,11 @@ export const E2E_GLOBAL_CHANGE_PATHS = Object.freeze([ "docker/**", ]); -const SHARED_DB_AND_HELPER_PATHS = Object.freeze(["server/src/db/schema/**", "scripts/test/**", "scripts/db/**"]); +const SHARED_DB_AND_HELPER_PATHS = Object.freeze([ + "server/src/db/schema/**", + "scripts/e2e/**", + "scripts/db/**", +]); const SHARED_AUTH_TYPE_PATHS = Object.freeze(["packages/types/src/auth.ts", "packages/types/src/permissions.ts"]); diff --git a/scripts/seed/reading-sessions.sh b/scripts/fixtures/seed-reading-sessions.sh similarity index 98% rename from scripts/seed/reading-sessions.sh rename to scripts/fixtures/seed-reading-sessions.sh index 9505b0031..f971b7b87 100755 --- a/scripts/seed/reading-sessions.sh +++ b/scripts/fixtures/seed-reading-sessions.sh @@ -6,7 +6,7 @@ # Safe to run multiple times - sessions are deduplicated by session_id and # daily stats are upserted. Running again adds more data on top. # -# Usage: ./scripts/seed/reading-sessions.sh [USER_ID] +# Usage: ./scripts/fixtures/seed-reading-sessions.sh [USER_ID] # USER_ID defaults to 1. set -euo pipefail