import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' // 回归(生产:用户菜单权限“自己没掉”):编辑用户弹窗打开时先把 columnIds 清空,再异步回填; // 若授权尚未加载完成(或加载失败)就点保存,会把空数组提交成“清空授权”,整树权限被抹掉。 // 修复:授权未就绪时禁用保存并明确提示。 test('edit_user_dialog_blocks_save_until_auth_loaded', () => { const dialog = readSource('src/pages/account/EditUserDialog.vue') assert.match(dialog, /authReady/, '存在授权就绪标记') assert.match(dialog, /authReady\.value = false/, '打开/失败时标记为未就绪') // 加载失败分支必须保持未就绪:不能回退成“可以保存空授权” const refreshBlock = dialog.slice( dialog.indexOf('async function refreshAuth'), dialog.indexOf('function close'), ) assert.match( refreshBlock, /catch \(error\) \{[\s\S]*?authReady\.value = false/, '授权加载失败保持未就绪,不用空数组覆盖服务端授权', ) assert.match(refreshBlock, /authReady\.value = true/, '仅在加载成功后置为就绪') // save() 自身兜底拦截,不依赖按钮禁用 const saveBlock = dialog.slice(dialog.indexOf('async function save'), dialog.indexOf('async function save') + 400) assert.match(saveBlock, /if \(!authReady\.value\)/, '未就绪时直接拦截保存') // 保存按钮在未就绪时禁用 assert.match(dialog, /:disabled="!authReady"/, '未就绪时保存按钮禁用') assert.match(dialog, /加载中/, '加载中有提示') assert.match(dialog, /保存已禁用/, '加载失败有明确提示') })