The status card always rendered the icon slot, so never-opened members saw a generic certificate glyph in front of 未开通会员 (level 0 has no configured icon and fell back to fa-certificate). Members with a real level keep their icon; only the level-0 case drops the slot. Render the icon span only when vip_level_number > 0. Verification: extended tests/widget-system/vip-tab-status-card.test.cjs (3 contract tests); node --test tests/**/*.test.cjs 638/638 pass; php -l clean.
44 lines
2.2 KiB
JavaScript
44 lines
2.2 KiB
JavaScript
/**
|
|
* 用户中心 VIP 页状态卡契约(inc/helpers/user-center-renderers/vip-tab.php)。
|
|
*
|
|
* 硬约束:
|
|
* 1) 未开通用户不渲染到期时间行——状态标签已显示「未开通」,参考主题
|
|
* zibpay_user_page_tab_content_vip 对从未开通用户同样不输出任何到期
|
|
* 信息(仅生效中/永久/已过期才有);
|
|
* 2) 生效中、永久、已过期三个分支的到期文案保持产出;
|
|
* 3) 到期行整体按文案非空条件渲染,不留空壳 div。
|
|
*/
|
|
const test = require('node:test');
|
|
const assert = require('node:assert');
|
|
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
|
|
const root = path.join(__dirname, '..', '..');
|
|
const read = (...seg) => fs.readFileSync(path.join(root, ...seg), 'utf8');
|
|
|
|
const vipTab = read('inc', 'helpers', 'user-center-renderers', 'vip-tab.php');
|
|
|
|
test('未开通用户不渲染到期时间行', () => {
|
|
// 未开通初始化不再产出「到期时间:未开通」文案。
|
|
assert.ok(!vipTab.includes('到期时间:未开通'), '未开通不应再产出到期文案');
|
|
assert.match(vipTab, /\$vip_expiry_text\s*=\s*'';/);
|
|
// 到期行按文案非空条件渲染。
|
|
assert.match(vipTab, /\$vip_expiry_text !== '' \? '<div class="uc-vip-status__expiry">/);
|
|
});
|
|
|
|
test('生效中/永久/已过期分支仍产出到期文案', () => {
|
|
assert.match(vipTab, /到期时间:永久会员/);
|
|
assert.match(vipTab, /到期时间:%s/);
|
|
assert.match(vipTab, /到期时间:已过期/);
|
|
// 三个分支都会给 $vip_expiry_text 赋值。
|
|
const assignments = vipTab.match(/\$vip_expiry_text\s*=/g) || [];
|
|
assert.ok(assignments.length >= 4, '初始化 + 永久 + 生效中 + 已过期均应赋值');
|
|
});
|
|
|
|
test('未开通状态名称前不渲染图标位', () => {
|
|
// 图标位仅在有等级(生效中/永久/已过期)时输出;未开通(level 0)不输出,
|
|
// 避免「未开通会员」前面挂通用证书图标。
|
|
assert.match(vipTab, /\$vip_level_number > 0 \? '<span class="uc-vip-status__icon"/);
|
|
assert.ok(!vipTab.includes(". '<span class=\"uc-vip-status__icon\" aria-hidden=\"true\">' . \$status_icon"), '图标位不应再无条件渲染');
|
|
});
|