test(游戏共创): 族谱 e2e 断言跟进 coverObjectKey 契约

This commit is contained in:
2026-10-06 15:09:51 +08:00
parent 37ad96368c
commit ca5fde274b
@@ -95,6 +95,8 @@ const REMIX_COPIED_ID_LABEL =
// 节点键集合由实现钉死(shared-contracts/src/game_distribution.rs:262-281),多一个键就失败。
const LINEAGE_NODE_KEYS = [
'authorName',
// 本轮起服务端在族谱节点上下发封面对象键(客户端据此渲染缩略图)——它是有意对外暴露的公开字段。
'coverObjectKey',
'gameId',
'generation',
'parentGameId',
@@ -102,9 +104,11 @@ const LINEAGE_NODE_KEYS = [
'status',
'title',
];
// 这 7 个键之外不该出现的东西:对象键 / 素材键 / 包摘要等私有字段。
// 这 8 个键之外不该出现的东西:一般对象键 / 素材键 / 包摘要等私有字段。
// 注意:`coverObjectKey` 本轮起是**有意下发**的公开字段(客户端渲染缩略图用),
// 因此用 (?<!cover) 把 `coverObjectKey` 排除在「对象键」之外,其余对象键仍然禁止。
const PRIVATE_KEY_PATTERN =
/objectKey|assetId|coverObjectKey|screenshots|packageSha|sha256|bucket|oss|downloadPath/i;
/(?<!cover)objectKey|assetId|screenshots|packageSha|sha256|bucket|\boss\b|downloadPath/i;
// 取件元数据里 sha256 / bytes / downloadPath 本身是契约字段,所以这里只查「对象键 / 存储域名」。
const FORK_SOURCE_LEAK_PATTERN =
/objectKey|coverObjectKey|bucket|aliyuncs|oss-cn|\.zip/iu;
@@ -792,10 +796,14 @@ async function runBrowserStep({
.locator('#game-fork-remix-panel button.game-fork-remix-copy')
.evaluateAll((nodes) => nodes.map((node) => node.textContent))
.catch(() => []);
const observedStatusTexts = await page
.locator('#game-fork-remix-panel .game-fork-remix-status')
.evaluateAll((nodes) => nodes.map((node) => node.textContent))
.catch(() => []);
check(
'浏览器视觉:点「复制作品 ID」后给出可读反馈(已复制按钮或复制失败提示)',
copiedShown || failedShown,
`期望按钮名=${REMIX_COPIED_ID_LABEL} 或出现失败提示;实测按钮文案=${JSON.stringify(observedLabels)}(已授剪贴板权限;真实剪贴板内容仍属人工验收项)`,
`期望按钮名=${REMIX_COPIED_ID_LABEL} 或出现失败提示;实测按钮文案=${JSON.stringify(observedLabels)} 面板状态行=${JSON.stringify(observedStatusTexts)}(已授剪贴板权限;真实剪贴板内容仍属人工验收项)`,
);
}
}