MOPC-App/tests/setup.ts

67 lines
1.9 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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)
}