'use strict'; /** * 文章页作者栏「发布时间」契约(对齐参考主题 zib_get_post_time_tooltip): * 纯文本相对时间 + data-placement="bottom" 的 tooltip,不渲染列表圆点前缀, * 且按参考的四个分支决定显示发布时间还是更新时间。 */ const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const test = require('node:test'); const { spawnSync } = require('node:child_process'); const root = path.resolve(__dirname, '..', '..'); const read = (file) => fs.readFileSync(path.join(root, file), 'utf8'); const authorBar = read('templates/parts/single-author-bar.php'); test('作者栏时间与参考主题同构:tooltip 在下方、无 icon-circle 圆点', () => { assert.match( authorBar, /<\?php echo esc_html\(\$time_text\); \?><\/span>/, '时间必须是无前缀圆点的 ,tooltip 置于下方' ); assert.doesNotMatch(authorBar, /]*data-toggle="tooltip"/, '作者栏时间不得再带 icon-circle 圆点'); assert.doesNotMatch(authorBar, //, '隐藏时间后的作者简介同样不应带圆点'); }); test('相对时间文案不重复「前」,与参考一致', () => { assert.match(authorBar, /\$time_text = \$time_ago \. \$rel_label;/, '时间文案应为「相对时间 + 发布/更新」'); assert.match(authorBar, /function_exists\('jio_time_ago'\)[\s\S]{0,160}: human_time_diff\(/, '缺少 jio_time_ago 时才回退 human_time_diff'); assert.doesNotMatch( authorBar, /human_time_diff\(\$rel_base, \(int\) current_time\('timestamp'\)\) \. \$rel_label/, '不得再用裸 human_time_diff 拼接,会少「前」字' ); }); test('时间分支复刻参考:数据源 / 非发布 / 有更新 三种判定', () => { assert.match(authorBar, /get_post_list_style_settings\(\)/, '时间源应读取列表风格设置'); assert.match(authorBar, /\$has_update = \(int\) strtotime\(\$modified_mysql\) > \(int\) strtotime\(\$published_mysql\);/, '以时间戳比较判断是否更新过'); const dateBranch = authorBar.match(/if \(\$time_source === 'date'\) \{[\s\S]*?\n\}/); assert.ok(dateBranch, '缺少 date 数据源分支'); assert.match(dateBranch[0], /\$time_mysql = \$published_mysql;/, 'date 源固定用发布时间'); assert.match(dateBranch[0], /\$abs_fmt = \$published_title;/, 'date 源 tooltip 标注发布'); const unpublished = authorBar.match(/\} elseif \(!\$is_published\) \{[\s\S]*?\n\}/); assert.ok(unpublished, '缺少非发布状态分支'); assert.match(unpublished[0], /\$time_mysql = \$modified_mysql;/, '非发布状态用更新时间'); assert.match(unpublished[0], /\$abs_fmt = \$modified_title;/, '非发布状态 tooltip 标注更新'); const updated = authorBar.match(/\} elseif \(\$has_update\) \{[\s\S]*?\n\}/); assert.ok(updated, '缺少「有更新」分支'); assert.match(updated[0], /\$time_mysql = \$modified_mysql;/, '有更新时展示更新时间的相对值'); // 参考主题此分支的 tooltip 仍标注发布时间,保持逐字一致。 assert.match(updated[0], /\$abs_fmt = \$published_title;/, '有更新的已发布文章 tooltip 仍标注发布时间'); assert.doesNotMatch(updated[0], /\$modified_title/, '该分支不应在 tooltip 标注更新'); }); test('作者栏时间渲染:四分支输出与参考组合一致', () => { const harness = path.join(__dirname, 'author-bar-time-harness.php'); const result = spawnSync(process.env.PHP_BINARY || 'php', [harness], { cwd: root, encoding: 'utf8' }); assert.equal(result.status, 0, result.stderr || result.stdout); const cases = JSON.parse(result.stdout); assert.deepEqual(cases['date_updated'], { text: '5天前发布', title: '2026年10月29日 08:00发布' }); assert.deepEqual(cases['modified_clean'], { text: '5天前发布', title: '2026年10月29日 08:00发布' }); assert.deepEqual(cases['modified_updated'], { text: '1天前更新', title: '2026年10月29日 08:00发布' }); assert.deepEqual(cases['draft'], { text: '1天前更新', title: '2026年11月02日 09:00更新' }); });