fix(analytics): stop identifying Public visitors as page creators
Public generated pages were calling umami.identify(owner_id), collapsing every visitor into the creator session. Anonymous visits now skip identify; logged-in viewers identify with their own distinct id. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -4,6 +4,7 @@ import vm from 'node:vm';
|
||||
|
||||
import {
|
||||
buildProductAnalyticsContext,
|
||||
buildViewerAnalyticsIdentity,
|
||||
injectMindSpaceAnalytics,
|
||||
pseudonymizeAnalyticsId,
|
||||
resolveAnalyticsIdentity,
|
||||
@@ -124,9 +125,10 @@ test('injects one local same-origin tracker with page dimensions', () => {
|
||||
assert.match(out, /src="\/analytics\/script\.js"/);
|
||||
assert.match(out, /data-host-url="\/analytics"/);
|
||||
assert.match(out, /data-auto-track="false"/);
|
||||
assert.match(out, /window\.umami\.identify\(d\.owner_id,\{username:d\.username,memind_page_url:location\.href,owner_segment:d\.owner_segment,plan_type:d\.plan_type,channel:d\.channel,surface:d\.surface,identity_mode:d\.identity_mode\}\)/);
|
||||
assert.doesNotMatch(out, /umami\.identify\(d\.owner_id/);
|
||||
assert.match(out, /function identifyViewer\(\)/);
|
||||
assert.match(out, /identifyViewer\(\);pageview\(\)/);
|
||||
assert.match(out, /function pageview\(\).*window\.umami\.track\(\)/);
|
||||
assert.ok(out.indexOf('identify();pageview();') > 0);
|
||||
assert.doesNotMatch(out, /t\('page_view'\)/);
|
||||
assert.match(out, /page_id/);
|
||||
assert.match(out, /owner_segment/);
|
||||
@@ -143,7 +145,7 @@ test('injects one local same-origin tracker with page dimensions', () => {
|
||||
assert.equal(injectMindSpaceAnalytics(out, { ownerId: 'user-123', config: { enabled: true, websiteId: 'local-website', idSecret: 'secret' } }), out);
|
||||
});
|
||||
|
||||
test('identifies the pseudonymous owner before sending a standard page view', () => {
|
||||
test('public visitors skip creator identify and only send a standard page view', () => {
|
||||
const out = injectMindSpaceAnalytics('<!doctype html><html><head></head><body></body></html>', {
|
||||
ownerId: 'user-123',
|
||||
ownerSegment: 'plan:pro',
|
||||
@@ -177,22 +179,67 @@ test('identifies the pseudonymous owner before sending a standard page view', ()
|
||||
documentElement: { scrollHeight: 1600 },
|
||||
addEventListener: () => {},
|
||||
},
|
||||
location: { href: 'https://m.tkmind.cn/MindSpace/demo/public/page.html' },
|
||||
location: { href: 'https://m.tkmind.cn/MindSpace/demo/public/page.html', pathname: '/MindSpace/demo/public/page.html' },
|
||||
setTimeout: () => {},
|
||||
});
|
||||
|
||||
assert.deepEqual(JSON.parse(JSON.stringify(calls)), [['track']]);
|
||||
});
|
||||
|
||||
test('logged-in public visitors identify themselves without using the page creator id', () => {
|
||||
const viewerId = pseudonymizeAnalyticsId('viewer-456', 'secret');
|
||||
const out = injectMindSpaceAnalytics('<!doctype html><html><head></head><body></body></html>', {
|
||||
ownerId: 'user-123',
|
||||
ownerLabel: '张三',
|
||||
viewerIdentity: buildViewerAnalyticsIdentity(
|
||||
{ id: 'viewer-456', displayName: '李四', role: 'user', planType: 'free' },
|
||||
{ idSecret: 'secret', identityMode: 'pseudonymous' },
|
||||
),
|
||||
config: {
|
||||
enabled: true,
|
||||
websiteId: 'local-website',
|
||||
idSecret: 'secret',
|
||||
scriptPath: '/analytics/script.js',
|
||||
hostPath: '/analytics',
|
||||
},
|
||||
});
|
||||
const inlineScript = out.match(/<script data-memind-analytics="1">([\s\S]*?)<\/script>/)?.[1];
|
||||
assert.ok(inlineScript);
|
||||
|
||||
const calls = [];
|
||||
vm.runInNewContext(inlineScript, {
|
||||
window: {
|
||||
umami: {
|
||||
identify: (...args) => calls.push(['identify', ...args]),
|
||||
track: (...args) => calls.push(['track', ...args]),
|
||||
},
|
||||
innerHeight: 800,
|
||||
scrollY: 0,
|
||||
addEventListener: () => {},
|
||||
},
|
||||
document: {
|
||||
readyState: 'complete',
|
||||
title: 'Demo',
|
||||
documentElement: { scrollHeight: 1600 },
|
||||
addEventListener: () => {},
|
||||
},
|
||||
location: { href: 'https://m.tkmind.cn/MindSpace/demo/public/page.html', pathname: '/MindSpace/demo/public/page.html' },
|
||||
setTimeout: () => {},
|
||||
});
|
||||
|
||||
assert.deepEqual(JSON.parse(JSON.stringify(calls)), [
|
||||
['identify', pseudonymizeAnalyticsId('user-123', 'secret'), {
|
||||
username: '张三',
|
||||
['identify', viewerId, {
|
||||
username: '李四',
|
||||
memind_page_url: 'https://m.tkmind.cn/MindSpace/demo/public/page.html',
|
||||
owner_segment: 'plan:pro',
|
||||
channel: 'h5',
|
||||
owner_segment: 'plan:free',
|
||||
plan_type: 'free',
|
||||
channel: 'public',
|
||||
surface: 'generated_page',
|
||||
plan_type: 'unknown',
|
||||
identity_mode: 'pseudonymous',
|
||||
}],
|
||||
['track'],
|
||||
]);
|
||||
assert.notEqual(viewerId, 'user-123');
|
||||
});
|
||||
|
||||
test('does not alter non-full-html or disabled pages', () => {
|
||||
|
||||
Reference in New Issue
Block a user