Skip to content

Commit 9c8ed46

Browse files
committed
test(router): 增加相对路径解析和错误处理的测试用例
1 parent b9c7b48 commit 9c8ed46

File tree

1 file changed

+56
-3
lines changed

1 file changed

+56
-3
lines changed

packages/router/src/next/location.test.ts

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { assert, describe, expect, test } from 'vitest';
1+
import { describe, expect, test } from 'vitest';
22
import { parseLocation } from './location';
33

44
const BASE_URL = 'https://www.esmx.dev';
@@ -200,7 +200,12 @@ describe('parseLocation', () => {
200200
{
201201
input: './new/100/',
202202
expected: 'https://www.esmx.dev/new/100/'
203-
}
203+
},
204+
{ input: '.a', expected: 'https://www.esmx.dev/.a' },
205+
{ input: '..a', expected: 'https://www.esmx.dev/..a' },
206+
{ input: '.a/', expected: 'https://www.esmx.dev/.a/' },
207+
{ input: '..a/', expected: 'https://www.esmx.dev/..a/' },
208+
{ input: 'new/../.', expected: 'https://www.esmx.dev/' }
204209
],
205210
'https://www.esmx.dev/': [
206211
{ input: '/', expected: 'https://www.esmx.dev/' },
@@ -242,7 +247,12 @@ describe('parseLocation', () => {
242247
{
243248
input: './new/100/',
244249
expected: 'https://www.esmx.dev/new/100/'
245-
}
250+
},
251+
{ input: '.a', expected: 'https://www.esmx.dev/.a' },
252+
{ input: '..a', expected: 'https://www.esmx.dev/..a' },
253+
{ input: '.a/', expected: 'https://www.esmx.dev/.a/' },
254+
{ input: '..a/', expected: 'https://www.esmx.dev/..a/' },
255+
{ input: 'new/../.', expected: 'https://www.esmx.dev/' }
246256
],
247257
'https://www.esmx.dev/a/b/c': [
248258
{ input: '/', expected: 'https://www.esmx.dev/a/b/' },
@@ -290,6 +300,15 @@ describe('parseLocation', () => {
290300
{
291301
input: './new/100/',
292302
expected: 'https://www.esmx.dev/a/b/new/100/'
303+
},
304+
{ input: '.a', expected: 'https://www.esmx.dev/a/b/.a' },
305+
{ input: '..a', expected: 'https://www.esmx.dev/a/b/..a' },
306+
{ input: '.a/', expected: 'https://www.esmx.dev/a/b/.a/' },
307+
{ input: '..a/', expected: 'https://www.esmx.dev/a/b/..a/' },
308+
{ input: 'new/../.', expected: 'https://www.esmx.dev/a/b/' },
309+
{
310+
input: 'new/.././a/../../x/',
311+
expected: 'https://www.esmx.dev/a/x/'
293312
}
294313
],
295314
'https://www.esmx.dev/a/b/c/': [
@@ -341,6 +360,15 @@ describe('parseLocation', () => {
341360
{
342361
input: './new/100/',
343362
expected: 'https://www.esmx.dev/a/b/c/new/100/'
363+
},
364+
{ input: '.a', expected: 'https://www.esmx.dev/a/b/c/.a' },
365+
{ input: '..a', expected: 'https://www.esmx.dev/a/b/c/..a' },
366+
{ input: '.a/', expected: 'https://www.esmx.dev/.a/' },
367+
{ input: '..a/', expected: 'https://www.esmx.dev/..a/' },
368+
{ input: 'new/.././', expected: 'https://www.esmx.dev/a/b/c/' },
369+
{
370+
input: 'new/.././a/../../x/',
371+
expected: 'https://www.esmx.dev/a/b/x/'
344372
}
345373
]
346374
}).map(([base, cases]) => {
@@ -366,4 +394,29 @@ describe('parseLocation', () => {
366394
);
367395
});
368396
});
397+
398+
describe('错误处理', () => {
399+
test('对于无效的 URL 应该抛出错误', () => {
400+
expect(() =>
401+
parseLocation(null as unknown as string, BASE_URL)
402+
).toThrowError('Invalid URL: invalid-url');
403+
expect(() =>
404+
parseLocation(Number.NaN as unknown as string, BASE_URL)
405+
).toThrowError('Invalid URL: invalid-url');
406+
expect(() =>
407+
parseLocation('-a://example.com', BASE_URL)
408+
).toThrowError('Invalid URL: invalid-url');
409+
});
410+
});
411+
412+
describe('特殊情况', () => {
413+
test('特殊 hash 字符', () => {
414+
expect(parseLocation(BASE_URL + '#a?a', BASE_URL)).toEqURL(
415+
BASE_URL + '#a?a'
416+
);
417+
expect(parseLocation(BASE_URL + '#a?a#b', BASE_URL)).toEqURL(
418+
BASE_URL + '#a?a#b'
419+
);
420+
});
421+
});
369422
});

0 commit comments

Comments
 (0)