Files
2026-09-03 08:38:17 +08:00

36 lines
1.5 KiB
JavaScript

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, /测试用户/);
});