|
| 1 | +import { test } from 'uvu'; |
| 2 | +import * as assert from 'uvu/assert'; |
| 3 | + |
| 4 | +// @ts-expect-error - no types, not meant for public use |
| 5 | +import { exec } from '../../src/router.js'; |
| 6 | + |
| 7 | +function execPath(path, pattern, opts) { |
| 8 | + return exec(path, pattern, { path, query: {}, params: {}, ...(opts || {}) }); |
| 9 | +} |
| 10 | + |
| 11 | +test('Base route', () => { |
| 12 | + const accurateResult = execPath('/', '/'); |
| 13 | + assert.equal(accurateResult, { path: '/', params: {}, query: {} }); |
| 14 | + |
| 15 | + const inaccurateResult = execPath('/user/1', '/'); |
| 16 | + assert.equal(inaccurateResult, undefined); |
| 17 | +}); |
| 18 | + |
| 19 | +test('Param route', () => { |
| 20 | + const accurateResult = execPath('/user/2', '/user/:id'); |
| 21 | + assert.equal(accurateResult, { path: '/user/2', params: { id: '2' }, id: '2', query: {} }); |
| 22 | + |
| 23 | + const inaccurateResult = execPath('/', '/user/:id'); |
| 24 | + assert.equal(inaccurateResult, undefined); |
| 25 | +}); |
| 26 | + |
| 27 | +test('Param rest segment', () => { |
| 28 | + const accurateResult = execPath('/user/foo', '/user/*'); |
| 29 | + assert.equal(accurateResult, { path: '/user/foo', params: {}, query: {}, rest: '/foo' }); |
| 30 | + |
| 31 | + const inaccurateResult = execPath('/', '/user/:id/*'); |
| 32 | + assert.equal(inaccurateResult, undefined); |
| 33 | +}); |
| 34 | + |
| 35 | +test('Param route with rest segment', () => { |
| 36 | + const accurateResult = execPath('/user/2/foo', '/user/:id/*'); |
| 37 | + assert.equal(accurateResult, { path: '/user/2/foo', params: { id: '2' }, id: '2', query: {}, rest: '/foo' }); |
| 38 | + |
| 39 | + const accurateResult2 = execPath('/user/2/foo/bar/bob', '/user/:id/*'); |
| 40 | + assert.equal(accurateResult2, { |
| 41 | + path: '/user/2/foo/bar/bob', |
| 42 | + params: { id: '2' }, |
| 43 | + id: '2', |
| 44 | + query: {}, |
| 45 | + rest: '/foo/bar/bob' |
| 46 | + }); |
| 47 | + |
| 48 | + const inaccurateResult = execPath('/', '/user/:id/*'); |
| 49 | + assert.equal(inaccurateResult, undefined); |
| 50 | +}); |
| 51 | + |
| 52 | +test('Optional param route', () => { |
| 53 | + const accurateResult = execPath('/user', '/user/:id?'); |
| 54 | + assert.equal(accurateResult, { path: '/user', params: { id: undefined }, id: undefined, query: {} }); |
| 55 | + |
| 56 | + const inaccurateResult = execPath('/', '/user/:id?'); |
| 57 | + assert.equal(inaccurateResult, undefined); |
| 58 | +}); |
| 59 | + |
| 60 | +test('Optional rest param route "/:x*"', () => { |
| 61 | + const accurateResult = execPath('/user', '/user/:id?'); |
| 62 | + assert.equal(accurateResult, { path: '/user', params: { id: undefined }, id: undefined, query: {} }); |
| 63 | + |
| 64 | + const inaccurateResult = execPath('/', '/user/:id?'); |
| 65 | + assert.equal(inaccurateResult, undefined); |
| 66 | +}); |
| 67 | + |
| 68 | +test('Rest param route "/:x+"', () => { |
| 69 | + const matchedResult = execPath('/user/foo', '/user/:id+'); |
| 70 | + assert.equal(matchedResult, { path: '/user/foo', params: { id: 'foo' }, id: 'foo', query: {} }); |
| 71 | + |
| 72 | + const matchedResultWithSlash = execPath('/user/foo/bar', '/user/:id+'); |
| 73 | + assert.equal(matchedResultWithSlash, { |
| 74 | + path: '/user/foo/bar', |
| 75 | + params: { id: 'foo/bar' }, |
| 76 | + id: 'foo/bar', |
| 77 | + query: {} |
| 78 | + }); |
| 79 | + |
| 80 | + const emptyResult = execPath('/user', '/user/:id+'); |
| 81 | + assert.equal(emptyResult, undefined); |
| 82 | + |
| 83 | + const mismatchedResult = execPath('/', '/user/:id+'); |
| 84 | + assert.equal(mismatchedResult, undefined); |
| 85 | +}); |
| 86 | + |
| 87 | +test('Handles leading/trailing slashes', () => { |
| 88 | + const result = execPath('/about-late/_SEGMENT1_/_SEGMENT2_/', '/about-late/:seg1/:seg2/'); |
| 89 | + assert.equal(result, { |
| 90 | + path: '/about-late/_SEGMENT1_/_SEGMENT2_/', |
| 91 | + params: { |
| 92 | + seg1: '_SEGMENT1_', |
| 93 | + seg2: '_SEGMENT2_' |
| 94 | + }, |
| 95 | + seg1: '_SEGMENT1_', |
| 96 | + seg2: '_SEGMENT2_', |
| 97 | + query: {} |
| 98 | + }); |
| 99 | +}); |
| 100 | + |
| 101 | +test('should not overwrite existing properties', () => { |
| 102 | + const result = execPath('/foo/bar', '/:path/:query', { path: '/custom-path' }); |
| 103 | + assert.equal(result, { |
| 104 | + params: { path: 'foo', query: 'bar' }, |
| 105 | + path: '/custom-path', |
| 106 | + query: {} |
| 107 | + }); |
| 108 | +}); |
| 109 | + |
| 110 | +test.run(); |
0 commit comments