From abc8daf9cbeb27bdb8514cd2c63542fd8747ce31 Mon Sep 17 00:00:00 2001 From: Konstantin Wohlwend Date: Tue, 3 Feb 2026 09:25:24 -0800 Subject: [PATCH 1/5] Tracing for email health endpoint --- apps/backend/src/app/health/email/route.tsx | 77 +++++++++++---------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/apps/backend/src/app/health/email/route.tsx b/apps/backend/src/app/health/email/route.tsx index 7159c84d4..5cd5a9def 100644 --- a/apps/backend/src/app/health/email/route.tsx +++ b/apps/backend/src/app/health/email/route.tsx @@ -1,4 +1,5 @@ import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler"; +import { traceSpan } from "@/utils/telemetry"; import { yupNumber, yupObject, yupString, yupTuple } from "@stackframe/stack-shared/dist/schema-fields"; import { generateSecureRandomString } from "@stackframe/stack-shared/dist/utils/crypto"; import { getEnvVariable, getNodeEnvironment } from "@stackframe/stack-shared/dist/utils/env"; @@ -62,29 +63,31 @@ const fetchFromResend = async (): Promise<{ data: ResendEmail[] }> => { }; const performSignUp = async (email: string, password: string) => { - const apiBaseUrl = getEnvVariable("NEXT_PUBLIC_STACK_API_URL"); - const response = await fetch(`${apiBaseUrl}/api/v1/auth/password/sign-up`, { - method: "POST", - headers: { - "Content-Type": "application/json", - "X-Stack-Access-Type": "client", - "X-Stack-Publishable-Client-Key": getEnvVariable("STACK_EMAIL_MONITOR_PUBLISHABLE_CLIENT_KEY"), - "X-Stack-Project-Id": getEnvVariable("STACK_EMAIL_MONITOR_PROJECT_ID"), - }, - body: JSON.stringify({ - email, - password, - verification_callback_url: getEnvVariable("STACK_EMAIL_MONITOR_VERIFICATION_CALLBACK_URL"), - }), - }); - - const responseBody = await response.text(); - - if (!response.ok) { - throw new StackAssertionError(`Sign-up failed: ${response.status} - ${responseBody}`, { - responseBody, + await traceSpan("performing sign-up", async () => { + const apiBaseUrl = getEnvVariable("NEXT_PUBLIC_STACK_API_URL"); + const response = await fetch(`${apiBaseUrl}/api/v1/auth/password/sign-up`, { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-Stack-Access-Type": "client", + "X-Stack-Publishable-Client-Key": getEnvVariable("STACK_EMAIL_MONITOR_PUBLISHABLE_CLIENT_KEY"), + "X-Stack-Project-Id": getEnvVariable("STACK_EMAIL_MONITOR_PROJECT_ID"), + }, + body: JSON.stringify({ + email, + password, + verification_callback_url: getEnvVariable("STACK_EMAIL_MONITOR_VERIFICATION_CALLBACK_URL"), + }), }); - } + + const responseBody = await response.text(); + + if (!response.ok) { + throw new StackAssertionError(`Sign-up failed: ${response.status} - ${responseBody}`, { + responseBody, + }); + } + }); }; const isExpectedVerificationEmail = (email: ResendEmail, testEmail: string): boolean => { @@ -99,25 +102,29 @@ const isExpectedVerificationEmail = (email: ResendEmail, testEmail: string): boo }; const waitForVerificationEmail = async (testEmail: string, useInbucket: boolean) => { - const MAX_POLL_ATTEMPTS = 24; - const POLL_INTERVAL_MS = 5000; + await traceSpan("waiting for verification email", async () => { + const MAX_POLL_ATTEMPTS = 24; + const POLL_INTERVAL_MS = 5000; - for (let attempt = 1; attempt <= MAX_POLL_ATTEMPTS; attempt++) { - await wait(POLL_INTERVAL_MS); + for (let attempt = 1; attempt <= MAX_POLL_ATTEMPTS; attempt++) { + await traceSpan(`waiting for verification email - attempt ${attempt}`, async () => { + await wait(POLL_INTERVAL_MS); - const listData = useInbucket - ? await fetchFromInbucket(testEmail) - : await fetchFromResend(); + const listData = useInbucket + ? await fetchFromInbucket(testEmail) + : await fetchFromResend(); - const emails = listData.data; - const verificationEmail = emails.find((email) => isExpectedVerificationEmail(email, testEmail)); + const emails = listData.data; + const verificationEmail = emails.find((email) => isExpectedVerificationEmail(email, testEmail)); - if (verificationEmail) { - return; + if (verificationEmail) { + return; + } + }); } - } - throw new StackAssertionError(`Couldn't find verification email in time limit`, { recipient_email: testEmail, max_poll_attempts: MAX_POLL_ATTEMPTS, poll_interval_ms: POLL_INTERVAL_MS }); + throw new StackAssertionError(`Couldn't find verification email in time limit`, { recipient_email: testEmail, max_poll_attempts: MAX_POLL_ATTEMPTS, poll_interval_ms: POLL_INTERVAL_MS }); + }); }; export const POST = createSmartRouteHandler({ From 097c0310c44c33d386c447614a75e5adc2ac4c6f Mon Sep 17 00:00:00 2001 From: Konstantin Wohlwend Date: Tue, 3 Feb 2026 10:00:30 -0800 Subject: [PATCH 2/5] Check all users when verifying data integrity --- .../scripts/verify-data-integrity/index.ts | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/apps/backend/scripts/verify-data-integrity/index.ts b/apps/backend/scripts/verify-data-integrity/index.ts index 2705ab420..3ab0ed2f0 100644 --- a/apps/backend/scripts/verify-data-integrity/index.ts +++ b/apps/backend/scripts/verify-data-integrity/index.ts @@ -79,6 +79,10 @@ async function main() { const shouldSkipNeon = flags.includes("--skip-neon"); const recentFirst = flags.includes("--recent-first"); const noBail = flags.includes("--no-bail"); + const maxUsersPerProjectFlag = flags.find(f => f.startsWith("--max-users-per-project=")); + const maxUsersPerProject = maxUsersPerProjectFlag + ? parseInt(maxUsersPerProjectFlag.split("=")[1], 10) + : Infinity; const { recurse, collectedErrors } = createRecurse({ noBail }); @@ -147,7 +151,9 @@ async function main() { console.warn("Using mock Stripe server (STACK_STRIPE_SECRET_KEY=sk_test_mockstripekey); skipping Stripe payout integrity checks."); } - const maxUsersPerProject = 100; + if (maxUsersPerProject !== Infinity) { + console.log(`Will check at most ${maxUsersPerProject} users per project.`); + } const endAt = Math.min(startAt + count, projects.length); for (let i = startAt; i < endAt; i++) { @@ -157,7 +163,7 @@ async function main() { return; } - const [currentProject, users, projectPermissionDefinitions, teamPermissionDefinitions] = await Promise.all([ + const [currentProject, projectPermissionDefinitions, teamPermissionDefinitions] = await Promise.all([ expectStatusCode(200, `/api/v1/internal/projects/current`, { method: "GET", headers: { @@ -166,14 +172,6 @@ async function main() { "x-stack-development-override-key": getEnvVariable("STACK_SEED_INTERNAL_PROJECT_SUPER_SECRET_ADMIN_KEY"), }, }), - expectStatusCode(200, `/api/v1/users?limit=${maxUsersPerProject}`, { - method: "GET", - headers: { - "x-stack-project-id": projectId, - "x-stack-access-type": "admin", - "x-stack-development-override-key": getEnvVariable("STACK_SEED_INTERNAL_PROJECT_SUPER_SECRET_ADMIN_KEY"), - }, - }), expectStatusCode(200, `/api/v1/project-permission-definitions`, { method: "GET", headers: { @@ -193,6 +191,30 @@ async function main() { ]); void currentProject; + // Fetch users with pagination + const PAGE_LIMIT = 1000; + const allUsers: any[] = []; + let cursor: string | undefined = undefined; + while (allUsers.length < maxUsersPerProject) { + const remainingToFetch = maxUsersPerProject - allUsers.length; + const limit = Math.min(PAGE_LIMIT, remainingToFetch); + const cursorParam: string = cursor ? `&cursor=${encodeURIComponent(cursor)}` : ""; + const usersPage = await expectStatusCode(200, `/api/v1/users?limit=${limit}${cursorParam}`, { + method: "GET", + headers: { + "x-stack-project-id": projectId, + "x-stack-access-type": "admin", + "x-stack-development-override-key": getEnvVariable("STACK_SEED_INTERNAL_PROJECT_SUPER_SECRET_ADMIN_KEY"), + }, + }); + allUsers.push(...usersPage.items); + if (!usersPage.pagination?.next_cursor) { + break; + } + cursor = usersPage.pagination.next_cursor; + } + const users = { items: allUsers.slice(0, maxUsersPerProject) }; + const tenancy = await getSoleTenancyFromProjectBranch(projectId, DEFAULT_BRANCH_ID, true); const paymentsConfig = tenancy ? (tenancy.config as OrganizationRenderedConfig).payments : undefined; const paymentsVerifier = tenancy && paymentsConfig From ebc8fc1f4e05c1ae6c6f83d870b76b344a9de277 Mon Sep 17 00:00:00 2001 From: Konstantin Wohlwend Date: Tue, 3 Feb 2026 10:02:02 -0800 Subject: [PATCH 3/5] Fix tests --- apps/backend/src/app/health/email/route.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/backend/src/app/health/email/route.tsx b/apps/backend/src/app/health/email/route.tsx index 5cd5a9def..b317ed42f 100644 --- a/apps/backend/src/app/health/email/route.tsx +++ b/apps/backend/src/app/health/email/route.tsx @@ -107,7 +107,7 @@ const waitForVerificationEmail = async (testEmail: string, useInbucket: boolean) const POLL_INTERVAL_MS = 5000; for (let attempt = 1; attempt <= MAX_POLL_ATTEMPTS; attempt++) { - await traceSpan(`waiting for verification email - attempt ${attempt}`, async () => { + const done = await traceSpan(`waiting for verification email - attempt ${attempt}`, async () => { await wait(POLL_INTERVAL_MS); const listData = useInbucket @@ -118,9 +118,14 @@ const waitForVerificationEmail = async (testEmail: string, useInbucket: boolean) const verificationEmail = emails.find((email) => isExpectedVerificationEmail(email, testEmail)); if (verificationEmail) { - return; + return true; } + + return false; }); + if (done) { + return; + } } throw new StackAssertionError(`Couldn't find verification email in time limit`, { recipient_email: testEmail, max_poll_attempts: MAX_POLL_ATTEMPTS, poll_interval_ms: POLL_INTERVAL_MS }); From 13cd1f0f2b1d590b3b1f61ff6d09859f584e8fe9 Mon Sep 17 00:00:00 2001 From: Konstantin Wohlwend Date: Tue, 3 Feb 2026 10:06:48 -0800 Subject: [PATCH 4/5] chore: update package versions --- apps/backend/package.json | 2 +- apps/dashboard/package.json | 2 +- apps/dev-launchpad/package.json | 2 +- apps/e2e/package.json | 2 +- apps/mock-oauth-server/package.json | 2 +- docs/package.json | 2 +- examples/cjs-test/package.json | 2 +- examples/convex/package.json | 2 +- examples/demo/package.json | 2 +- examples/docs-examples/package.json | 2 +- examples/e-commerce/package.json | 2 +- examples/js-example/package.json | 2 +- examples/lovable-react-18-example/package.json | 2 +- examples/middleware/package.json | 2 +- examples/react-example/package.json | 2 +- examples/supabase/package.json | 2 +- packages/init-stack/package.json | 2 +- packages/js/package.json | 2 +- packages/react/package.json | 2 +- packages/stack-sc/package.json | 2 +- packages/stack-shared/package.json | 2 +- packages/stack-ui/package.json | 2 +- packages/stack/package.json | 2 +- packages/template/package-template.json | 2 +- packages/template/package.json | 2 +- sdks/implementations/swift/package.json | 2 +- sdks/spec/package.json | 2 +- 27 files changed, 27 insertions(+), 27 deletions(-) diff --git a/apps/backend/package.json b/apps/backend/package.json index 5afad329e..da95683e2 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/stack-backend", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "type": "module", diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 1a4f7dc48..58b7cbe9a 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/stack-dashboard", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "scripts": { diff --git a/apps/dev-launchpad/package.json b/apps/dev-launchpad/package.json index cdc7d1162..a1bf79ea5 100644 --- a/apps/dev-launchpad/package.json +++ b/apps/dev-launchpad/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/dev-launchpad", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "scripts": { diff --git a/apps/e2e/package.json b/apps/e2e/package.json index 067f9837e..b06eb8c45 100644 --- a/apps/e2e/package.json +++ b/apps/e2e/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/e2e-tests", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "type": "module", diff --git a/apps/mock-oauth-server/package.json b/apps/mock-oauth-server/package.json index 1a7efafed..502faeb04 100644 --- a/apps/mock-oauth-server/package.json +++ b/apps/mock-oauth-server/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/mock-oauth-server", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "main": "index.js", diff --git a/docs/package.json b/docs/package.json index 7b220b107..65497bd2e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/stack-docs", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "description": "", "main": "index.js", diff --git a/examples/cjs-test/package.json b/examples/cjs-test/package.json index 7f800ea32..ba7240318 100644 --- a/examples/cjs-test/package.json +++ b/examples/cjs-test/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/example-cjs-test", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "scripts": { diff --git a/examples/convex/package.json b/examples/convex/package.json index d1b7b761e..6daeea015 100644 --- a/examples/convex/package.json +++ b/examples/convex/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/convex-example", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "scripts": { diff --git a/examples/demo/package.json b/examples/demo/package.json index 5d3b7c9bb..ecd6c5861 100644 --- a/examples/demo/package.json +++ b/examples/demo/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/example-demo-app", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "description": "", "private": true, diff --git a/examples/docs-examples/package.json b/examples/docs-examples/package.json index ba98f1fc8..2f19588f9 100644 --- a/examples/docs-examples/package.json +++ b/examples/docs-examples/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/docs-examples", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "description": "", "private": true, diff --git a/examples/e-commerce/package.json b/examples/e-commerce/package.json index ca1c01600..174ceac92 100644 --- a/examples/e-commerce/package.json +++ b/examples/e-commerce/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/e-commerce-demo", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "scripts": { diff --git a/examples/js-example/package.json b/examples/js-example/package.json index 0577cc8f2..536d982e5 100644 --- a/examples/js-example/package.json +++ b/examples/js-example/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/js-example", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "description": "", diff --git a/examples/lovable-react-18-example/package.json b/examples/lovable-react-18-example/package.json index 780f4e44c..abc718c54 100644 --- a/examples/lovable-react-18-example/package.json +++ b/examples/lovable-react-18-example/package.json @@ -1,7 +1,7 @@ { "name": "@stackframe/lovable-react-18-example", "private": true, - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "type": "module", "scripts": { diff --git a/examples/middleware/package.json b/examples/middleware/package.json index bd11468f3..70ae552b2 100644 --- a/examples/middleware/package.json +++ b/examples/middleware/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/example-middleware-demo", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "scripts": { diff --git a/examples/react-example/package.json b/examples/react-example/package.json index 589e1e397..ebcd56fea 100644 --- a/examples/react-example/package.json +++ b/examples/react-example/package.json @@ -1,7 +1,7 @@ { "name": "react-example", "private": true, - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "type": "module", "scripts": { diff --git a/examples/supabase/package.json b/examples/supabase/package.json index f25ae6737..2c2824cf9 100644 --- a/examples/supabase/package.json +++ b/examples/supabase/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/example-supabase", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "private": true, "scripts": { diff --git a/packages/init-stack/package.json b/packages/init-stack/package.json index 67d007b1a..3a2080b48 100644 --- a/packages/init-stack/package.json +++ b/packages/init-stack/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/init-stack", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "description": "The setup wizard for Stack. https://stack-auth.com", "main": "dist/index.js", diff --git a/packages/js/package.json b/packages/js/package.json index 240980213..aa1e2a09e 100644 --- a/packages/js/package.json +++ b/packages/js/package.json @@ -1,7 +1,7 @@ { "//": "THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template (FOR package.json FILES, PLEASE EDIT package-template.json)", "name": "@stackframe/js", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "sideEffects": false, "main": "./dist/index.js", diff --git a/packages/react/package.json b/packages/react/package.json index 8f8b355cf..808aff289 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,7 +1,7 @@ { "//": "THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template (FOR package.json FILES, PLEASE EDIT package-template.json)", "name": "@stackframe/react", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "sideEffects": false, "main": "./dist/index.js", diff --git a/packages/stack-sc/package.json b/packages/stack-sc/package.json index 86f1d94b2..f7c8d63f1 100644 --- a/packages/stack-sc/package.json +++ b/packages/stack-sc/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/stack-sc", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "exports": { "./force-react-server": { diff --git a/packages/stack-shared/package.json b/packages/stack-shared/package.json index 29016f8d3..3b3eb029a 100644 --- a/packages/stack-shared/package.json +++ b/packages/stack-shared/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/stack-shared", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "scripts": { "build": "rimraf dist && tsup-node", diff --git a/packages/stack-ui/package.json b/packages/stack-ui/package.json index b5b3501c2..cdb86b51d 100644 --- a/packages/stack-ui/package.json +++ b/packages/stack-ui/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/stack-ui", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/stack/package.json b/packages/stack/package.json index 1e3605fdb..a9db49bec 100644 --- a/packages/stack/package.json +++ b/packages/stack/package.json @@ -1,7 +1,7 @@ { "//": "THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template (FOR package.json FILES, PLEASE EDIT package-template.json)", "name": "@stackframe/stack", - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "sideEffects": false, "main": "./dist/index.js", diff --git a/packages/template/package-template.json b/packages/template/package-template.json index daa17e585..ee716f1f2 100644 --- a/packages/template/package-template.json +++ b/packages/template/package-template.json @@ -11,7 +11,7 @@ "//": "NEXT_LINE_PLATFORM template", "private": true, - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "sideEffects": false, "main": "./dist/index.js", diff --git a/packages/template/package.json b/packages/template/package.json index 8d7a3cd11..4a47a2ec3 100644 --- a/packages/template/package.json +++ b/packages/template/package.json @@ -2,7 +2,7 @@ "//": "THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template (FOR package.json FILES, PLEASE EDIT package-template.json)", "name": "@stackframe/template", "private": true, - "version": "2.8.63", + "version": "2.8.64", "repository": "https://github.com/stack-auth/stack-auth", "sideEffects": false, "main": "./dist/index.js", diff --git a/sdks/implementations/swift/package.json b/sdks/implementations/swift/package.json index 0a1ade2ee..c7a319c51 100644 --- a/sdks/implementations/swift/package.json +++ b/sdks/implementations/swift/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/swift-sdk", - "version": "2.8.63", + "version": "2.8.64", "private": true, "description": "Stack Auth Swift SDK", "scripts": { diff --git a/sdks/spec/package.json b/sdks/spec/package.json index f93d9d9fe..530335e58 100644 --- a/sdks/spec/package.json +++ b/sdks/spec/package.json @@ -1,6 +1,6 @@ { "name": "@stackframe/sdk-spec", - "version": "2.8.63", + "version": "2.8.64", "private": true, "description": "Stack Auth SDK specification files", "scripts": {} From 3370e637f12776dc512321248f6e017d280416db Mon Sep 17 00:00:00 2001 From: BilalG1 Date: Tue, 3 Feb 2026 11:22:28 -0800 Subject: [PATCH 5/5] test fixes (#1155) --- .github/workflows/e2e-api-tests.yaml | 16 ---------------- .../e2e-custom-base-port-api-tests.yaml | 15 --------------- .../workflows/e2e-source-of-truth-api-tests.yaml | 15 --------------- .../api/v1/external-db-sync-advanced.test.ts | 2 +- 4 files changed, 1 insertion(+), 47 deletions(-) diff --git a/.github/workflows/e2e-api-tests.yaml b/.github/workflows/e2e-api-tests.yaml index 8871aac7e..3c5bdb9a0 100644 --- a/.github/workflows/e2e-api-tests.yaml +++ b/.github/workflows/e2e-api-tests.yaml @@ -159,22 +159,6 @@ jobs: - name: Wait 10 seconds run: sleep 10 - - name: Prime external DB sync - run: | - set -euo pipefail - set -a - source apps/backend/.env.test.local - set +a - baseUrl="http://localhost:${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}02" - maxDurationMs="${STACK_EXTERNAL_DB_SYNC_MAX_DURATION_MS:-20000}" - for _ in 1 2 3; do - curl -fsS -H "Authorization: Bearer ${CRON_SECRET}" \ - "${baseUrl}/api/latest/internal/external-db-sync/sequencer?maxDurationMs=${maxDurationMs}&stopWhenIdle=true" >/dev/null - curl -fsS -H "Authorization: Bearer ${CRON_SECRET}" \ - "${baseUrl}/api/latest/internal/external-db-sync/poller?maxDurationMs=${maxDurationMs}&stopWhenIdle=true" >/dev/null - sleep 2 - done - - name: Run tests run: pnpm test run ${{ matrix.freestyle-mode == 'prod' && '--min-workers=1 --max-workers=1' || '' }} diff --git a/.github/workflows/e2e-custom-base-port-api-tests.yaml b/.github/workflows/e2e-custom-base-port-api-tests.yaml index 14aa2dc0e..e5ec1a16b 100644 --- a/.github/workflows/e2e-custom-base-port-api-tests.yaml +++ b/.github/workflows/e2e-custom-base-port-api-tests.yaml @@ -153,21 +153,6 @@ jobs: - name: Wait 10 seconds run: sleep 10 - - name: Prime external DB sync - run: | - set -euo pipefail - set -a - source apps/backend/.env.test.local - set +a - baseUrl="http://localhost:${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}02" - for _ in 1 2 3; do - curl -fsS -H "Authorization: Bearer ${CRON_SECRET}" \ - "${baseUrl}/api/latest/internal/external-db-sync/sequencer" >/dev/null - curl -fsS -H "Authorization: Bearer ${CRON_SECRET}" \ - "${baseUrl}/api/latest/internal/external-db-sync/poller" >/dev/null - sleep 2 - done - - name: Run tests run: pnpm test run diff --git a/.github/workflows/e2e-source-of-truth-api-tests.yaml b/.github/workflows/e2e-source-of-truth-api-tests.yaml index ad8a5ca3e..4bc17731d 100644 --- a/.github/workflows/e2e-source-of-truth-api-tests.yaml +++ b/.github/workflows/e2e-source-of-truth-api-tests.yaml @@ -160,21 +160,6 @@ jobs: - name: Wait 10 seconds run: sleep 10 - - name: Prime external DB sync - run: | - set -euo pipefail - set -a - source apps/backend/.env.test.local - set +a - baseUrl="http://localhost:${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}02" - for _ in 1 2 3; do - curl -fsS -H "Authorization: Bearer ${CRON_SECRET}" \ - "${baseUrl}/api/latest/internal/external-db-sync/sequencer" >/dev/null - curl -fsS -H "Authorization: Bearer ${CRON_SECRET}" \ - "${baseUrl}/api/latest/internal/external-db-sync/poller" >/dev/null - sleep 2 - done - - name: Run tests run: pnpm test run diff --git a/apps/e2e/tests/backend/endpoints/api/v1/external-db-sync-advanced.test.ts b/apps/e2e/tests/backend/endpoints/api/v1/external-db-sync-advanced.test.ts index 5812549e4..34b31f601 100644 --- a/apps/e2e/tests/backend/endpoints/api/v1/external-db-sync-advanced.test.ts +++ b/apps/e2e/tests/backend/endpoints/api/v1/external-db-sync-advanced.test.ts @@ -914,7 +914,7 @@ $$;`); expect(res.rows.length).toBe(1); expect(res.rows[0].display_name).toBe('Final Name'); expect(res.rows[0].id).toBe(newId); - }, TEST_TIMEOUT); + }, COMPLEX_SEQUENCE_TIMEOUT); /** * What it does: