-
-
Notifications
You must be signed in to change notification settings - Fork 2k
/
Copy pathutils.spec.js
132 lines (114 loc) · 3.59 KB
/
utils.spec.js
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import { assert, test } from 'vitest';
import { get_pathname, pattern_to_src } from '../utils.js';
// workaround so that TypeScript doesn't follow that import which makes it pick up that file and then error on missing import aliases
const { parse_route_id } = await import('../../kit/src/' + 'utils/routing.js');
/**
* @param {import('@sveltejs/kit').RouteDefinition<any>['segments']} segments
* @param {string} expected
*/
function run_get_pathname_test(segments, expected) {
const route = /** @type {import('@sveltejs/kit').RouteDefinition<any>} */ ({ segments });
assert.equal(get_pathname(route), expected);
}
test('get_pathname for simple route', () => {
run_get_pathname_test([{ content: 'foo', dynamic: false, rest: false }], 'foo');
});
test('get_pathname for simple route with multiple segments', () => {
run_get_pathname_test(
[
{ content: 'foo', dynamic: false, rest: false },
{ content: 'bar', dynamic: false, rest: false }
],
'foo/bar'
);
});
test('get_pathname for route with parameters', () => {
run_get_pathname_test(
[
{ content: 'foo', dynamic: false, rest: false },
{ content: '[bar]', dynamic: true, rest: false }
],
'foo/$1'
);
});
test('get_pathname for route with parameters within segment', () => {
run_get_pathname_test(
[
{ content: 'foo-[bar]', dynamic: true, rest: false },
{ content: '[baz]-buz', dynamic: true, rest: false }
],
'foo-$1/$2-buz'
);
});
test('get_pathname for route with optional parameters within segment', () => {
run_get_pathname_test(
[
{ content: 'foo-[[bar]]', dynamic: true, rest: false },
{ content: '[[baz]]-buz', dynamic: true, rest: false }
],
'foo-$1/$2-buz'
);
});
test('get_pathname for route with rest parameter', () => {
run_get_pathname_test(
[
{ content: 'foo', dynamic: false, rest: false },
{ content: '[[...rest]]', dynamic: true, rest: true }
],
'foo$1'
);
});
test('get_pathname for route with required and rest parameter', () => {
run_get_pathname_test(
[
{ content: '[foo]', dynamic: true, rest: false },
{ content: '[...rest]', dynamic: true, rest: true }
],
'$1$2'
);
});
test('get_pathname for route with required and optional parameter', () => {
run_get_pathname_test(
[
{ content: '[foo]', dynamic: true, rest: false },
{ content: '[[optional]]', dynamic: true, rest: true }
],
'$1$2'
);
});
test('get_pathname for route with required and optional parameter', () => {
run_get_pathname_test(
[
{ content: '[foo]', dynamic: true, rest: false },
{ content: '[[...rest]]', dynamic: true, rest: true },
{ content: 'bar', dynamic: false, rest: false }
],
'$1$2/bar'
);
});
/**
* @param {string} route_id
* @param {string} expected
*/
function run_pattern_to_src_test(route_id, expected) {
const { pattern } = parse_route_id(route_id);
assert.equal(pattern_to_src(pattern.toString()), expected);
}
test('pattern_to_src for simple route', () => {
run_pattern_to_src_test('/', '^/?');
});
test('pattern_to_src for route with parameters', () => {
run_pattern_to_src_test('/foo/[bar]', '^/foo/([^/]+?)/?');
});
test('pattern_to_src for route with optional parameters', () => {
run_pattern_to_src_test('/foo/[[bar]]', '^/foo(/[^/]+)?/?');
});
test('pattern_to_src for route with optional parameter in the middle', () => {
run_pattern_to_src_test('/foo/[[bar]]/baz', '^/foo(/[^/]+)?/baz/?');
});
test('pattern_to_src for route with rest parameter', () => {
run_pattern_to_src_test('/foo/[...bar]', '^/foo(/.*)?/?');
});
test('pattern_to_src for route with rest parameter in the middle', () => {
run_pattern_to_src_test('/foo/[...bar]/baz', '^/foo(/.*)?/baz/?');
});