- 上下文清单、任务列表与详情、恢复控制、运行观察、创作对话与消息流、正式变更决策面板、正文写作与候选审阅、资料研究等页面同步本轮后端能力。 - 事件标签表补齐后端事件类型;查询键与生成客户端随 HTTP 契约重新生成。 - 依赖调整后 lockfile 同步;交互用例与浏览器旅程 spec 一并更新。 - 证据:make 前端检查(lint + typecheck + Pi 工具桥 tsc)exit 0;make 前端测试 37 文件 / 120 用例通过。
53 lines
2.6 KiB
TypeScript
53 lines
2.6 KiB
TypeScript
import { readFileSync } from "node:fs";
|
||
import { expect, test } from "@playwright/test";
|
||
|
||
// @muse-case {"case_id":"NC-browser-author-preference","environment":"浏览器与隔离PG","given":"真实作者、作品及确切正文反馈版本","when":"保存范围偏好、审阅冲突、确认、撤回及重新消费","then":["原稿反馈经审阅确认并撤回"],"contract":"docs/系统架构/新版设计/模块设计/B07-作者经验.md"}
|
||
test("NC-browser-author-preference:原稿反馈经审阅确认并撤回", async ({
|
||
page,
|
||
}, info) => {
|
||
const password = process.env.MUSE_AUTHOR_PASSWORD_FILE;
|
||
const feedback = process.env.MUSE_FEEDBACK_ID;
|
||
if (!password || !feedback) 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/${feedback}`);
|
||
await expect(
|
||
page.getByRole("heading", { name: "原稿", exact: true }),
|
||
).toBeVisible();
|
||
await expect(page.getByText(/原句「保留」/)).toBeVisible();
|
||
await expect(page.getByText(/改过的首句/)).toBeVisible();
|
||
await page.getByLabel("主题", { exact: true }).fill("浏览器偏好");
|
||
await page.getByLabel("推断建议").fill("用动作体现犹疑,保留人物停顿。");
|
||
await page.getByRole("button", { name: "保存为待确认偏好" }).click();
|
||
await expect(
|
||
page.getByText("已保存为待确认偏好,尚未长期生效。"),
|
||
).toBeVisible();
|
||
await page.screenshot({
|
||
path: info.outputPath("反馈对照.png"),
|
||
fullPage: true,
|
||
});
|
||
await page.getByRole("link", { name: "查看并确认作者偏好 →" }).click();
|
||
const card = page.getByRole("region", { name: "浏览器偏好", exact: true });
|
||
await expect(card.getByText(/待确认/)).toBeVisible();
|
||
await expect(card.getByRole("button", { name: "确认这项偏好" })).toHaveCount(
|
||
0,
|
||
);
|
||
await card.getByRole("button", { name: "核对确认内容" }).click();
|
||
await card.getByRole("button", { name: "确认这项偏好" }).click();
|
||
await expect(card.getByText(/生效中/)).toBeVisible();
|
||
await page.reload();
|
||
await expect(card.getByText(/生效中/)).toBeVisible();
|
||
await page.screenshot({
|
||
path: info.outputPath("偏好确认.png"),
|
||
fullPage: true,
|
||
});
|
||
await card.getByRole("button", { name: "撤回这项偏好" }).click();
|
||
await expect(card.getByText(/已撤回/)).toBeVisible();
|
||
await page.reload();
|
||
await expect(card.getByText(/已撤回/)).toBeVisible();
|
||
expect(errors).toEqual([]);
|
||
});
|