* fix(ci): skip unrelated required checks cleanly Matrix jobs had to start no-op runners to preserve interpolated required-check names. Static named jobs let GitHub report genuine skipped conclusions while keeping those names stable. * fix(ci): gate changes to install patching script * fix(ci): route cross-package test contracts narrowly * fix(ci): keep routed contracts merge-blocking * fix(server): exclude nested test utilities from builds * fix(ci): cover app-owned native and browser domains * refactor(ci): align tests with runtime domains Own browser specs, desktop specs, and Electron-only app code by stable directories so PR routing does not depend on filename conventions. Keep desktop integration coverage inside the required desktop check. * fix(ci): keep routing and desktop suites isolated The routing regression must run before dependency installation, and desktop Vitest must not collect Playwright-owned specs. * fix(ci): isolate desktop e2e runtime * perf(test): isolate Playwright workers * perf(test): parallelize Playwright within specs * fix(test): keep Playwright file scheduling * fix(test): share dynamic Metro fixture * fix(test): preserve own-host restart fixtures * fix(ci): preserve routed contracts after rebase * Stabilize Playwright wheel-scroll assertions
86 lines
3.2 KiB
TypeScript
86 lines
3.2 KiB
TypeScript
import { test as base } from "../support/fixtures";
|
|
import {
|
|
appendSettledTimelineTurns,
|
|
createNearTenMegabyteAssistantPng,
|
|
createSettledMockAgent,
|
|
createSmallAssistantPng,
|
|
emitSettledAssistantImage,
|
|
expectAssistantImageNotMounted,
|
|
expectAssistantImageRendered,
|
|
openAssistantImageTimeline,
|
|
openExistingImageAgentTabs,
|
|
remountAndRecoverAssistantImageFromHistory,
|
|
sendFollowUpAndExpectVisibleResponse,
|
|
switchAwayAndBackWithoutImageInstability,
|
|
userPagesUntilAssistantImageRenders,
|
|
} from "../support/helpers/assistant-images";
|
|
import { seedWorkspace, type SeededWorkspace } from "../support/helpers/seed-client";
|
|
|
|
const test = base.extend<{ imageWorkspace: SeededWorkspace }>({
|
|
imageWorkspace: async ({ page: _page }, provide) => {
|
|
const workspace = await seedWorkspace({ repoPrefix: "agent-tab-image-stability-" });
|
|
try {
|
|
await provide(workspace);
|
|
} finally {
|
|
await workspace.cleanup();
|
|
}
|
|
},
|
|
});
|
|
|
|
test("switching between settled agent tabs keeps a real assistant PNG rendered", async ({
|
|
imageWorkspace: workspace,
|
|
page,
|
|
}) => {
|
|
test.setTimeout(120_000);
|
|
const image = await createSmallAssistantPng(workspace, {
|
|
alt: "Real file image",
|
|
fileName: "assistant-preview.png",
|
|
});
|
|
const imageAgent = await createSettledMockAgent(workspace, "Image timeline");
|
|
const otherAgent = await createSettledMockAgent(workspace, "Other timeline");
|
|
await emitSettledAssistantImage(workspace.client, imageAgent, image);
|
|
|
|
await openExistingImageAgentTabs(page, { imageAgent, otherAgent });
|
|
await expectAssistantImageRendered(page, image);
|
|
await switchAwayAndBackWithoutImageInstability(page, { image, imageAgent, otherAgent });
|
|
});
|
|
|
|
test("a real assistant PNG remains reachable through pagination and remount", async ({
|
|
imageWorkspace: workspace,
|
|
page,
|
|
}) => {
|
|
test.setTimeout(120_000);
|
|
const image = await createSmallAssistantPng(workspace, {
|
|
alt: "Paginated real file image",
|
|
fileName: "paginated-assistant-preview.png",
|
|
});
|
|
const imageAgent = await createSettledMockAgent(workspace, "Paginated image timeline");
|
|
await emitSettledAssistantImage(workspace.client, imageAgent, image);
|
|
await appendSettledTimelineTurns(workspace.client, imageAgent, 40);
|
|
|
|
await openAssistantImageTimeline(page, imageAgent);
|
|
await expectAssistantImageNotMounted(page, image);
|
|
await userPagesUntilAssistantImageRenders(page, image);
|
|
await remountAndRecoverAssistantImageFromHistory(page, image);
|
|
});
|
|
|
|
test("a near-10 MiB real assistant PNG renders and the app remains responsive", async ({
|
|
imageWorkspace: workspace,
|
|
page,
|
|
}) => {
|
|
test.setTimeout(180_000);
|
|
const image = await createNearTenMegabyteAssistantPng(workspace, {
|
|
alt: "Large real file image",
|
|
fileName: "large-assistant-preview.png",
|
|
});
|
|
const imageAgent = await createSettledMockAgent(workspace, "Large image timeline");
|
|
await emitSettledAssistantImage(workspace.client, imageAgent, image);
|
|
|
|
await openAssistantImageTimeline(page, imageAgent);
|
|
await expectAssistantImageRendered(page, image);
|
|
await sendFollowUpAndExpectVisibleResponse(page, {
|
|
prompt: "confirm responsiveness: emit 1 coalesced agent stream updates",
|
|
response: "stress-update-0",
|
|
});
|
|
});
|