/
url.test.ts
93 lines (87 loc) · 2.88 KB
/
url.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import { history, document } from 'global';
import { pathToId, setPath, parseQueryParameters, getSelectionSpecifierFromPath } from './url';
jest.mock('global', () => ({
history: { replaceState: jest.fn() },
document: {
location: {
pathname: 'pathname',
search: '',
},
},
}));
describe('url', () => {
describe('pathToId', () => {
it('should parse valid ids', () => {
expect(pathToId('/story/story--id')).toEqual('story--id');
});
it('should error on invalid ids', () => {
[null, '', '/whatever/story/story--id'].forEach((path) => {
expect(() => pathToId(path)).toThrow(/Invalid/);
});
});
});
describe('setPath', () => {
it('should navigate to storyId', () => {
setPath({ storyId: 'story--id', viewMode: 'story' });
expect(history.replaceState).toHaveBeenCalledWith(
{},
'',
'pathname?id=story--id&viewMode=story'
);
});
it('should replace legacy parameters but preserve others', () => {
document.location.search = 'foo=bar&selectedStory=selStory&selectedKind=selKind';
setPath({ storyId: 'story--id', viewMode: 'story' });
expect(history.replaceState).toHaveBeenCalledWith(
{},
'',
'pathname?foo=bar&id=story--id&viewMode=story'
);
});
it('should ignore + keep hashes', () => {
document.location.search = 'foo=bar&selectedStory=selStory&selectedKind=selKind';
document.location.hash = '#foobar';
setPath({ storyId: 'story--id', viewMode: 'story' });
expect(history.replaceState).toHaveBeenCalledWith(
{},
'',
'pathname?foo=bar&id=story--id&viewMode=story#foobar'
);
});
});
describe('parseQueryParameters', () => {
it('should parse id', () => {
expect(parseQueryParameters('?foo=bar&id=story--id')).toBe('story--id');
});
it('should not parse non-ids', () => {
expect(parseQueryParameters('')).toBeUndefined();
});
});
describe('getSelectionSpecifierFromPath', () => {
it('should handle no search', () => {
document.location.search = '';
expect(getSelectionSpecifierFromPath()).toEqual(null);
});
it('should handle id queries', () => {
document.location.search = '?id=story--id';
expect(getSelectionSpecifierFromPath()).toEqual({
storySpecifier: 'story--id',
viewMode: 'story',
});
});
it('should handle id queries with *', () => {
document.location.search = '?id=*';
expect(getSelectionSpecifierFromPath()).toEqual({
storySpecifier: '*',
viewMode: 'story',
});
});
it('should redirect legacy queries', () => {
document.location.search = '?selectedKind=kind&selectedStory=story';
expect(getSelectionSpecifierFromPath()).toEqual({
storySpecifier: { kind: 'kind', name: 'story' },
viewMode: 'story',
});
});
});
});