import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import test from 'node:test'; import { parse } from 'vue/compiler-sfc'; function elements(node) { return [node, ...(node.children || []).flatMap(elements)]; } for (const [file, binding] of [ ['pages/home/index.vue', 'user.isTest'], ['pages/nearby/index.vue', 'user.isTest'], ['pages/profile/index.vue', 'profile.isTest'], ['components/UserListItem.vue', 'user.isTest'], ]) { test(`${file}: badge follows server test flag, not nickname or membership`, () => { const source = readFileSync(new URL(`../src/${file}`, import.meta.url), 'utf8'); const { descriptor } = parse(source); const badge = elements(descriptor.template.ast).find(node => node.tag === 'TestUserBadge'); assert.ok(badge, 'missing test-user badge'); const condition = badge.props.find(prop => prop.name === 'if')?.exp?.content; assert.equal(condition, binding); const variable = binding.split('.')[0]; const visible = new Function(variable, `return Boolean(${condition})`); assert.equal(visible({ isTest: true, vip: false }), true); assert.equal(visible({ isTest: false, vip: true, nickname: '测试名称' }), false); assert.equal(visible({}), false); }); } test('badge explicitly says 测试用户', () => { const source = readFileSync(new URL('../src/components/TestUserBadge.vue', import.meta.url), 'utf8'); const { descriptor } = parse(source); assert.match(descriptor.template.content, /测试用户/); });