aboutsummaryrefslogtreecommitdiffstats
path: root/packages/trpc/testUtils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/trpc/testUtils.ts')
-rw-r--r--packages/trpc/testUtils.ts70
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));
+ };
+}