Просмотр исходного кода

merge(test): S-cfc-76 admin.family.actionMenu RED 契约单测并入主链(更多按钮去掉查看成员/删除,4红2绿)

Sisyphus 4 дней назад
Родитель
Сommit
78546847bb
1 измененных файлов с 68 добавлено и 0 удалено
  1. 68 0
      cfc-web/src/__tests__/Families.actionMenu.spec.js

+ 68 - 0
cfc-web/src/__tests__/Families.actionMenu.spec.js

@@ -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['"]/)
+  })
+})