const assert = require('node:assert/strict'); const { readFileSync } = require('node:fs'); const { createRequire } = require('node:module'); const { test } = require('node:test'); const vm = require('node:vm'); const ts = require('typescript'); const source = ts.createSourceFile( 'AccountManagementList.tsx', readFileSync(`${__dirname}/../src/components/accounts/AccountManagementList.tsx`, 'utf8'), ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX, ); const requireWeb = createRequire(`${__dirname}/../package.json`); const { Tag } = requireWeb('antd'); let columns; function visit(node) { if (ts.isVariableDeclaration(node) && node.name.getText(source) === 'columns') { columns = node.initializer.elements; } ts.forEachChild(node, visit); } visit(source); function property(column, key) { return column.properties.find( (prop) => ts.isPropertyAssignment(prop) && prop.name.getText(source) === key, )?.initializer; } function businessColumn() { const column = columns.find((item) => property(item, 'title')?.text === '业务状态'); assert.ok(column, '我的账号列表必须有业务状态列'); const { outputText } = ts.transpileModule(`exports.column = (${column.getText(source)});`, { compilerOptions: { jsx: ts.JsxEmit.ReactJSX, module: ts.ModuleKind.CommonJS }, }); const context = { exports: {}, require: requireWeb, Tag }; vm.runInNewContext(outputText, context); return context.exports.column; } for (const [status, label, color] of [ ['normal', '正常', 'success'], ['muted', '禁言', 'warning'], ['banned', '封禁', 'error'], ['deleted', '注销', 'default'], ]) { test(`业务状态 ${status} 显示“${label}”及对应颜色`, () => { const column = businessColumn(); assert.equal(column.dataIndex, 'business_status'); const result = column.render(status, { business_status: status, runtime_status: 'paused' }); assert.equal(result.type, Tag); assert.equal(result.props.children, label); assert.equal(result.props.color, color); assert.equal(result.props.style, undefined, '使用默认 Tag 样式'); }); } test('业务状态列紧邻现有状态列,运行状态判定保持不变', () => { const titles = columns.map((column) => property(column, 'title')?.text); const index = titles.indexOf('业务状态'); assert.ok(index > 0, '必须有独立的业务状态列'); assert.equal(titles[index - 1], '状态'); assert.equal(titles[index + 1], '操作'); const readiness = property(columns[index - 1], 'render').getText(source); assert.match(readiness, /accountReadiness\(account, account\.environment \?\? null\)/); });