Tests for: - user.ts: User class, roles, permissions, status checks - util.ts: loadFile utility - handlers.ts: multiHandler - types.ts: methodParser, requireAuth, requirePermission - logging.ts: module structure - database.ts: connectionConfig, raw queries, PostgresAuthStore - auth/token.ts: generateToken, hashToken, parseAuthorizationHeader - auth/password.ts: hashPassword, verifyPassword (scrypt) - auth/types.ts: Zod parsers, Session class, tokenLifetimes - auth/store.ts: InMemoryAuthStore - auth/service.ts: AuthService (login, register, verify, reset) - basic/*.ts: route structure tests Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
72 lines
2.3 KiB
TypeScript
72 lines
2.3 KiB
TypeScript
// Tests for handlers.ts
|
|
// These tests use mock Call objects
|
|
|
|
import assert from "node:assert/strict";
|
|
import { describe, it } from "node:test";
|
|
import type { Request as ExpressRequest } from "express";
|
|
import { Session } from "./auth/types";
|
|
import { contentTypes } from "./content-types";
|
|
import { multiHandler } from "./handlers";
|
|
import { httpCodes } from "./http-codes";
|
|
import type { Call } from "./types";
|
|
import { anonymousUser } from "./user";
|
|
|
|
// Helper to create a minimal mock Call
|
|
function createMockCall(overrides: Partial<Call> = {}): Call {
|
|
const defaultSession = new Session(null, anonymousUser);
|
|
return {
|
|
pattern: "/test",
|
|
path: "/test",
|
|
method: "GET",
|
|
parameters: {},
|
|
request: {} as ExpressRequest,
|
|
user: anonymousUser,
|
|
session: defaultSession,
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
describe("handlers", () => {
|
|
describe("multiHandler", () => {
|
|
it("returns OK status", async () => {
|
|
const call = createMockCall({ method: "GET" });
|
|
const result = await multiHandler(call);
|
|
|
|
assert.equal(result.code, httpCodes.success.OK);
|
|
});
|
|
|
|
it("returns text/plain content type", async () => {
|
|
const call = createMockCall();
|
|
const result = await multiHandler(call);
|
|
|
|
assert.equal(result.contentType, contentTypes.text.plain);
|
|
});
|
|
|
|
it("includes method in result", async () => {
|
|
const call = createMockCall({ method: "POST" });
|
|
const result = await multiHandler(call);
|
|
|
|
assert.ok(result.result.includes("POST"));
|
|
});
|
|
|
|
it("includes a random number in result", async () => {
|
|
const call = createMockCall();
|
|
const result = await multiHandler(call);
|
|
|
|
// Result format: "that was GET (0.123456789)"
|
|
assert.match(result.result, /that was \w+ \(\d+\.?\d*\)/);
|
|
});
|
|
|
|
it("works with different HTTP methods", async () => {
|
|
const methods = ["GET", "POST", "PUT", "PATCH", "DELETE"] as const;
|
|
|
|
for (const method of methods) {
|
|
const call = createMockCall({ method });
|
|
const result = await multiHandler(call);
|
|
|
|
assert.ok(result.result.includes(method));
|
|
}
|
|
});
|
|
});
|
|
});
|