From 978bc1e9fcecd8825a73c2fa63d2bc7eef5706bf Mon Sep 17 00:00:00 2001 From: Michael Hart Date: Thu, 8 Oct 2026 17:28:00 +1100 Subject: [PATCH 1/2] fix(test): make platform database tests timezone-independent --- TESTING.md | 7 +++ .../integration/db-github-members.test.ts | 13 ++++-- .../api/test/integration/db-template.test.ts | 46 +++++++++++++++++++ .../api/test/integration/db-template.ts | 6 ++- .../test/integration/operator-tenants.test.ts | 10 ++-- 5 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 platform/packages/api/test/integration/db-template.test.ts diff --git a/TESTING.md b/TESTING.md index 701a10599..122ee50b8 100644 --- a/TESTING.md +++ b/TESTING.md @@ -166,6 +166,13 @@ API integration fixtures reset their tables with one ordered SQL block. Use `cle than repeating per-table cleanup; it keeps foreign-key delete behavior and migration history intact in PGlite and PostgreSQL. +The cached PGlite database template persists a UTC session default, independently of the +creating or consuming process's timezone. Increment `TEMPLATE_VERSION` in +`platform/packages/api/test/integration/db-template.ts` when changing template configuration +so existing local dumps are rebuilt. For database-clock assertions, compare timestamps in SQL; +JavaScript interprets timestamps without a timezone as local time. Keep explicit non-UTC +regressions for behavior that must work across timezones. + Platform CI runs the candidate's PostgreSQL concurrency cases in a separate job. The selector finds API integration files that read `process.env.VOID_TEST_DATABASE_URL`, excluding mentions in comments or strings. Each selected file runs against its own database clone, with two files diff --git a/platform/packages/api/test/integration/db-github-members.test.ts b/platform/packages/api/test/integration/db-github-members.test.ts index 374df3eb8..105ebe2b8 100644 --- a/platform/packages/api/test/integration/db-github-members.test.ts +++ b/platform/packages/api/test/integration/db-github-members.test.ts @@ -73,10 +73,15 @@ describe('github_installation_members', () => { expect(row.github_account_id).toBe('gh-acct-1'); expect(row.verified_at).not.toBeNull(); - // expires_at ≈ now + TTL (allow a generous window for test clock jitter). - const skewSeconds = (new Date(row.expires_at).getTime() - Date.now()) / 1000; - expect(skewSeconds).toBeGreaterThan(MEMBERSHIP_TTL_SECONDS - 120); - expect(skewSeconds).toBeLessThan(MEMBERSHIP_TTL_SECONDS + 120); + // Both timestamps use the DB clock. Compare there instead of interpreting + // a timestamp without timezone as the JavaScript process's local time. + const [lifetime] = await env.db + .select({ + seconds: sql`extract(epoch from (${githubInstallationMembers.expires_at} - ${githubInstallationMembers.verified_at}))`, + }) + .from(githubInstallationMembers) + .where(eq(githubInstallationMembers.id, row.id)); + expect(Number(lifetime!.seconds)).toBe(MEMBERSHIP_TTL_SECONDS); }); it('upsert on the same (installation, user) refreshes in place and keeps count == 1', async () => { diff --git a/platform/packages/api/test/integration/db-template.test.ts b/platform/packages/api/test/integration/db-template.test.ts new file mode 100644 index 000000000..bc1121cba --- /dev/null +++ b/platform/packages/api/test/integration/db-template.test.ts @@ -0,0 +1,46 @@ +import { execFile } from 'node:child_process'; +import { mkdtemp, rm } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { promisify } from 'node:util'; +import { expect, it } from 'vite-plus/test'; + +const exec = promisify(execFile); + +it('reuses a UTC database template across processes with different local timezones', async () => { + const directory = await mkdtemp(join(tmpdir(), 'void-api-template-timezone-')); + const script = ` + import { PGlite } from ${JSON.stringify(import.meta.resolve('@electric-sql/pglite'))}; + import { + ensurePGliteTemplateBundlePath, + loadPGliteTemplateBundle, + } from ${JSON.stringify(new URL('./db-template.ts', import.meta.url).href)}; + const path = await ensurePGliteTemplateBundlePath(); + if (process.argv[1] === 'create') { + console.log(JSON.stringify({ path })); + } else { + const db = new PGlite({ loadDataDir: await loadPGliteTemplateBundle() }); + try { + const { rows } = await db.query('SHOW TimeZone'); + console.log(JSON.stringify({ path, timezone: rows[0].TimeZone })); + } finally { + await db.close(); + } + } + `; + try { + const run = async (timezone: string, mode: 'create' | 'restore') => { + const { stdout } = await exec(process.execPath, ['--input-type=module', '-e', script, mode], { + env: { ...process.env, TMPDIR: directory, TMP: directory, TEMP: directory, TZ: timezone }, + timeout: 10_000, + }); + return JSON.parse(stdout) as { path: string; timezone: string }; + }; + const created = await run('Australia/Melbourne', 'create'); + const reused = await run('America/Los_Angeles', 'restore'); + expect(reused.timezone).toBe('UTC'); + expect(reused.path).toBe(created.path); + } finally { + await rm(directory, { recursive: true, force: true }); + } +}, 15_000); diff --git a/platform/packages/api/test/integration/db-template.ts b/platform/packages/api/test/integration/db-template.ts index a5a35d991..63a23933e 100644 --- a/platform/packages/api/test/integration/db-template.ts +++ b/platform/packages/api/test/integration/db-template.ts @@ -10,7 +10,7 @@ import { migrate } from 'drizzle-orm/pglite/migrator'; import * as schema from '../../src/schema.ts'; const MIGRATIONS_DIR = fileURLToPath(new URL('../../drizzle', import.meta.url)); -const TEMPLATE_VERSION = '2'; +const TEMPLATE_VERSION = '3'; function walkFiles(dir: string): Array { const entries = readdirSync(dir, { withFileTypes: true }).sort((a, b) => @@ -48,7 +48,9 @@ const TEMPLATE_BUNDLE_PATH = join(tmpdir(), `void-api-pglite-${getTemplateHash() async function buildTemplateBundle(path: string): Promise { const tempPath = `${path}.${process.pid}.${Date.now().toString(36)}.tmp`; - const db = new PGlite({ relaxedDurability: true }); + // Persist a timezone-independent default in the dump, rather than capturing + // the creating process's local timezone (including its DST offset). + const db = new PGlite({ postgresqlconf: "timezone = 'UTC'", relaxedDurability: true }); try { await migrate(drizzle(db, { schema }), { migrationsFolder: MIGRATIONS_DIR }); diff --git a/platform/packages/api/test/integration/operator-tenants.test.ts b/platform/packages/api/test/integration/operator-tenants.test.ts index bbb6b248e..e1f9e10ca 100644 --- a/platform/packages/api/test/integration/operator-tenants.test.ts +++ b/platform/packages/api/test/integration/operator-tenants.test.ts @@ -1,4 +1,4 @@ -import { eq } from 'drizzle-orm'; +import { eq, sql } from 'drizzle-orm'; import { afterAll, afterEach, @@ -490,10 +490,14 @@ describe('operator tenant mutations', () => { expect(former.ends_at).toBe(current.starts_at); expect(current).toMatchObject({ ends_at: null, changed_by_user_id: operatorAdminId }); const [revokedCredential] = await env.db - .select() + .select({ + // Ownership periods use timestamp, credentials use timestamptz. Let + // PostgreSQL interpret its own session timezone when comparing them. + sameTransferInstant: sql`${projectDeployCredentials.revoked_at} = ${current.starts_at}::timestamp::timestamptz`, + }) .from(projectDeployCredentials) .where(eq(projectDeployCredentials.id, 'transfer-deploy-credential')); - expect(Date.parse(revokedCredential!.revoked_at!)).toBe(Date.parse(current.starts_at)); + expect(revokedCredential!.sameTransferInstant).toBe(true); expect(counterCalls).toEqual([ { ownerId: owner.id, From 214acdaa8fc917e07ed576af1dce3a6cc740e927 Mon Sep 17 00:00:00 2001 From: Michael Hart Date: Thu, 8 Oct 2026 17:28:10 +1100 Subject: [PATCH 2/2] feat(platform): add a welcome page with connection instructions --- .../platform/installation/first-deployment.md | 2 + .../meta/screenshots/platform-welcome.png | Bin 0 -> 82206 bytes platform/packages/api/README.md | 1 + platform/packages/api/src/index.ts | 27 ++++++++++ .../platform-access-protection.test.ts | 8 +++ .../integration/platform-onboarding.test.ts | 48 +++++++++++++++++- 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 platform/meta/screenshots/platform-welcome.png diff --git a/docs/guide/platform/installation/first-deployment.md b/docs/guide/platform/installation/first-deployment.md index 8507272af..c69b77f15 100644 --- a/docs/guide/platform/installation/first-deployment.md +++ b/docs/guide/platform/installation/first-deployment.md @@ -4,6 +4,8 @@ outline: deep # First Deployment +Open your platform's API URL in a browser to see its welcome page, CLI connection instructions, and a link to the administrator dashboard. Share this URL with teammates so they can connect to your platform. + First verify the new platform and sign in with the administrator login method selected during setup: ```sh diff --git a/platform/meta/screenshots/platform-welcome.png b/platform/meta/screenshots/platform-welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..3396bffb24adb4313e754f5ae434d345fb5a5201 GIT binary patch literal 82206 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%0Ao~5!&!qG-4W9_bj9F9Ep$+i%1CwHG36Z$)zJ% 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 literal 0 HcmV?d00001 diff --git a/platform/packages/api/README.md b/platform/packages/api/README.md index 2d62ebecc..3855fdbdc 100644 --- a/platform/packages/api/README.md +++ b/platform/packages/api/README.md @@ -82,6 +82,7 @@ drizzle/ ### Public API +- `GET /` — server-rendered welcome page with the platform name, CLI installation and connection instructions, and links to the administrator dashboard and Void quickstart. - `GET /health` - `GET /auth/login` - `GET /auth/callback` diff --git a/platform/packages/api/src/index.ts b/platform/packages/api/src/index.ts index e26dc239f..d2b588558 100644 --- a/platform/packages/api/src/index.ts +++ b/platform/packages/api/src/index.ts @@ -505,6 +505,33 @@ const app = new Hono() supportedClassifierVersions: [1], }), ) + .get('/', (context) => { + const name = escapeHtml(getPlatformDisplayName(context.env, context.req.url)); + const command = escapeHtml( + platformConnectCommand(getPlatformApiUrl(context.env, context.req.url)), + ); + context.header('Cache-Control', 'no-store'); + return context.html(` + + + +${escapeHtml(getPlatformPageTitle('Welcome', context.env, context.req.url))} + + +`); + }) .get('/signup-restricted', (context) => { const name = escapeHtml(getPlatformDisplayName(context.env, context.req.url)); return context.html(` diff --git a/platform/packages/api/test/integration/platform-access-protection.test.ts b/platform/packages/api/test/integration/platform-access-protection.test.ts index 79f70e85c..b3466d939 100644 --- a/platform/packages/api/test/integration/platform-access-protection.test.ts +++ b/platform/packages/api/test/integration/platform-access-protection.test.ts @@ -150,6 +150,14 @@ async function githubSignature(body: string): Promise { } describe('Access-protected platform requests', () => { + it('requires human Access identity to view the welcome page', async () => { + expect((await request('/')).status).toBe(403); + expect((await request('/', await assertion({ service: true }))).status).toBe(403); + const response = await request('/', await assertion()); + expect(response.status).toBe(200); + expect(await response.text()).toContain('Welcome to Void Platform'); + }); + it('keeps maintenance status behind human Access and a matching, revocable administrator session', async () => { const session = await createHumanSession(env.db, env.JWT_SECRET, { userId: user.id, diff --git a/platform/packages/api/test/integration/platform-onboarding.test.ts b/platform/packages/api/test/integration/platform-onboarding.test.ts index a78fab4cb..3fb42700b 100644 --- a/platform/packages/api/test/integration/platform-onboarding.test.ts +++ b/platform/packages/api/test/integration/platform-onboarding.test.ts @@ -1,3 +1,4 @@ +import { PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE } from '@void/platform'; import { afterAll, beforeAll, describe, expect, it } from 'vite-plus/test'; import app from '../../src/index.ts'; import { setupEnv, teardownEnv, type TestEnv } from './helpers.ts'; @@ -11,6 +12,48 @@ afterAll(async () => { }); describe('platform onboarding pages', () => { + it('welcomes visitors at the API root with this platform’s connection instructions', async () => { + const response = await app.fetch( + new Request('https://alias.example.com/', { + headers: { 'X-Forwarded-Host': 'attacker.example', 'X-Forwarded-Proto': 'http' }, + }), + { + ...env, + AUTH_REDIRECT_URI: 'https://api.example.com/auth/callback', + PLATFORM_DISPLAY_NAME: '', + PLATFORM_INSTALLATION_ID: 'example-installation', + }, + ); + expect(response.status).toBe(200); + expect(response.headers.get('Content-Type')).toContain('text/html'); + expect(response.headers.get('Cache-Control')).toBe('no-store'); + const html = await response.text(); + expect(html).toContain('

Welcome to <Example Platform>

'); + expect(html).toContain('Welcome · <Example Platform> · Void'); + expect(html).toContain('npm install -g void'); + expect(html).toContain('void connect 'https://api.example.com''); + expect(html).toContain('href="/admin/"'); + expect(html).toContain('href="https://void.cloud/guide/quickstart"'); + expect(html).not.toContain(''); + expect(html).not.toContain('attacker.example'); + expect(html).not.toContain('alias.example.com'); + expect(html).not.toContain(' { + await env.ROUTING.put(PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE); + try { + const response = await app.fetch(new Request('https://api.example.com/'), { + ...env, + PLATFORM_INSTALLATION_ID: 'example-installation', + }); + expect(response.status).toBe(503); + expect(await response.json()).toEqual({ error: 'Platform disabled' }); + } finally { + await env.ROUTING.delete(PLATFORM_DISABLED_KEY); + } + }); + it('shows the configured platform identity and connection, ignoring forwarded origins', async () => { const response = await app.fetch( new Request('https://alias.example.com/invite', { @@ -98,7 +141,7 @@ describe('platform onboarding pages', () => { expect(html).not.toContain('evil.example'); }); - it.each(['/invite', '/signup-restricted'])( + it.each(['/', '/invite', '/signup-restricted'])( 'uses a generic name for source deployments at %s', async (path) => { const response = await app.fetch( @@ -111,6 +154,9 @@ describe('platform onboarding pages', () => { const html = await response.text(); expect(html).toContain('Void Platform'); expect(html).not.toContain('Void Cloud'); + if (path === '/') { + expect(html).toContain('void connect 'https://api.example.com''); + } }, );
+

Welcome to ${name}

+

This is a Void platform. Connect the Void CLI to deploy and manage your applications here.

+

Connect to this platform

+

Install the Void CLI if you haven't already:

+
npm install -g void
+

From a new or unlinked Void app directory, connect to this platform:

+
${command}
+

The CLI opens your browser to sign in when needed. If access is restricted, ask your platform administrator for an invitation and sign in with the invited email address.

+

Ready to deploy? Run void deploy from your application's directory. To create a new application, follow the Void quickstart, then connect it to this platform before deploying.

+

Administration

+

Platform administrators can open the administrator dashboard to manage this instance. If you're setting up the first administrator, you'll be guided through setup.

+