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'); });