From 8a46ecb7373d6c5e7300861169ea51a7917cd2b4 Mon Sep 17 00:00:00 2001 From: MohamedBassem Date: Tue, 5 Mar 2024 13:11:06 +0000 Subject: refactor: Extract trpc logic into its package --- packages/trpc/testUtils.ts | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 packages/trpc/testUtils.ts (limited to 'packages/trpc/testUtils.ts') diff --git a/packages/trpc/testUtils.ts b/packages/trpc/testUtils.ts new file mode 100644 index 00000000..d5f24def --- /dev/null +++ b/packages/trpc/testUtils.ts @@ -0,0 +1,70 @@ +import { users } from "@hoarder/db/schema"; +import { getInMemoryDB } from "@hoarder/db/drizzle"; +import { appRouter } from "./routers/_app"; +import { createCallerFactory } from "./index"; + +export function getTestDB() { + return getInMemoryDB(true); +} + +export type TestDB = ReturnType; + +export async function seedUsers(db: TestDB) { + return await db + .insert(users) + .values([ + { + name: "Test User 1", + email: "test1@test.com", + }, + { + name: "Test User 2", + email: "test2@test.com", + }, + ]) + .returning(); +} + +export function getApiCaller(db: TestDB, userId?: string) { + const createCaller = createCallerFactory(appRouter); + return createCaller({ + user: userId + ? { + id: userId, + role: "user", + } + : null, + db, + }); +} + +export type APICallerType = ReturnType; + +export interface CustomTestContext { + apiCallers: APICallerType[]; + unauthedAPICaller: APICallerType; + db: TestDB; +} + +export async function buildTestContext( + seedDB: boolean, +): Promise { + const db = getTestDB(); + let users: Awaited> = []; + if (seedDB) { + users = await seedUsers(db); + } + const callers = users.map((u) => getApiCaller(db, u.id)); + + return { + apiCallers: callers, + unauthedAPICaller: getApiCaller(db), + db, + }; +} + +export function defaultBeforeEach(seedDB: boolean = true) { + return async (context: object) => { + Object.assign(context, await buildTestContext(seedDB)); + }; +} -- cgit v1.2.3-70-g09d2