36 lines
1.5 KiB
JavaScript
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, /测试用户/);
|
|
});
|