67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
/**
|
||
* 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)
|
||
}
|