Use the dedicated TJWATER_AGENT_URL and Responses stream protocol. Keep running turns active while users steer or queue follow-ups and edit pending delivery. Refresh the model catalog before generation and preserve approval mode selection. Integrate scoped investigation messaging/presentation, geographic place selection, current Agent composer styles and supporting workbench contracts. Validation: 77 focused Vitest checks, 21 browser cases, lint, typecheck and production build. Preserve direct Server/Agent routing and project authentication.
95 lines
4.1 KiB
TypeScript
95 lines
4.1 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
test("Dev Panel opens as a floating desktop panel and closes with Escape", async ({ page }) => {
|
|
test.setTimeout(60_000);
|
|
await page.goto("/", { waitUntil: "domcontentloaded" });
|
|
await page.waitForFunction(() => Boolean(window.__waterNetworkMap));
|
|
await page.waitForFunction(() => Boolean(
|
|
window.__waterNetworkMap?.getLayer("scada-pressure-hit")
|
|
));
|
|
const trigger = page.getByRole("button", { name: "切换地图 Dev Panel" });
|
|
await expect(trigger).toBeVisible();
|
|
await expect(page.getByRole("navigation", { name: "地图工具" })).toBeVisible();
|
|
await trigger.click();
|
|
|
|
const panel = page.getByTestId("map-dev-panel");
|
|
await expect(panel).toBeVisible();
|
|
await expect(panel).toHaveCSS("width", "400px");
|
|
await expect(panel).toHaveCSS("border-radius", "16px");
|
|
const panelBox = await panel.boundingBox();
|
|
expect(panelBox).not.toBeNull();
|
|
expect(panelBox!.x).toBe(1028);
|
|
expect(panelBox!.y).toBe(72);
|
|
expect(panelBox!.y + panelBox!.height).toBeLessThanOrEqual(884);
|
|
await expect(page.getByRole("navigation", { name: "地图工具" })).toBeHidden();
|
|
await expect(panel.getByRole("button", { name: "定位并高亮" })).toBeVisible();
|
|
await expect(panel.getByRole("button", { name: "重置地图调试效果" })).toBeVisible();
|
|
|
|
await panel.locator("summary").filter({ hasText: "水流调试" }).click();
|
|
await panel.getByLabel("管道 ID").fill("P-9");
|
|
await panel.getByLabel("有符号流速").fill("-2.75");
|
|
await panel.getByRole("button", { name: "更新该管道方向" }).click();
|
|
await expect(panel.getByRole("status")).toContainText(
|
|
"已赋值 1 · 正向 0 · 反向 1 · 停止 0"
|
|
);
|
|
await panel.getByRole("button", { name: "开启水流" }).click();
|
|
await expect(panel.getByRole("button", { name: "关闭水流" })).toBeEnabled();
|
|
|
|
const sourceSelect = panel.getByRole("combobox", { name: "业务源" });
|
|
await sourceSelect.click();
|
|
await expect(page.getByRole("option", { name: "管线", exact: true })).toBeVisible();
|
|
await page.keyboard.press("Escape");
|
|
await expect(panel).toBeVisible();
|
|
await expect(sourceSelect).toBeFocused();
|
|
|
|
await page.keyboard.press("Escape");
|
|
await expect(panel).toBeHidden();
|
|
});
|
|
|
|
test("Dev entry is absent below the desktop breakpoint", async ({ page }) => {
|
|
await page.setViewportSize({ width: 375, height: 812 });
|
|
await page.goto("/", { waitUntil: "domcontentloaded" });
|
|
await expect(page.getByRole("button", { name: "切换地图 Dev Panel" })).toBeHidden();
|
|
await expect(page.getByTestId("map-dev-panel")).toHaveCount(0);
|
|
});
|
|
|
|
test("labels remain active per business group and clear globally", async ({ page }) => {
|
|
test.setTimeout(60_000);
|
|
await page.goto("/", { waitUntil: "domcontentloaded" });
|
|
await page.waitForFunction(() => Boolean(
|
|
window.__waterNetworkMap?.getLayer("workbench-value-label-pipes")
|
|
));
|
|
await page.getByRole("button", { name: "切换地图 Dev Panel" }).click();
|
|
|
|
const panel = page.getByTestId("map-dev-panel");
|
|
await panel.locator("summary").filter({ hasText: "数值标注" }).click();
|
|
const apply = panel.getByRole("button", { name: "应用标注", exact: true });
|
|
await apply.click();
|
|
await panel.getByRole("combobox", { name: "标注图层组" }).click();
|
|
await page.getByRole("option", { name: "节点", exact: true }).click();
|
|
await apply.click();
|
|
|
|
await expect.poll(() => page.evaluate(() => ({
|
|
pipes: window.__waterNetworkMap?.getLayoutProperty(
|
|
"workbench-value-label-pipes",
|
|
"visibility"
|
|
),
|
|
junctions: window.__waterNetworkMap?.getLayoutProperty(
|
|
"workbench-value-label-junctions",
|
|
"visibility"
|
|
)
|
|
}))).toEqual({ pipes: "visible", junctions: "visible" });
|
|
|
|
await panel.getByRole("button", { name: "清除全部标注" }).click();
|
|
await expect.poll(() => page.evaluate(() => ({
|
|
pipes: window.__waterNetworkMap?.getLayoutProperty(
|
|
"workbench-value-label-pipes",
|
|
"visibility"
|
|
),
|
|
junctions: window.__waterNetworkMap?.getLayoutProperty(
|
|
"workbench-value-label-junctions",
|
|
"visibility"
|
|
)
|
|
}))).toEqual({ pipes: "none", junctions: "none" });
|
|
});
|