- Add docker-compose.test.yml with isolated PostgreSQL on port 5433 - Add environment variable support for database connection config - Add test setup utilities and initial user hydrator tests - Add test and test:watch scripts to package.json Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
99 lines
3.0 KiB
TypeScript
99 lines
3.0 KiB
TypeScript
// Tests for user hydrator
|
|
// Run with: cd express && DB_PORT=5433 DB_USER=diachron_test DB_PASSWORD=diachron_test DB_NAME=diachron_test ../cmd npx tsx --test framework/hydrators/tests/user.test.ts
|
|
|
|
import { describe, it, before, after, beforeEach } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import {
|
|
setupTestDatabase,
|
|
cleanupTables,
|
|
teardownTestDatabase,
|
|
insertTestUser,
|
|
} from "./setup";
|
|
import { get } from "../user";
|
|
|
|
describe("user hydrator", () => {
|
|
before(async () => {
|
|
await setupTestDatabase();
|
|
});
|
|
|
|
after(async () => {
|
|
await teardownTestDatabase();
|
|
});
|
|
|
|
beforeEach(async () => {
|
|
await cleanupTables();
|
|
});
|
|
|
|
describe("get", () => {
|
|
it("returns null for non-existent user", async () => {
|
|
const result = await get("00000000-0000-0000-0000-000000000000");
|
|
assert.equal(result, null);
|
|
});
|
|
|
|
it("returns user when found", async () => {
|
|
const userId = "cfae0a19-6515-4813-bc2d-1e032b72b203";
|
|
await insertTestUser({
|
|
id: userId,
|
|
displayName: "Test User",
|
|
status: "active",
|
|
email: "test@example.com",
|
|
});
|
|
|
|
const result = await get(userId);
|
|
|
|
assert.notEqual(result, null);
|
|
assert.equal(result!.id, userId);
|
|
assert.equal(result!.display_name, "Test User");
|
|
assert.equal(result!.status, "active");
|
|
assert.equal(result!.email, "test@example.com");
|
|
});
|
|
|
|
it("validates user data with zod parser", async () => {
|
|
const userId = crypto.randomUUID();
|
|
await insertTestUser({
|
|
id: userId,
|
|
displayName: "Valid User",
|
|
status: "active",
|
|
email: "valid@example.com",
|
|
});
|
|
|
|
const result = await get(userId);
|
|
|
|
// If we get here without throwing, parsing succeeded
|
|
assert.notEqual(result, null);
|
|
assert.equal(typeof result!.id, "string");
|
|
assert.equal(typeof result!.email, "string");
|
|
});
|
|
|
|
it("returns user with pending status", async () => {
|
|
const userId = crypto.randomUUID();
|
|
await insertTestUser({
|
|
id: userId,
|
|
displayName: "Pending User",
|
|
status: "pending",
|
|
email: "pending@example.com",
|
|
});
|
|
|
|
const result = await get(userId);
|
|
|
|
assert.notEqual(result, null);
|
|
assert.equal(result!.status, "pending");
|
|
});
|
|
|
|
it("returns user with suspended status", async () => {
|
|
const userId = crypto.randomUUID();
|
|
await insertTestUser({
|
|
id: userId,
|
|
displayName: "Suspended User",
|
|
status: "suspended",
|
|
email: "suspended@example.com",
|
|
});
|
|
|
|
const result = await get(userId);
|
|
|
|
assert.notEqual(result, null);
|
|
assert.equal(result!.status, "suspended");
|
|
});
|
|
});
|
|
});
|