- 上下文清单、任务列表与详情、恢复控制、运行观察、创作对话与消息流、正式变更决策面板、正文写作与候选审阅、资料研究等页面同步本轮后端能力。 - 事件标签表补齐后端事件类型;查询键与生成客户端随 HTTP 契约重新生成。 - 依赖调整后 lockfile 同步;交互用例与浏览器旅程 spec 一并更新。 - 证据:make 前端检查(lint + typecheck + Pi 工具桥 tsc)exit 0;make 前端测试 37 文件 / 120 用例通过。
72 lines
3.3 KiB
TypeScript
72 lines
3.3 KiB
TypeScript
import { readFileSync, writeFileSync } from "node:fs";
|
||
import { expect, test } from "@playwright/test";
|
||
|
||
// @muse-case {"case_id":"NC-browser-concrete-improvement","environment":"真实浏览器与隔离PG","given":"确切方法版本、真实反馈和同作者用途配置","when":"登记具体改进、实际验证和owner启停并恢复已提交结果;记录分版本观察","then":["真实反馈到具体方法提案且无凭据不启用"],"contract":"docs/系统架构/新版设计/模块设计/B07-作者经验.md"}
|
||
test("NC-browser-concrete-improvement:真实反馈到具体方法提案且无凭据不启用", async ({
|
||
page,
|
||
}, info) => {
|
||
const password = process.env.MUSE_AUTHOR_PASSWORD_FILE;
|
||
const fid = process.env.MUSE_FEEDBACK_ID;
|
||
if (!password || !fid) throw new Error("需要隔离反馈和作者口令");
|
||
const errors: string[] = [];
|
||
page.on("pageerror", (e) => errors.push(e.message));
|
||
await page.goto("/");
|
||
await page.getByLabel("访问口令").fill(readFileSync(password, "utf8").trim());
|
||
await page.getByRole("button", { name: "进入工作台" }).click();
|
||
await page.goto(`/feedback/${fid}`);
|
||
await page.getByRole("link", { name: "用这条反馈提出具体改进 →" }).click();
|
||
await page.getByLabel("改进标题").fill("浏览器具体改进");
|
||
await page
|
||
.getByLabel("需要验证的改变")
|
||
.fill("检验物件回收方法是否改善承接。");
|
||
await page
|
||
.getByLabel("具体方法版本")
|
||
.selectOption({ label: "启用桥接方法 · 第1版" });
|
||
const response = page.waitForResponse(
|
||
(r) =>
|
||
r.url().endsWith("/api/v1/improvements") &&
|
||
r.request().method() === "POST",
|
||
);
|
||
await page.getByRole("button", { name: "保存具体提案" }).click();
|
||
const res = await response;
|
||
expect(res.status()).toBe(200);
|
||
writeFileSync(
|
||
info.outputPath("实际改进.json"),
|
||
JSON.stringify(await res.json()),
|
||
);
|
||
await expect(
|
||
page.getByRole("heading", { name: "浏览器具体改进", exact: true }),
|
||
).toBeVisible();
|
||
const activate = page.getByRole("button", { name: "确认启用已测版本" });
|
||
await expect(activate).toBeDisabled();
|
||
await page.getByLabel("已测版本凭据").fill("not-qualified");
|
||
await page.getByRole("button", { name: "核对启用依据" }).click();
|
||
await expect(
|
||
page.getByRole("region", { name: "目标操作" }).getByRole("status"),
|
||
).toContainText("不合法");
|
||
await expect(activate).toBeDisabled();
|
||
await expect(page.getByText("当前目标状态:已确认,尚未启用")).toBeVisible();
|
||
const observations = page.getByRole("region", { name: "长期观察" });
|
||
await observations
|
||
.getByLabel("观察原话")
|
||
.fill("本次费用尚未记录,人审耗时明确为零。");
|
||
await observations.getByLabel("人审耗时(秒)").fill("0");
|
||
await observations.getByRole("button", { name: "保存观察" }).click();
|
||
await expect(observations.getByRole("status")).toContainText("观察已保存");
|
||
await expect(
|
||
observations
|
||
.getByRole("row")
|
||
.filter({ hasText: "费用(美元)" })
|
||
.getByRole("cell"),
|
||
).toHaveText(["未记录", "0", "1"]);
|
||
await page.screenshot({
|
||
path: info.outputPath("具体改进.png"),
|
||
fullPage: true,
|
||
});
|
||
await page.reload();
|
||
await expect(
|
||
page.getByRole("heading", { name: "浏览器具体改进", exact: true }),
|
||
).toBeVisible();
|
||
expect(errors).toEqual([]);
|
||
});
|