Skip to content

Commit ebca016

Browse files
Merge pull request #19 from ScriptedAlchemy/test/workbench-route-helpers
test(workbench): adopt the shared packed-release harness and route helper
2 parents bf8773a + 062b336 commit ebca016

11 files changed

Lines changed: 78 additions & 218 deletions

‎packages/workbench/tests/artifacts-real.e2e.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { expect } from '@rstest/playwright';
33
import { createWorkbenchAssetSource } from '../../agent-bundle/src/dev/workbench-assets.ts';
44
import { startDevServer } from '../../agent-bundle/src/dev/workbench-server.ts';
55
import { createProjectFixture, removeProjectFixture } from '../../agent-bundle/tests/helpers/project-fixture.ts';
6-
import { buildWorkbench, e2e, workbenchAssets } from './support/workbench-e2e.ts';
6+
import { buildWorkbench, e2e, workbenchAssets, workbenchUrl } from './support/workbench-e2e.ts';
77

88
const browserTimeout = 12_000;
99

@@ -19,7 +19,7 @@ e2e('contains the mounted Artifacts page and its table at desktop and 390px widt
1919
try {
2020
const pageErrors: Error[] = [];
2121
page.on('pageerror', (error) => pageErrors.push(error));
22-
await page.goto(`${server.url}#artifacts`);
22+
await page.goto(workbenchUrl(server.url, 'artifacts'));
2323
await expect(page.getByRole('heading', { name: 'Artifacts' })).toBeVisible({ timeout: browserTimeout });
2424
await expect(page.locator('.artifact-table').first()).toBeVisible({ timeout: browserTimeout });
2525
expect(await page.evaluate(() => document.documentElement.scrollWidth <= window.innerWidth)).toBe(true);

‎packages/workbench/tests/evals-real.e2e.test.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { seedEvalProject, writeEvalSuite } from '../../agent-bundle/tests/suppor
1515
import { readFinalizedEvalRun } from '../src/evals/evals-page.tsx';
1616
import { closeServer } from './support/http.ts';
1717
import { workbenchBrowserAliases } from './support/workbench-browser-modules.ts';
18-
import { buildWorkbench, e2e, workbenchAssets, workspaceRoot } from './support/workbench-e2e.ts';
18+
import { buildWorkbench, e2e, workbenchAssets, workspaceRoot, workbenchUrl } from './support/workbench-e2e.ts';
1919

2020
const evalsPage = join(workspaceRoot, 'packages', 'workbench', 'src', 'evals', 'evals-page.tsx');
2121
const browserTimeout = 12_000;
@@ -228,7 +228,7 @@ e2e('admits a deterministic Eval promptly and renders refreshed durable evidence
228228
page.on('request', (request) => {
229229
if (request.method() === 'GET' && request.url().includes('/api/evals/runs/')) durableReads.push(request.url());
230230
});
231-
await page.goto(`${server.url}#evals`);
231+
await page.goto(workbenchUrl(server.url, 'evals'));
232232
await expect(page.getByRole('heading', { name: 'Evals' })).toBeVisible({ timeout: browserTimeout });
233233
await expect(page.getByRole('button', { name: 'Run deterministic suite' })).toBeEnabled({ timeout: browserTimeout });
234234
await expect(page.getByLabel('Harness')).toHaveValue('deterministic');
@@ -326,7 +326,7 @@ e2e('keeps a gated deterministic run cancellable exactly once and rejects stale
326326
await heldCancel;
327327
await route.continue();
328328
});
329-
await page.goto(`${server.url}#evals`);
329+
await page.goto(workbenchUrl(server.url, 'evals'));
330330
await expect(page.getByRole('heading', { name: 'Evals' })).toBeVisible({ timeout: browserTimeout });
331331
await page.getByLabel('Suite').selectOption('gated-cancel');
332332
const admitted = page.waitForResponse((response) =>
@@ -381,7 +381,7 @@ e2e('does not cancel a gated run when a newer admission replaces it or the Eval
381381
page.on('request', (request) => {
382382
if (request.method() === 'POST' && request.url().includes('/cancel')) cancellations += 1;
383383
});
384-
await page.goto(`${server.url}#evals`);
384+
await page.goto(workbenchUrl(server.url, 'evals'));
385385
await expect(page.getByRole('heading', { name: 'Evals' })).toBeVisible({ timeout: browserTimeout });
386386
await page.getByLabel('Suite').selectOption('gated-cancel');
387387
const firstAdmission = page.waitForResponse((response) =>
@@ -397,7 +397,7 @@ e2e('does not cancel a gated run when a newer admission replaces it or the Eval
397397
await expect(page.locator('.eval-summary')).toContainText(replacement.run.id, { timeout: browserTimeout });
398398
await page.waitForTimeout(150);
399399
await expect(page.locator('.eval-summary')).not.toContainText(first.run.id);
400-
await page.goto(`${server.url}#overview`);
400+
await page.goto(workbenchUrl(server.url, 'overview'));
401401
await expect(page.getByRole('heading', { name: 'Bundle dashboard' })).toBeVisible({ timeout: browserTimeout });
402402
expect(cancellations).toBe(0);
403403
} finally {

‎packages/workbench/tests/examples-real.e2e.test.ts‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
waitForSettledWorkbench,
1515
writeExampleReport,
1616
} from './support/example-acceptance.ts';
17-
import { buildWorkbench, e2e, workbenchAssets } from './support/workbench-e2e.ts';
17+
import { buildWorkbench, e2e, workbenchAssets, workbenchUrl } from './support/workbench-e2e.ts';
1818

1919
const browserTimeout = 15_000;
2020

@@ -48,7 +48,7 @@ e2e('drives the populated Skills Starter in real Chrome', { timeout: 90_000 }, a
4848
});
4949
const ledger = createExampleErrorLedger(page, server.url);
5050
try {
51-
await page.goto(`${server.url}#skills`);
51+
await page.goto(workbenchUrl(server.url, 'skills'));
5252
await waitForSettledWorkbench(page);
5353
await expect(page.getByRole('heading', { name: 'dependency-upgrade', exact: true })).toBeVisible({ timeout: browserTimeout });
5454
await expect(page.locator('.skill-tree-item')).toHaveCount(3, { timeout: browserTimeout });
@@ -73,7 +73,7 @@ e2e('drives the populated Skills Starter in real Chrome', { timeout: 90_000 }, a
7373
);
7474
await captureExampleState(page, 'skills-starter', 'skills-populated');
7575

76-
await page.goto(`${server.url}#hooks`);
76+
await page.goto(workbenchUrl(server.url, 'hooks'));
7777
await waitForSettledWorkbench(page);
7878
await expect(page).toHaveURL(new URL('#overview', server.url).href, { timeout: browserTimeout });
7979
await expect(page.getByRole('heading', { name: 'Bundle dashboard', exact: true })).toBeVisible({ timeout: browserTimeout });
@@ -126,7 +126,7 @@ e2e('reveals, retains, repairs, and removes capabilities without reloading Chrom
126126
expect(status).toBe(200);
127127
};
128128
try {
129-
await page.goto(`${server.url}#hooks`);
129+
await page.goto(workbenchUrl(server.url, 'hooks'));
130130
await waitForSettledWorkbench(page);
131131
await expect(page).toHaveURL(new URL('#overview', server.url).href, { timeout: browserTimeout });
132132
await expect(page.getByRole('link', { name: 'Hooks', exact: true })).toHaveCount(0, { timeout: browserTimeout });
@@ -187,7 +187,7 @@ e2e('drives Hooks, scripts, logs, diagnostics, and repair in real Chrome', { tim
187187
});
188188
const ledger = createExampleErrorLedger(page, server.url);
189189
try {
190-
await page.goto(`${server.url}#hooks`);
190+
await page.goto(workbenchUrl(server.url, 'hooks'));
191191
await waitForSettledWorkbench(page);
192192
await expect(page.locator('#hook-binding option')).not.toHaveCount(0, { timeout: browserTimeout });
193193
const canonicalHookDraft = JSON.stringify({
@@ -285,7 +285,7 @@ e2e('drives every populated MCP App workflow surface in real Chrome', { timeout:
285285
});
286286
const ledger = createExampleErrorLedger(page, server.url);
287287
try {
288-
await page.goto(`${server.url}#overview`);
288+
await page.goto(workbenchUrl(server.url, 'overview'));
289289
await waitForSettledWorkbench(page);
290290
await expect(page.getByRole('heading', { name: 'Bundle dashboard', exact: true })).toBeVisible({ timeout: browserTimeout });
291291
await expect(page.getByText('See what this bundle publishes, try supported workflows, and rebuild after source changes.', { exact: true })).toBeVisible({ timeout: browserTimeout });

‎packages/workbench/tests/inspector-shell.e2e.test.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { agentBundleNodeModules, workbenchNodeModules } from '../../agent-bundle
77
import { createWorkbenchAssetSource } from '../../agent-bundle/src/dev/workbench-assets.ts';
88
import { startDevServer } from '../../agent-bundle/src/dev/workbench-server.ts';
99
import { createProjectFixture, removeProjectFixture } from '../../agent-bundle/tests/helpers/project-fixture.ts';
10-
import { e2e, execFile, workbenchAssets, workspaceRoot } from './support/workbench-e2e.ts';
10+
import { e2e, execFile, workbenchAssets, workspaceRoot, workbenchUrl } from './support/workbench-e2e.ts';
1111

1212
const browserTimeout = 5_000;
1313

@@ -83,7 +83,7 @@ e2e('treats an unsupported Inspector hash as the overview without opening an MCP
8383
if (request.url() === `${server.url}/api/mcp/sessions` && request.method() === 'POST') sessionPosts += 1;
8484
});
8585

86-
await page.goto(`${server.url}#inspector`);
86+
await page.goto(workbenchUrl(server.url, 'inspector'));
8787
await expect(page).toHaveURL(/#inspector$/u, { timeout: browserTimeout });
8888
await expect(page.getByRole('heading', { name: 'Bundle dashboard' })).toBeVisible({ timeout: browserTimeout });
8989
await expect(page.getByRole('link', { name: 'Overview' })).toHaveAttribute('aria-current', 'page');
@@ -114,7 +114,7 @@ e2e('shares one real session between the MCP Playground and Inspector presentati
114114
if (request.url() === `${server.url}/api/mcp/sessions` && request.method() === 'POST') sessionPosts += 1;
115115
});
116116

117-
await page.goto(`${server.url}#mcp`);
117+
await page.goto(workbenchUrl(server.url, 'mcp'));
118118
const playgroundTab = page.getByRole('tab', { name: 'Playground' });
119119
const inspectorTab = page.getByRole('tab', { name: 'Inspector' });
120120
const presentationHistoryLength = await page.evaluate(() => window.history.length);
@@ -246,7 +246,7 @@ e2e('mounts the internal Inspector presentation from an explicit development-mod
246246
try {
247247
const pageErrors: Error[] = [];
248248
page.on('pageerror', (error) => pageErrors.push(error));
249-
await page.goto(`${server.url}#mcp`);
249+
await page.goto(workbenchUrl(server.url, 'mcp'));
250250
const inspectorTab = page.getByRole('tab', { name: 'Inspector' });
251251
await inspectorTab.click();
252252
await expect(inspectorTab).toHaveAttribute('aria-selected', 'true');

‎packages/workbench/tests/logs-real.e2e.test.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { expect } from '@rstest/playwright';
55
import { createWorkbenchAssetSource } from '../../agent-bundle/src/dev/workbench-assets.ts';
66
import { startDevServer } from '../../agent-bundle/src/dev/workbench-server.ts';
77
import { createProjectFixture, removeProjectFixture } from '../../agent-bundle/tests/helpers/project-fixture.ts';
8-
import { buildWorkbench, e2e, workbenchAssets } from './support/workbench-e2e.ts';
8+
import { buildWorkbench, e2e, workbenchAssets, workbenchUrl } from './support/workbench-e2e.ts';
99

1010
const browserTimeout = 12_000;
1111

@@ -25,7 +25,7 @@ e2e('shows real producer logs with replay, filters, redaction, responsive layout
2525
const url = new URL(response.url());
2626
return url.origin === server.url && url.pathname === '/api/logs/replay' && url.searchParams.get('after') === '0' && response.ok();
2727
});
28-
await page.goto(`${server.url}#logs`);
28+
await page.goto(workbenchUrl(server.url, 'logs'));
2929
await expect(page.getByRole('heading', { name: 'Logs' })).toBeVisible({ timeout: browserTimeout });
3030
const replay = await (await replayed).json() as { readonly replay: Readonly<{ readonly records: readonly unknown[] }> };
3131
expect(replay.replay.records.length).toBeGreaterThan(0);
@@ -40,9 +40,9 @@ e2e('shows real producer logs with replay, filters, redaction, responsive layout
4040
await expect(page.locator('.logs-entry-source').first()).toHaveText('project', { timeout: browserTimeout });
4141
await page.locator('#logs-producer').selectOption('');
4242
const replayCount = await page.locator('.logs-entries > li').count();
43-
await page.goto(`${server.url}#overview`);
43+
await page.goto(workbenchUrl(server.url, 'overview'));
4444
await expect(page.getByRole('heading', { name: 'Bundle dashboard' })).toBeVisible({ timeout: browserTimeout });
45-
await page.goto(`${server.url}#logs`);
45+
await page.goto(workbenchUrl(server.url, 'logs'));
4646
await expect(page.getByRole('heading', { name: 'Logs' })).toBeVisible({ timeout: browserTimeout });
4747
const replayedSequences = await page.waitForFunction(
4848
({ count, selector }) => {

‎packages/workbench/tests/mcp-app-real.e2e.test.ts‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { createWorkbenchAssetSource } from '../../agent-bundle/src/dev/workbench
1111
import { startDevServer } from '../../agent-bundle/src/dev/workbench-server.ts';
1212
import { createProjectFixture, removeProjectFixture } from '../../agent-bundle/tests/helpers/project-fixture.ts';
1313
import { startRuntimePlaygroundFixture } from './helpers/runtime-playground-fixture.ts';
14+
import { workbenchUrl } from './support/workbench-e2e.ts';
1415

1516
const workspaceRoot = process.cwd();
1617
const workbenchAssets = join(workspaceRoot, 'packages', 'workbench', 'dist');
@@ -255,7 +256,7 @@ e2e('runs a generated SDK-v2 App through the real foreground session and separat
255256
}).catch(() => undefined);
256257
});
257258

258-
await page.goto(`${foregroundOrigin}#mcp`);
259+
await page.goto(workbenchUrl(foregroundOrigin, 'mcp'));
259260
await expect(page.getByRole('heading', { name: 'MCP playground' })).toBeVisible({ timeout: browserTimeout });
260261
await page.locator('#mcp-target').selectOption('portable');
261262
await page.locator('#mcp-server-name').fill('fixture');
@@ -553,7 +554,7 @@ e2e('opens the real RSC runtime timeline App from provider-owned run evidence',
553554
}).catch(() => undefined);
554555
});
555556
try {
556-
await page.goto(`${fixture.url}#runtime`);
557+
await page.goto(workbenchUrl(fixture.url, 'runtime'));
557558
await expect(page.getByRole('heading', { name: 'Runtime Playground' })).toBeVisible({ timeout: 15_000 });
558559
const runtimeIdentity = page.locator('[data-runtime-provider-session]');
559560
const runtimeSurface = page.getByLabel('Runtime surface');
@@ -1430,7 +1431,7 @@ e2e('keeps Portable, ChatGPT, and Claude simulated App profiles isolated over on
14301431
}).catch(() => undefined);
14311432
});
14321433
try {
1433-
await page.goto(`${fixture.url}#runtime`);
1434+
await page.goto(workbenchUrl(fixture.url, 'runtime'));
14341435
await expect(page.getByRole('heading', { name: 'Runtime Playground' })).toBeVisible({ timeout: 15_000 });
14351436
const runtimeIdentity = page.locator('[data-runtime-provider-session]');
14361437
const runtimeSurface = page.getByLabel('Runtime surface');
@@ -1648,7 +1649,7 @@ e2e('renders a compiler-bundled App template through the canonical sandbox URL',
16481649
}
16491650
});
16501651

1651-
await page.goto(`${foregroundOrigin}#mcp`);
1652+
await page.goto(workbenchUrl(foregroundOrigin, 'mcp'));
16521653
await expect(page.getByRole('heading', { name: 'MCP playground' })).toBeVisible({ timeout: browserTimeout });
16531654
await page.locator('#mcp-target').selectOption('portable');
16541655
await page.locator('#mcp-server-name').fill('fixture');

0 commit comments

Comments
 (0)