diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bf35cea8..16a29741 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -82,10 +82,14 @@ jobs: projects: --project backend-unit scope: backend report: backend-unit - - label: Backend integration - projects: --project backend-integration + - label: Backend HTTP integration + projects: --project backend-integration-http scope: backend - report: backend-integration + report: backend-integration-http + - label: Backend data integration + projects: --project backend-integration-data + scope: backend + report: backend-integration-data - label: Frontend projects: --project frontend-unit scope: frontend @@ -149,9 +153,10 @@ jobs: - name: Verify every coverage report is present run: | test -f .vitest-reports/backend-unit.blob - test -f .vitest-reports/backend-integration.blob + test -f .vitest-reports/backend-integration-http.blob + test -f .vitest-reports/backend-integration-data.blob test -f .vitest-reports/frontend.blob - test "$(find .vitest-reports -type f -name '*.blob' | wc -l)" -eq 3 + test "$(find .vitest-reports -type f -name '*.blob' | wc -l)" -eq 4 - name: Merge coverage and enforce thresholds env: COVERAGE_ENFORCE: '1' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4bfd3353..dfc04add 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -35,7 +35,7 @@ pnpm e2e # Playwright E2E tests - Backend unit tests use `*.test.ts`, run in Node, and must not create a database-backed application. - Frontend unit and component tests use `*.test.ts(x)` and run in jsdom. -- Backend repository, HTTP, and application integration tests use `*.integration.test.ts`. +- Backend repository, HTTP, and application integration tests use `*.integration.test.ts`; CI runs HTTP/application and datastore/adapter boundaries independently. - `*.cf-test.ts` is reserved for behavior that specifically needs D1, Workers bindings, or the Workers runtime. - Pull requests run only `@critical` browser journeys against the local Cloudflare runtime. The complete multi-viewport browser suite runs nightly. - Tests must replace S3 and ZPan Cloud with local fakes; CI must not depend on staging services or credentials. diff --git a/package.json b/package.json index 31d911de..a35a0af4 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,10 @@ "oauth-scopes:backfill": "tsx scripts/backfill-oauth-scopes.ts", "ids:normalize": "tsx scripts/normalize-ids.ts", "typecheck": "node scripts/run-typecheck.mjs", - "test": "vitest run --project backend-unit --project frontend-unit --project backend-integration", + "test": "vitest run --project backend-unit --project frontend-unit --project backend-integration-http --project backend-integration-data", "test:cf": "vitest run --project cloudflare-contract --project cloudflare-isolated", "test:libsql": "vitest run --project libsql", - "test:watch": "vitest --project backend-unit --project frontend-unit --project backend-integration", + "test:watch": "vitest --project backend-unit --project frontend-unit --project backend-integration-http --project backend-integration-data", "lint": "biome check . && pnpm lint:ids && pnpm lint:tests", "lint:ids": "node scripts/lint-id-generation.mjs", "lint:tests": "node scripts/lint-test-boundaries.mjs", diff --git a/vitest.config.ts b/vitest.config.ts index 90163927..e734447f 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -79,6 +79,15 @@ const isolatedCloudflareTests = [ 'workers/bootstrap.cf-test.ts', ] +const backendHttpIntegrationTests = [ + 'server/app.integration.test.ts', + 'server/auth.integration.test.ts', + 'server/cors.integration.test.ts', + 'server/openapi.integration.test.ts', + 'server/http/**/*.integration.test.ts', + 'server/middleware/**/*.integration.test.ts', +] + export default defineConfig({ test: { globals: true, @@ -111,8 +120,18 @@ export default defineConfig({ { resolve: { alias: aliases }, test: { - name: 'backend-integration', + name: 'backend-integration-http', + include: backendHttpIntegrationTests, + testTimeout: 15_000, + setupFiles: ['./server/test/app-version.ts'], + }, + }, + { + resolve: { alias: aliases }, + test: { + name: 'backend-integration-data', include: ['server/**/*.integration.test.ts'], + exclude: backendHttpIntegrationTests, testTimeout: 15_000, setupFiles: ['./server/test/app-version.ts'], },