Files
wordpress-theme-aksrt/tests/widget-system/vip-tab-status-card.test.cjs
T
kate522andClaude Opus 5 427968a721 chore(branding): remove leftover upstream theme identifiers
The theme was renamed Zibll/子比 → AKSRT → Jio, but upstream branding
survived the sweeps in CSS classes, the SVG sprite prefix, a persisted
widget field ID, JS events, admin Vue class names, test infrastructure
and docblocks.

Renames:
- zib-widget / zib-widget-wrap / zib-slider → jio-widget-box /
  jio-widget-box-wrap / jio-slider-box (jio-widget is taken by the modern
  widget shell, jio-box-* by the card primitives)
- zib-partners-scroll + zps-* → jio-partners-scroll + jps-*
- zib-combo-info-card + zci-* → jio-combo-info-card + jci-*
- zibsvg- → jiosvg-, including the exported picker helpers and the
  fa-zibsvg- family-prefix guard
- zibpay_type → pay_type; the dual-read fallback in PostQuery collapses
  to a single key
- [zibajax="submit"] dropped (no PHP emitter); zib_ajax.success →
  jio_ajax.success
- aks-* admin Vue classes → jio-*
- zib_palette() → palette()

User-facing vendor traces are gone: the floating "more" button default no
longer ships a zibll.com link or 子比主题 marketing copy, the notice
widget ships no preset promo entries, and the four 官网教程 links are
removed from the post-list admin schema.

Test infrastructure renamed to neutral names (docker-compose.reference.yml,
Caddyfile, article-baseline.json, modern-widgets-contract.test.cjs) with
their DB/volume/env/slug identifiers following.

Kept intentionally, documented in tests/fixtures/README.md: the golden
fixture reference fingerprint (a SHA-256 record of an external directory,
read by validate-widget-golden / generate-widget-golden-fixture /
audit-widget-system), the doesNotMatch guards that prove the old tokens are
gone, and the reference theme's own meta key in the visual fixtures.

No backward-compat or data migration: saved widget configs holding old
icon keys or the old field ID silently lose them, per the project's
rewrite-over-compatibility rule.

Verified: 132/132 node contract tests, php tests/widget-system/run.php
(146 assertions), audit-admin-contracts, audit-psr4-paths and
validate-widget-golden all green; tracked bundles regenerated and in sync.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-11-02 00:06:54 +08:00

44 lines
2.1 KiB
JavaScript

/**
* 用户中心 VIP 页状态卡契约(inc/helpers/user-center-renderers/vip-tab.php)。
*
* 硬约束:
* 1) 未开通用户不渲染到期时间行——状态标签已显示「未开通」,参考主题
* 会员页 tab 对从未开通用户同样不输出任何到期
* 信息(仅生效中/永久/已过期才有);
* 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"), '图标位不应再无条件渲染');
});