/** * Test helpers for OIDC plugin tests */ import { Db, MongoClient } from "mongodb"; import { OidcProviderConfig } from "../../src/OidcProviderConfig"; /** * Create a mock MongoDB database for testing */ export async function createMockDb(): Promise<{ db: Db; client: MongoClient; cleanup: () => Promise }> { const client = new MongoClient("mongodb://localhost:27017", { serverSelectionTimeoutMS: 5000, }); await client.connect(); const db = client.db("oidc_plugin_test_" + Date.now()); const cleanup = async () => { await db.dropDatabase(); await client.close(); }; return { db, client, cleanup }; } /** * Create a test OIDC provider configuration */ export function createTestProviderConfig(overrides?: Partial): OidcProviderConfig { return { issuer: "https://test-idp.example.com", clientId: "test-client-id", clientSecret: "test-client-secret-at-least-32-chars-long", callbackUrl: "http://localhost:3000/oidc/test/callback", discoveryUrl: "https://test-idp.example.com/.well-known/openid-configuration", scope: ["openid", "email", "profile"], ...overrides, }; } /** * Create a mock OIDC token set */ export function createMockTokenSet() { return { accessToken: "mock-access-token", idToken: "mock-id-token", refreshToken: "mock-refresh-token", tokenType: "Bearer", expiresIn: 3600, scope: "openid email profile", claims: { sub: "user-123", iss: "https://test-idp.example.com", aud: "test-client-id", exp: Math.floor(Date.now() / 1000) + 3600, iat: Math.floor(Date.now() / 1000), email: "test@example.com", email_verified: true, name: "Test User", given_name: "Test", family_name: "User", }, }; } /** * Create a mock OIDC profile */ export function createMockProfile() { return { id: "user-123", email: "test@example.com", emailVerified: true, name: "Test User", givenName: "Test", familyName: "User", raw: { sub: "user-123", email: "test@example.com", email_verified: true, name: "Test User", given_name: "Test", family_name: "User", }, }; } /** * Wait for a condition to be true */ export async function waitFor(condition: () => boolean | Promise, timeout: number = 5000): Promise { const startTime = Date.now(); while (!(await condition())) { if (Date.now() - startTime > timeout) { throw new Error("Timeout waiting for condition"); } await new Promise((resolve) => setTimeout(resolve, 100)); } } /** * Sleep for a given number of milliseconds */ export function sleep(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); }