* feat(cutover): every entry point opens the workspace; legacy pages stay reachable The top-bar PM button, the nodes' Web UI buttons and /prompt_manager/web now open the workspace Library. Overview's cards open their native pages. The legacy pages stay at their URLs, with no route changed. Classic Web UI no longer navigates the canvas away when a popup is blocked; it shows a notification, as the focused node does. Closes #525 * feat(cutover): link the legacy pages from System and when the workspace fails to load System's Overview section ends with one small Legacy pages line (D165). If a workspace module fails to load or throws while starting, the page shows a static message with the same links instead of an empty shell. Part of #525 * test(cutover): prove the Pair node's Web UI on the real host Part of #525 * test(cutover): count the new real-host cases in the stock matrix pin The PM button test and three renderer-and-reload tests, in 2 projects, take the stock matrix from 110 to 118. Part of #525
57 lines
3.5 KiB
JavaScript
57 lines
3.5 KiB
JavaScript
import { test, expect } from '../../tools/vendor/node_modules/@playwright/test/index.mjs';
|
|
import { installHostHooks } from './host-fixture.mjs';
|
|
|
|
installHostHooks(test);
|
|
|
|
test('workspace serves real library data beside either ComfyUI renderer', async ({ page, context, request }, testInfo) => {
|
|
const saved = await request.post('/prompt_manager/save', { data: {
|
|
text: `Workspace host smoke ${testInfo.project.name}`, tags: ['workspace-host'],
|
|
} });
|
|
expect(saved.ok()).toBe(true);
|
|
const stats = (await (await request.get('/prompt_manager/stats')).json()).stats;
|
|
const workspace = await context.newPage();
|
|
const errors = [];
|
|
workspace.on('pageerror', error => errors.push(error.message));
|
|
try {
|
|
await workspace.goto('/prompt_manager/workspace#/overview');
|
|
await expect(workspace.locator('#workspace-main h1')).toHaveText('Overview');
|
|
await expect(workspace.locator('dt').filter({ hasText: /^Prompts$/ }).locator('+ dd'))
|
|
.toHaveText(stats.total_prompts.toLocaleString());
|
|
await workspace.getByRole('combobox', { name: 'Theme' }).selectOption('light');
|
|
await expect(workspace.locator('body')).toHaveAttribute('data-ca-theme', 'light');
|
|
const imageResponse = workspace.waitForResponse(response => {
|
|
const url = new URL(response.url());
|
|
return url.pathname === '/prompt_manager/images/output' && url.searchParams.get('mode') === 'workspace';
|
|
});
|
|
await workspace.getByRole('navigation', { name: 'Workspace', exact: true })
|
|
.getByRole('link', { name: /^Images(?:\s*[\d,]+)?$/ }).click();
|
|
await expect(workspace.locator('#workspace-main h1')).toHaveText('Images');
|
|
const images = await imageResponse;
|
|
expect(images.ok()).toBe(true);
|
|
const collection = await images.json();
|
|
expect(collection.success).toBe(true);
|
|
await expect(workspace.getByRole('list', { name: 'Image collection', exact: true })).toBeAttached();
|
|
if (collection.images.length) {
|
|
await expect(workspace.locator('article[data-image-key]').first()).toBeVisible();
|
|
} else {
|
|
await expect(workspace.getByText('No matching images · 0 images', { exact: true })).toBeVisible();
|
|
await expect(workspace.locator('.gallery-body > .empty')).toHaveText('No matching images. Try another search or category.');
|
|
}
|
|
// D29: Images no longer links the legacy gallery; #525: nor does Overview. The page stays at its URL.
|
|
await expect(workspace.locator('#workspace-main a[href="/prompt_manager/gallery"]')).toHaveCount(0);
|
|
await workspace.evaluate(() => { location.hash = '/overview'; });
|
|
const imagesCard = workspace.locator('#workspace-main').getByRole('link', { name: 'Open Images', exact: true });
|
|
await expect(imagesCard).toHaveAttribute('href', '#/images');
|
|
expect((await workspace.request.get('/prompt_manager/gallery')).ok()).toBe(true);
|
|
await workspace.evaluate(() => { location.hash = '/images'; });
|
|
await workspace.reload();
|
|
await expect(workspace.locator('#workspace-main h1')).toHaveText('Images');
|
|
await expect(workspace.locator('body')).toHaveAttribute('data-ca-theme', 'light');
|
|
await workspace.screenshot({ path: testInfo.outputPath('workspace-host.png') });
|
|
expect(errors).toEqual([]);
|
|
expect(await page.evaluate(() => LiteGraph.vueNodesMode)).toBe(testInfo.project.metadata.initialRenderer);
|
|
} finally {
|
|
await workspace.close();
|
|
}
|
|
});
|