421e204711
Memind CI / Test, build, and release guards (push) Successful in 3m28s
Ship the M成果 page with list/delete UX, fix deletePage for incomplete page records, route /space/achievements, and add M成果 under the WeChat M空间 menu. Co-authored-by: Cursor <cursoragent@cursor.com>
64 lines
1.8 KiB
JavaScript
64 lines
1.8 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
|
|
import {
|
|
achievementStatsInternals,
|
|
mergeAchievementStatsForPage,
|
|
} from './mindspace-page-achievement-stats.mjs';
|
|
|
|
const { buildPageMatchKeys, mergeAchievementStatsForPage: mergePage, pathnameFromUrl } =
|
|
achievementStatsInternals;
|
|
|
|
test('buildPageMatchKeys includes workspace and publication paths', () => {
|
|
const keys = buildPageMatchKeys(
|
|
{
|
|
id: 'page-1',
|
|
workspaceRelativePath: 'public/demo.html',
|
|
publicationUrl: 'https://m.tkmind.cn/u/john/pages/demo',
|
|
},
|
|
'user-1',
|
|
);
|
|
assert.ok(keys.has('page-1'));
|
|
assert.ok(keys.has('/MindSpace/user-1/public/demo.html'));
|
|
assert.ok(keys.has('/u/john/pages/demo'));
|
|
});
|
|
|
|
test('mergeAchievementStatsForPage prefers umami metrics when matched', () => {
|
|
const umamiByPath = new Map([
|
|
['/MindSpace/user-1/public/demo.html', { views: 12, clicks: 3 }],
|
|
]);
|
|
const merged = mergePage(
|
|
{
|
|
id: 'page-1',
|
|
title: 'Demo',
|
|
workspaceRelativePath: 'public/demo.html',
|
|
viewCount: 5,
|
|
},
|
|
umamiByPath,
|
|
'user-1',
|
|
);
|
|
assert.equal(merged.viewCount, 12);
|
|
assert.equal(merged.clickCount, 3);
|
|
assert.equal(merged.statsSource, 'umami');
|
|
});
|
|
|
|
test('mergeAchievementStatsForPage keeps publication views without umami match', () => {
|
|
const merged = mergeAchievementStatsForPage(
|
|
{
|
|
id: 'page-2',
|
|
title: 'Draft',
|
|
viewCount: 7,
|
|
},
|
|
new Map(),
|
|
'user-2',
|
|
);
|
|
assert.equal(merged.viewCount, 7);
|
|
assert.equal(merged.clickCount, null);
|
|
assert.equal(merged.statsSource, 'publication');
|
|
});
|
|
|
|
test('pathnameFromUrl normalizes absolute and relative urls', () => {
|
|
assert.equal(pathnameFromUrl('https://m.tkmind.cn/u/john/pages/demo/'), '/u/john/pages/demo');
|
|
assert.equal(pathnameFromUrl('/MindSpace/u/public/page.html'), '/MindSpace/u/public/page.html');
|
|
});
|