Skip to content
File

Blob: tests/worker/db/tessera-identities.test.ts

typescript71 lines
1import { eq } from "drizzle-orm";
2import { describe, expect, it } from "vitest";
3 
4import { getDb, seedUser } from "../../helpers/runtime";
5import { registerWorkerRuntimeHooks } from "../../helpers/worker-hooks";
6import * as d1Schema from "@/worker/db/d1/schema";
7 
8describe("tessera_identities schema", () => {
9 registerWorkerRuntimeHooks();
10 
11 it("rejects duplicate sub values", async () => {
12 const first = await seedUser({ email: "identity-sub-a@example.com", slug: "identity-sub-a" });
13 const second = await seedUser({ email: "identity-sub-b@example.com", slug: "identity-sub-b" });
14 
15 await getDb().insert(d1Schema.tesseraIdentities).values({
16 sub: "shared-sub",
17 userId: first.id,
18 createdAt: Date.now(),
19 lastSeenAt: Date.now(),
20 });
21 
22 await expect(
23 getDb().insert(d1Schema.tesseraIdentities).values({
24 sub: "shared-sub",
25 userId: second.id,
26 createdAt: Date.now(),
27 lastSeenAt: Date.now(),
28 }),
29 ).rejects.toThrow();
30 });
31 
32 it("rejects duplicate user_id values", async () => {
33 const user = await seedUser({ email: "identity-user@example.com", slug: "identity-user" });
34 
35 await getDb().insert(d1Schema.tesseraIdentities).values({
36 sub: "sub-1",
37 userId: user.id,
38 createdAt: Date.now(),
39 lastSeenAt: Date.now(),
40 });
41 
42 await expect(
43 getDb().insert(d1Schema.tesseraIdentities).values({
44 sub: "sub-2",
45 userId: user.id,
46 createdAt: Date.now(),
47 lastSeenAt: Date.now(),
48 }),
49 ).rejects.toThrow();
50 });
51 
52 it("cascades identity rows when a user is deleted", async () => {
53 const user = await seedUser({ email: "identity-cascade@example.com", slug: "identity-cascade" });
54 
55 await getDb().insert(d1Schema.tesseraIdentities).values({
56 sub: "cascade-sub",
57 userId: user.id,
58 createdAt: Date.now(),
59 lastSeenAt: Date.now(),
60 });
61 
62 await getDb().delete(d1Schema.users).where(eq(d1Schema.users.id, user.id));
63 
64 const rows = await getDb()
65 .select()
66 .from(d1Schema.tesseraIdentities)
67 .where(eq(d1Schema.tesseraIdentities.sub, "cascade-sub"));
68 expect(rows).toHaveLength(0);
69 });
70});