Files
Synapsis/src/lib/notifications/browser.test.ts
T
cyph3rasi d548d4bd6f Complete @mention system with shared parsing, accessible autocomplete, canonical links, moderated local notifications, durable idempotent swarm delivery, navigable remote notifications, and exact-once bot replies
Hop-State: A_06FPG3MP3DEEGFB3AWBG03G
Hop-Proposal: R_06FPG3KD4J27QKCSNRBMFF0
Hop-Task: T_06FPFT83JWNP9AP1GRH36VR
Hop-Attempt: AT_06FPFT83JZM51ZFSMVPE5QR
2026-07-15 16:13:34 -07:00

70 lines
2.3 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
browserNotificationsEnabledKey,
getBrowserNotificationContent,
parseBrowserNotificationPreferences,
} from './browser';
describe('browser notification presentation', () => {
it('scopes the opt-in to the signed-in account', () => {
expect(browserNotificationsEnabledKey('user-1'))
.toBe('synapsis:browser-notifications:user-1');
});
it('defaults every notification category on and preserves explicit choices', () => {
expect(parseBrowserNotificationPreferences(null)).toEqual({
follow: true,
like: true,
repost: true,
mention: true,
reply: true,
});
expect(parseBrowserNotificationPreferences('{"like":false}')).toMatchObject({
follow: true,
like: false,
mention: true,
});
});
it('links post interactions to the relevant post', () => {
expect(getBrowserNotificationContent({
id: 'notification-1',
type: 'like',
actor: { handle: 'alice', displayName: 'Alice' },
post: { id: 'post-1', content: 'A post worth liking' },
})).toEqual({
title: 'Alice liked your post',
body: 'A post worth liking',
url: '/posts/post-1',
tag: 'synapsis-notification-notification-1',
});
});
it('uses the notifications page when there is no post', () => {
expect(getBrowserNotificationContent({
id: 'notification-2',
type: 'follow',
actor: { handle: 'bob', displayName: null },
post: null,
})).toMatchObject({
title: 'bob followed you',
url: '/notifications',
});
});
it('links federated mentions to the source swarm post', () => {
expect(getBrowserNotificationContent({
id: 'notification-remote',
type: 'mention',
actor: { handle: 'alice@remote.example', displayName: 'Alice' },
post: {
id: 'swarm:remote.example:550e8400-e29b-41d4-a716-446655440000',
content: 'Hello @bob@local.example',
},
})).toMatchObject({
url: '/posts/swarm:remote.example:550e8400-e29b-41d4-a716-446655440000',
});
});
});