|
|
@@ -0,0 +1,68 @@
|
|
|
+import { readFileSync } from 'fs';
|
|
|
+import { resolve } from 'path';
|
|
|
+
|
|
|
+// 契约:admin.family.actionMenu
|
|
|
+// 家庭管理列表「更多」下拉按钮:去掉「查看成员」「删除」两个下拉项,家庭不允许删除。
|
|
|
+// 溯源·需求:docs/superpowers/specs/2026-11-08-family-admin-list-polish.md §需求5
|
|
|
+// 溯源·设计:cfc-web/src/views/Families.vue L92-96 删除 viewMembers/delete 两个 dropdown-item;
|
|
|
+// L384-390 handleActionCmd 清理对应 case;后端保留 deleteFamily API 不删。
|
|
|
+//
|
|
|
+// 说明:Families.vue 存在既有 vue-jest 模板编译告警(v-else/v-if 非同级),无法直接 shallowMount。
|
|
|
+// 故本契约单测采用「读源码 + 校验下拉项指令」的组合断言,与同批
|
|
|
+// Families.createdAtDisplay.spec.js(S-cfc-75)风格保持一致。
|
|
|
+//
|
|
|
+// TDD-RED:当前实现仍渲染 command="viewMembers" 与 command="delete" 两个下拉项,
|
|
|
+// 契约要求移除,本测试预期失败(红);GREEN 阶段按设计删除这两个
|
|
|
+// dropdown-item 并清理 handleActionCmd 对应 case 后转绿。
|
|
|
+
|
|
|
+const VIEWS_DIR = resolve(__dirname, '../views')
|
|
|
+const FAMILIES_VUE_PATH = resolve(VIEWS_DIR, 'Families.vue')
|
|
|
+const source = readFileSync(FAMILIES_VUE_PATH, 'utf8')
|
|
|
+
|
|
|
+// 从模板中抽取「操作」那一列的完整 <el-table-column> 块(含「更多」下拉菜单)
|
|
|
+function extractActionColumnBlock(src) {
|
|
|
+ const startTag = '<el-table-column label="操作"'
|
|
|
+ const start = src.indexOf(startTag)
|
|
|
+ if (start === -1) return ''
|
|
|
+ const end = src.indexOf('</el-table-column>', start)
|
|
|
+ if (end === -1) return ''
|
|
|
+ return src.slice(start, end + '</el-table-column>'.length)
|
|
|
+}
|
|
|
+
|
|
|
+const actionColumnBlock = extractActionColumnBlock(source)
|
|
|
+
|
|
|
+// 抽取 handleActionCmd 方法体,用于校验 switch case 是否已清理
|
|
|
+function extractHandleActionCmd(src) {
|
|
|
+ const startTag = 'handleActionCmd(row, cmd)'
|
|
|
+ const start = src.indexOf(startTag)
|
|
|
+ if (start === -1) return ''
|
|
|
+ return src.slice(start)
|
|
|
+}
|
|
|
+
|
|
|
+const actionCmdBody = extractHandleActionCmd(source)
|
|
|
+
|
|
|
+describe('Families 更多按钮下拉菜单契约 (admin.family.actionMenu)', () => {
|
|
|
+ it('操作列必须存在(设计 L85-98)', () => {
|
|
|
+ expect(actionColumnBlock).not.toBe('')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('「更多」下拉菜单必须渲染(保留编辑入口)', () => {
|
|
|
+ expect(actionColumnBlock).toMatch(/<el-dropdown-menu/)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('下拉菜单不应再出现「查看成员」项(command="viewMembers")', () => {
|
|
|
+ expect(actionColumnBlock).not.toMatch(/command=["']viewMembers["']/)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('下拉菜单不应再出现「删除」项(command="delete")', () => {
|
|
|
+ expect(actionColumnBlock).not.toMatch(/command=["']delete["']/)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('handleActionCmd 不应再分发 viewMembers 指令', () => {
|
|
|
+ expect(actionCmdBody).not.toMatch(/case\s+['"]viewMembers['"]/)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('handleActionCmd 不应再分发 delete 指令', () => {
|
|
|
+ expect(actionCmdBody).not.toMatch(/case\s+['"]delete['"]/)
|
|
|
+ })
|
|
|
+})
|