Files
webmail/lib/__tests__/deep-link-handoff.test.ts
T

86 lines
3.0 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest';
import {
setPendingDeepLink,
consumePendingDeepLink,
consumePendingDeepLinkEntry,
subscribePendingDeepLink,
clearPendingDeepLinks,
} from '@/lib/deep-link-handoff';
describe('deep-link handoff', () => {
beforeEach(() => {
clearPendingDeepLinks();
});
it('parks segments and yields them exactly once', () => {
setPendingDeepLink('mail', ['message', 'abc']);
expect(consumePendingDeepLink('mail')).toEqual(['message', 'abc']);
expect(consumePendingDeepLink('mail')).toBeNull();
});
it('keeps surfaces separate', () => {
setPendingDeepLink('mail', ['message', 'abc']);
setPendingDeepLink('settings', ['folders']);
expect(consumePendingDeepLink('settings')).toEqual(['folders']);
expect(consumePendingDeepLink('mail')).toEqual(['message', 'abc']);
});
it('delivers live to a subscribed surface instead of parking', () => {
const listener = vi.fn();
const unsubscribe = subscribePendingDeepLink('mail', listener);
setPendingDeepLink('mail', ['message', 'abc']);
expect(listener).toHaveBeenCalledWith(['message', 'abc']);
// Delivered, not parked: a later mount finds nothing.
expect(consumePendingDeepLink('mail')).toBeNull();
unsubscribe();
});
it('a listener only receives its own surface', () => {
const listener = vi.fn();
const unsubscribe = subscribePendingDeepLink('mail', listener);
setPendingDeepLink('settings', ['folders']);
expect(listener).not.toHaveBeenCalled();
expect(consumePendingDeepLink('settings')).toEqual(['folders']);
unsubscribe();
});
it('unsubscribing restores parking', () => {
const listener = vi.fn();
const unsubscribe = subscribePendingDeepLink('mail', listener);
unsubscribe();
setPendingDeepLink('mail', ['folder', 'inbox']);
expect(listener).not.toHaveBeenCalled();
expect(consumePendingDeepLink('mail')).toEqual(['folder', 'inbox']);
});
it('parks the search string with the segments and yields both once', () => {
setPendingDeepLink('calendar', ['event', 'ev1'], '?account=c&login=a@b');
expect(consumePendingDeepLinkEntry('calendar')).toEqual({
segments: ['event', 'ev1'],
search: '?account=c&login=a@b',
});
expect(consumePendingDeepLinkEntry('calendar')).toBeNull();
});
it('the segments-only consumer still works when a search string was parked', () => {
setPendingDeepLink('files', ['Documents'], '?preview=notes.txt');
expect(consumePendingDeepLink('files')).toEqual(['Documents']);
expect(consumePendingDeepLink('files')).toBeNull();
});
it('delivers the search string live to a subscribed surface', () => {
const listener = vi.fn();
const unsubscribe = subscribePendingDeepLink('files', listener);
setPendingDeepLink('files', ['Documents'], '?preview=notes.txt');
expect(listener).toHaveBeenCalledWith(['Documents'], '?preview=notes.txt');
expect(consumePendingDeepLinkEntry('files')).toBeNull();
unsubscribe();
});
});