CI: Update Pages (2025-11-23 11:20:49)
This commit is contained in:
118
v0.1.0/src/Utils/__tests__/createRouteMatcher.test.ts
Normal file
118
v0.1.0/src/Utils/__tests__/createRouteMatcher.test.ts
Normal file
@@ -0,0 +1,118 @@
|
||||
import {
|
||||
assert,
|
||||
assertEquals,
|
||||
assertStrictEquals,
|
||||
} from 'https://deno.land/std/assert/mod.ts';
|
||||
import { IRouteDefinition } from '../../Interfaces/mod.ts';
|
||||
import { createRouteMatcher } from '../../mod.ts';
|
||||
|
||||
// Dummy request
|
||||
const dummyRequest = new Request('http://localhost');
|
||||
|
||||
Deno.test('createRouteMatcher: static route matches and extracts params', () => {
|
||||
const def: IRouteDefinition = { method: 'GET', path: '/users/:id' };
|
||||
const matcher = createRouteMatcher(def);
|
||||
|
||||
const result = matcher(new URL('http://localhost/users/42'), dummyRequest);
|
||||
|
||||
assert(result);
|
||||
assertEquals(result.params, { id: '42' });
|
||||
});
|
||||
|
||||
Deno.test('createRouteMatcher: static route with multiple params', () => {
|
||||
const def: IRouteDefinition = { method: 'GET', path: '/repo/:owner/:name' };
|
||||
const matcher = createRouteMatcher(def);
|
||||
|
||||
const result = matcher(
|
||||
new URL('http://localhost/repo/max/wiki'),
|
||||
dummyRequest,
|
||||
);
|
||||
|
||||
assert(result);
|
||||
assertEquals(result.params, { owner: 'max', name: 'wiki' });
|
||||
});
|
||||
|
||||
Deno.test('createRouteMatcher: static route does not match wrong path', () => {
|
||||
const def: IRouteDefinition = { method: 'GET', path: '/users/:id' };
|
||||
const matcher = createRouteMatcher(def);
|
||||
|
||||
const result = matcher(new URL('http://localhost/posts/42'), dummyRequest);
|
||||
|
||||
assertStrictEquals(result, null);
|
||||
});
|
||||
|
||||
Deno.test('createRouteMatcher: uses custom matcher if provided', () => {
|
||||
const def: IRouteDefinition = {
|
||||
method: 'GET',
|
||||
matcher: (url) => url.pathname === '/ping' ? { params: {} } : null,
|
||||
};
|
||||
const matcher = createRouteMatcher(def);
|
||||
|
||||
const result = matcher(new URL('http://localhost/ping'), dummyRequest);
|
||||
assert(result);
|
||||
assertEquals(result.params, {});
|
||||
});
|
||||
|
||||
Deno.test('createRouteMatcher: extracts single query param', () => {
|
||||
const def: IRouteDefinition = { method: 'GET', path: '/search' };
|
||||
const matcher = createRouteMatcher(def);
|
||||
|
||||
const url = new URL('http://localhost/search?q=deno');
|
||||
const result = matcher(url, dummyRequest);
|
||||
|
||||
assert(result);
|
||||
assertEquals(result.params, {}); // no path params
|
||||
assertEquals(result.query, { q: 'deno' }); // single key → string
|
||||
});
|
||||
|
||||
Deno.test('createRouteMatcher: duplicate query keys become array', () => {
|
||||
const def: IRouteDefinition = { method: 'GET', path: '/tags' };
|
||||
const matcher = createRouteMatcher(def);
|
||||
|
||||
const url = new URL('http://localhost/tags?tag=js&tag=ts&tag=deno');
|
||||
const result = matcher(url, dummyRequest);
|
||||
|
||||
assert(result);
|
||||
assertEquals(result.params, {});
|
||||
assertEquals(result.query, { tag: ['js', 'ts', 'deno'] }); // multi → string[]
|
||||
});
|
||||
|
||||
Deno.test('createRouteMatcher: mix of single and duplicate keys', () => {
|
||||
const def: IRouteDefinition = { method: 'GET', path: '/filter/:type' };
|
||||
const matcher = createRouteMatcher(def);
|
||||
|
||||
const url = new URL('http://localhost/filter/repo?lang=ts&lang=js&page=2');
|
||||
const result = matcher(url, dummyRequest);
|
||||
|
||||
assert(result);
|
||||
assertEquals(result.params, { type: 'repo' });
|
||||
assertEquals(result.query, {
|
||||
lang: ['ts', 'js'], // duplicated
|
||||
page: '2', // single
|
||||
});
|
||||
});
|
||||
|
||||
Deno.test('createRouteMatcher: no query parameters returns empty object', () => {
|
||||
const def: IRouteDefinition = { method: 'GET', path: '/info' };
|
||||
const matcher = createRouteMatcher(def);
|
||||
|
||||
const url = new URL('http://localhost/info');
|
||||
const result = matcher(url, dummyRequest);
|
||||
|
||||
assert(result);
|
||||
assertEquals(result.params, {});
|
||||
assertEquals(result.query, {}); // empty
|
||||
});
|
||||
|
||||
Deno.test('createRouteMatcher: retains array order of duplicate keys', () => {
|
||||
const def: IRouteDefinition = { method: 'GET', path: '/order' };
|
||||
const matcher = createRouteMatcher(def);
|
||||
|
||||
const url = new URL(
|
||||
'http://localhost/order?item=first&item=second&item=third',
|
||||
);
|
||||
const result = matcher(url, dummyRequest);
|
||||
|
||||
assert(result);
|
||||
assertEquals(result.query?.item, ['first', 'second', 'third']);
|
||||
});
|
||||
Reference in New Issue
Block a user