CI: Update Pages (2025-11-23 11:20:49)
This commit is contained in:
28
v0.1.0/src/Utils/__tests__/createEmptyContext.test.ts
Normal file
28
v0.1.0/src/Utils/__tests__/createEmptyContext.test.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { assertEquals } from 'https://deno.land/std/assert/mod.ts';
|
||||
import { createEmptyContext } from '../createEmptyContext.ts';
|
||||
import { IContext } from '../../Interfaces/mod.ts';
|
||||
|
||||
Deno.test('createEmptyContext: returns default-initialized context', () => {
|
||||
const request = new Request('http://localhost');
|
||||
const ctx = createEmptyContext(request);
|
||||
|
||||
assertEquals(ctx.req, request);
|
||||
assertEquals(ctx.params, {});
|
||||
assertEquals(ctx.query, {});
|
||||
assertEquals(ctx.state, {});
|
||||
});
|
||||
|
||||
Deno.test('createEmptyContext: preserves generic type compatibility', () => {
|
||||
interface MyContext
|
||||
extends
|
||||
IContext<{ userId: string }, { id: string }, { verbose: string }> {}
|
||||
|
||||
const req = new Request('http://localhost');
|
||||
const ctx = createEmptyContext<MyContext>(req);
|
||||
|
||||
// All properties exist and are empty
|
||||
assertEquals(ctx.params, {} as MyContext['params']);
|
||||
assertEquals(ctx.query, {} as MyContext['query']);
|
||||
assertEquals(ctx.state, {} as MyContext['state']);
|
||||
assertEquals(ctx.req, req);
|
||||
});
|
||||
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']);
|
||||
});
|
||||
35
v0.1.0/src/Utils/__tests__/normalizeError.test.ts
Normal file
35
v0.1.0/src/Utils/__tests__/normalizeError.test.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import {
|
||||
assertEquals,
|
||||
assertInstanceOf,
|
||||
} from 'https://deno.land/std/assert/mod.ts';
|
||||
import { normalizeError } from '../normalizeError.ts';
|
||||
|
||||
Deno.test('normalizeError: preserves Error instances', () => {
|
||||
const original = new Error('original');
|
||||
const result = normalizeError(original);
|
||||
|
||||
assertInstanceOf(result, Error);
|
||||
assertEquals(result, original);
|
||||
});
|
||||
|
||||
Deno.test('normalizeError: converts string to Error', () => {
|
||||
const result = normalizeError('something went wrong');
|
||||
|
||||
assertInstanceOf(result, Error);
|
||||
assertEquals(result.message, 'something went wrong');
|
||||
});
|
||||
|
||||
Deno.test('normalizeError: converts number to Error', () => {
|
||||
const result = normalizeError(404);
|
||||
|
||||
assertInstanceOf(result, Error);
|
||||
assertEquals(result.message, '404');
|
||||
});
|
||||
|
||||
Deno.test('normalizeError: converts plain object to Error', () => {
|
||||
const input = { error: true, msg: 'Invalid' };
|
||||
const result = normalizeError(input);
|
||||
|
||||
assertInstanceOf(result, Error);
|
||||
assertEquals(result.message, JSON.stringify(input));
|
||||
});
|
||||
Reference in New Issue
Block a user