Spaces:
Sleeping
Sleeping
File size: 2,358 Bytes
1f5ea39 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import Database from 'better-sqlite3';
import jwt from 'jsonwebtoken';
import { JWT_SECRET } from '../../src/config';
/**
* Shared e2e harness for migrated Nest modules.
*
* Gives each module e2e test a throwaway in-memory SQLite db (the same shape the
* shared connection exposes), a seed helper for demo data, and a session-cookie
* signer that produces tokens the REAL JwtAuthGuard accepts — so e2e tests cover
* the actual auth path end-to-end, not a stubbed guard.
*
* Wire it in a test with `vi.mock('../../src/db/database', () => ({ db, ... }))`
* using the db returned here, then build the Nest app under test.
*/
export interface SeededUser {
id: number;
username: string;
email: string;
role: 'user' | 'admin';
password_version: number;
}
/** Fresh in-memory db with the minimal `users` table the auth guard reads. */
export function createTempDb(): Database.Database {
const db = new Database(':memory:');
db.exec('PRAGMA journal_mode = WAL');
db.exec('PRAGMA foreign_keys = ON');
db.exec(`
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
role TEXT NOT NULL DEFAULT 'user',
password_version INTEGER NOT NULL DEFAULT 0
);
`);
return db;
}
/** Insert a demo user and return its row. */
export function seedUser(db: Database.Database, overrides: Partial<SeededUser> = {}): SeededUser {
const user: SeededUser = {
id: overrides.id ?? 1,
username: overrides.username ?? 'e2e-user',
email: overrides.email ?? 'e2e@example.test',
role: overrides.role ?? 'user',
password_version: overrides.password_version ?? 0,
};
db.prepare(
'INSERT INTO users (id, username, email, role, password_version) VALUES (?, ?, ?, ?, ?)',
).run(user.id, user.username, user.email, user.role, user.password_version);
return user;
}
/** Sign a `trek_session` token the real guard will accept (matching JWT_SECRET + pv). */
export function signSession(userId: number, passwordVersion = 0): string {
return jwt.sign({ id: userId, pv: passwordVersion }, JWT_SECRET, { algorithm: 'HS256' });
}
/** Convenience: the Cookie header value for a signed session. */
export function sessionCookie(userId: number, passwordVersion = 0): string {
return `trek_session=${signSession(userId, passwordVersion)}`;
}
|