- Replace standard imports with type-only imports to improve clarity and align with TypeScript best practices. - Ensure consistency across modules by modifying all relevant files.
119 lines
3.9 KiB
TypeScript
119 lines
3.9 KiB
TypeScript
import {
|
|
assert,
|
|
assertEquals,
|
|
assertStrictEquals,
|
|
} from 'https://deno.land/std/assert/mod.ts';
|
|
import type { 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']);
|
|
});
|