//? `npm run test` — orchestrates all five test layers (contract, auth, //? rate-limit, fuzz, custom) against a running server. The server must be //? up already; this script does NOT boot it. Run `npm run server` first. //? //? Config via env: //? TEST_BASE_URL — override; otherwise live dev port → ports.backend fallback //? TEST_SKIP — comma-separated `/` to skip //? TEST_AUTH_TOKEN — applied as session cookie to sweep layers //? TEST_FILTER — substring match against `//` //? TEST_NO_FUZZ=1 — skip the fuzz layer //? TEST_NO_RATE_LIMIT=1 — skip the rate-limit layer //? TEST_NO_SWEEP=1 — skip all sweep layers (only run custom tests) //? TEST_ONLY_CUSTOM=1 — alias for TEST_NO_SWEEP //? TEST_NO_CUSTOM=1 — skip per-route custom tests //? TEST_OUTPUT_FILE — results JSON path (default `test-results.json`) import { logRunAllSummary, resolveTestBaseUrl, runAllTests } from '@luckystack/test-runner'; import { apiInputSchemas, syncInputSchemas } from '../src/_sockets/apiInputSchemas.generated'; import { apiMetaMap, apiMethodMap, syncMetaMap } from '../src/_sockets/apiTypes.generated'; import { ports } from '../config.ports'; const baseUrl = resolveTestBaseUrl({ fallbackUrl: `http://localhost:${String(ports.backend)}`, }); const skip = (process.env.TEST_SKIP ?? '').split(',').map(s => s.trim()).filter(Boolean); const authToken = process.env.TEST_AUTH_TOKEN || undefined; const filter = process.env.TEST_FILTER || undefined; const noSweep = process.env.TEST_NO_SWEEP === '1' || process.env.TEST_ONLY_CUSTOM === '1'; const noFuzz = process.env.TEST_NO_FUZZ === '1'; const noRateLimit = process.env.TEST_NO_RATE_LIMIT === '1'; const noCustom = process.env.TEST_NO_CUSTOM === '1'; console.log(`[luckystack-test] target: ${baseUrl}`); if (filter) console.log(`[luckystack-test] filter: ${filter}`); const summary = await runAllTests({ apiMethodMap, //? Load config lazily so the runner first applies .env/.env.local, then uses //? the project's optional secretManager config to resolve pointers in THIS //? process before Layer-5 tests import Prisma/Redis-backed modules. loadProjectConfig: async () => (await import('../config')).default, apiMetaMap, apiInputSchemas, syncMetaMap, syncInputSchemas, baseUrl, authToken, skip, filter, noSweep, noFuzz, noRateLimit, noCustom, }); logRunAllSummary(summary); if (summary.totalFailed > 0) { process.exit(1); } process.exit(0);