diff --git a/activities/part-substitution-assessment/__tests__/activity.test.ts b/activities/part-substitution-assessment/__tests__/activity.test.ts index 2402e2c..f55816b 100644 --- a/activities/part-substitution-assessment/__tests__/activity.test.ts +++ b/activities/part-substitution-assessment/__tests__/activity.test.ts @@ -104,11 +104,11 @@ describe('清单本身合规', () => { }); /* - * SKIP(2026-08-29,Task 2 → Task 7 部分交付):`input-supplement` 已随 Task 7 补回 - * `assets.viewTemplates`(`VIEWS` 已更新),但 `difference-review` / `landing-confirm` - * 两张还在等 Task 8 / 9 —— `new Set(...)` 的整体相等要三张都在才成立,继续跳过。 + * 解封(2026-08-29,Task 9):`landing-confirm` 已随 Task 9 补回 —— `input-supplement` + * (Task 7)/`difference-review`(Task 8)/`landing-confirm`(Task 9)三张全在了, + * `new Set(...)` 的整体相等条件此刻才第一次成立。 */ - it.skip('三张工单视图 + 一张运营侧看板都声明了,剧本每一步引用的 view 都在其中', () => { + it('三张工单视图 + 一张运营侧看板都声明了,剧本每一步引用的 view 都在其中', () => { expect(new Set(manifest.assets.viewTemplates.map((v) => v.name))).toEqual(new Set([...VIEWS, BOARD_VIEW])); for (const step of manifest.assets.businessModel.steps as ReadonlyArray<{ view?: string }>) { if (step.view !== undefined) expect(VIEWS, step.view).toContain(step.view); @@ -378,7 +378,15 @@ describe('报告模版:编辑面与只读面各就各位', () => { } }); - /* SKIP(2026-08-29,Task 2 → Task 8/9):`difference-review` / `landing-confirm` 两张局面已撤下(新的两张由 Task 8/9 重做);它们绑的字段(recommendation_level 已只剩三档、analysis_status 已不带 tally)到时也会一并对齐 */ + /* + * SKIP(2026-08-29,Task 9 复核后维持 skip):`difference-review` 那半句(第 383-385 行) + * 这次实测确已成立(与「件②」组的等价断言重复,不必再靠这条揭封);但 `landing-confirm` + * 那半句(第 386-390 行)测的 `request_status`/`current_stage` 是 `demand.request` 的列 —— + * 这个活动的清单里从没声明过 `demand.request`(见「台账声明」组「这个活动不碰 P-01 / P-10 / + * 客户档案」那条,已通过),`landing-confirm` 全只读、答的是「进哪几张表各几行」不是需求状态回写, + * 这两个字段**不属于新设计的任何一步**。这不是「还没轮到」,是测的东西这次重写里压根不存在 —— + * 一个 `it` 体绑死两半、拆不开,继续整条跳过,不强救。 + */ it.skip('枚举列只用 data-class-of 投影,不摆 ASCII 原值', () => { expect(viewHtml('difference-review')).toContain('data-class-of="difference_status"'); expect(viewHtml('difference-review')).toContain('data-class-of="recommendation_level"'); @@ -395,13 +403,8 @@ describe('报告模版:编辑面与只读面各就各位', () => { await expect(host.base.interaction.pushHtml('
')).rejects.toThrow(/无脚本执行权/); }); - /* - * SKIP(2026-08-29,Task 2 → Task 7 部分交付):VIEWS 现在是三张新局面的名单,`input-supplement` - * 已随 Task 7 补回、这一条本身可以对它验(外壳确实是 page/card),但 `difference-review` / - * `landing-confirm` 两张还没有(viewHtml 返回空串,`toContain('class="card-head"')` 会假), - * 循环体没法只验一部分 —— 等 Task 8/9 补齐三张再一起解封。 - */ - it.skip('三张模版的外壳都是搬自目标件的 page/card,不再含 E04/I01 那套视觉底(.proto-root)的痕迹', () => { + /* 解封(2026-08-29,Task 9):`landing-confirm` 补齐,三张全能验了 —— 都走同一个 `doc()` 壳。 */ + it('三张模版的外壳都是搬自目标件的 page/card,不再含 E04/I01 那套视觉底(.proto-root)的痕迹', () => { for (const view of VIEWS) { const html = viewHtml(view); expect(html, view).toContain('class="card-head"'); @@ -549,6 +552,68 @@ describe('件② 差异评估结论审核', () => { }); }); +/* + * 件③ 落账确认(2026-08-29,Task 9):T_release 的终局验收工单,`view: 'landing-confirm'` 指向它。 + * **全只读,答「这一签下去发生什么」(spec §6.3)**:进哪几张表各几行(摆人读名)· 结论卡 + * (等级 + 一句话)· 四态分布并把硬约束不符的逐条点名 · 待验项(P-06 的测试条件与后续动作)· + * 发哪一口。复用文件顶部已有的 `viewHtml` 短写。 + */ +describe('件③ 落账确认', () => { + const html = viewHtml('landing-confirm'); + + it('在 viewTemplates 里,T_release 指向它', () => { + expect(html).not.toBe(''); + expect((manifest.assets.businessModel.steps as ReadonlyArray<{ item: string; view?: string }>) + .find((s) => s.item === 'T_release')?.view).toBe('landing-confirm'); + }); + + it('**全只读** —— 签之前只核对,不改', () => { + expect(html).not.toContain('data-edit='); + expect(html).not.toContain('data-col='); + expect(html).not.toContain('