diff --git a/admin-frontend-vue/tests/task-35.test.ts b/admin-frontend-vue/tests/task-35.test.ts new file mode 100644 index 00000000..74206082 --- /dev/null +++ b/admin-frontend-vue/tests/task-35.test.ts @@ -0,0 +1,51 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import { readSource } from './helpers.ts' +import { + EMPTY_MENU_DESCRIPTION, + EMPTY_MENU_TITLE, + shouldShowEmptyMenu, +} from '../src/layout/empty-state.ts' + +test('test_task_035_no_menu_user_state_normal_primary_path', () => { + // 正常主路径:会话完成、无菜单且非加载时展示无菜单空态。 + assert.equal(shouldShowEmptyMenu(false, false, true), true) +}) + +test('test_task_035_no_menu_user_state_normal_variant_input', () => { + // 正常变体:有菜单时即使初始化完成也不展示空态。 + assert.equal(shouldShowEmptyMenu(true, false, true), false) +}) + +test('test_task_035_no_menu_user_state_normal_repeated_operation_is_idempotent', () => { + // 正常重复:纯函数结果稳定、无副作用。 + assert.equal(shouldShowEmptyMenu(false, false, true), shouldShowEmptyMenu(false, false, true)) +}) + +test('test_task_035_no_menu_user_state_boundary_empty_input', () => { + // 边界空值:未初始化 / 空态参数缺失时不误闪空态。 + assert.equal(shouldShowEmptyMenu(false, false, false), false, '未初始化完成不展示空态') +}) + +test('test_task_035_no_menu_user_state_boundary_single_item', () => { + // 边界单元素:加载中即便无菜单也不闪空态(防闪烁)。 + assert.equal(shouldShowEmptyMenu(false, true, true), false, '加载中不闪空态') +}) + +test('test_task_035_no_menu_user_state_boundary_limit_or_missing_field', () => { + // 边界上限/缺字段:初始状态(空菜单、未初始化、未加载)同样不展示。 + assert.equal(shouldShowEmptyMenu(false, false, false), false) +}) + +test('test_task_035_no_menu_user_state_invalid_input_rejected', () => { + // 异常输入:参数类型异常时仍安全返回布尔,不抛错。 + assert.equal(shouldShowEmptyMenu(0 as unknown as boolean, 0 as unknown as boolean, 1 as unknown as boolean), true) +}) + +test('test_task_035_no_menu_user_state_dependency_failure_returns_actionable_message', () => { + // 依赖失败:初始化失败不落成无菜单空态(由错误条提示);文案指向联系管理员。 + assert.equal(EMPTY_MENU_TITLE, '暂无可用菜单') + assert.match(EMPTY_MENU_DESCRIPTION, /管理员/) + const store = readSource('src/stores/admin-session.ts') + assert.match(store, /error:/, 'store 保存失败错误而非置空菜单') +})