1
- import { assert , describe , expect , test } from 'vitest' ;
1
+ import { describe , expect , test } from 'vitest' ;
2
2
import { parseLocation } from './location' ;
3
3
4
4
const BASE_URL = 'https://www.esmx.dev' ;
@@ -200,7 +200,12 @@ describe('parseLocation', () => {
200
200
{
201
201
input : './new/100/' ,
202
202
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/' }
204
209
] ,
205
210
'https://www.esmx.dev/' : [
206
211
{ input : '/' , expected : 'https://www.esmx.dev/' } ,
@@ -242,7 +247,12 @@ describe('parseLocation', () => {
242
247
{
243
248
input : './new/100/' ,
244
249
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/' }
246
256
] ,
247
257
'https://www.esmx.dev/a/b/c' : [
248
258
{ input : '/' , expected : 'https://www.esmx.dev/a/b/' } ,
@@ -290,6 +300,15 @@ describe('parseLocation', () => {
290
300
{
291
301
input : './new/100/' ,
292
302
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/'
293
312
}
294
313
] ,
295
314
'https://www.esmx.dev/a/b/c/' : [
@@ -341,6 +360,15 @@ describe('parseLocation', () => {
341
360
{
342
361
input : './new/100/' ,
343
362
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/'
344
372
}
345
373
]
346
374
} ) . map ( ( [ base , cases ] ) => {
@@ -366,4 +394,29 @@ describe('parseLocation', () => {
366
394
) ;
367
395
} ) ;
368
396
} ) ;
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
+ } ) ;
369
422
} ) ;
0 commit comments