MOPC-App/tests/setup.ts

67 lines
1.9 KiB
TypeScript
Raw Normal View History

/**
* Vitest global setup
*
* Provides:
* - `prisma` a PrismaClient connected to DATABASE_URL (or DATABASE_URL_TEST)
* - `createTestContext(user)` builds a tRPC-compatible context with an
* authenticated user so callers can invoke router procedures directly.
* - `createCaller(router, user)` shorthand for creating a type-safe caller
* from any tRPC router.
*
* Test isolation strategy: each test file should use `cleanupTestData()` in
* afterAll to remove data it created, keyed by unique program/user names.
*/
import { PrismaClient } from '@prisma/client'
import { afterAll } from 'vitest'
import type { UserRole } from '@prisma/client'
export const prisma = new PrismaClient({
datasourceUrl: process.env.DATABASE_URL_TEST ?? process.env.DATABASE_URL,
})
afterAll(async () => {
await prisma.$disconnect()
})
/**
* Build a fake tRPC context with an authenticated user.
* The returned object matches the shape expected by tRPC middleware
* (session.user, prisma, ip, userAgent).
*/
export function createTestContext(user: {
id: string
email: string
name?: string | null
role: UserRole
}) {
return {
session: {
user: {
id: user.id,
email: user.email,
name: user.name ?? user.email,
role: user.role,
},
expires: new Date(Date.now() + 86_400_000).toISOString(),
},
prisma,
ip: '127.0.0.1',
userAgent: 'vitest',
}
}
/**
* Create a tRPC caller for a given router, authenticated as `user`.
* Usage:
* const caller = createCaller(pipelineRouter, adminUser)
* const result = await caller.create({ ... })
*/
export function createCaller<TRouter extends { createCaller: (ctx: any) => any }>(
routerModule: { createCaller: (ctx: any) => any },
user: { id: string; email: string; name?: string | null; role: UserRole },
) {
const ctx = createTestContext(user)
return routerModule.createCaller(ctx)
}