diff options
| author | MohamedBassem <me@mbassem.com> | 2024-03-05 13:11:06 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-03-05 13:11:06 +0000 |
| commit | 8a46ecb7373d6c5e7300861169ea51a7917cd2b4 (patch) | |
| tree | 4ad318c3b5fc8b7a74cba6d0e37b6ade24db829a /packages/trpc/testUtils.ts | |
| parent | 224aa38d5976523f213e2860b6addc7630d472ba (diff) | |
| download | karakeep-8a46ecb7373d6c5e7300861169ea51a7917cd2b4.tar.zst | |
refactor: Extract trpc logic into its package
Diffstat (limited to 'packages/trpc/testUtils.ts')
| -rw-r--r-- | packages/trpc/testUtils.ts | 70 |
1 files changed, 70 insertions, 0 deletions
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<typeof getTestDB>; + +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<typeof getApiCaller>; + +export interface CustomTestContext { + apiCallers: APICallerType[]; + unauthedAPICaller: APICallerType; + db: TestDB; +} + +export async function buildTestContext( + seedDB: boolean, +): Promise<CustomTestContext> { + const db = getTestDB(); + let users: Awaited<ReturnType<typeof seedUsers>> = []; + 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)); + }; +} |
