File
Blob: tests/worker/db/tessera-identities.test.ts
| 1 | import { eq } from "drizzle-orm"; |
| 2 | import { describe, expect, it } from "vitest"; |
| 3 | |
| 4 | import { getDb, seedUser } from "../../helpers/runtime"; |
| 5 | import { registerWorkerRuntimeHooks } from "../../helpers/worker-hooks"; |
| 6 | import * as d1Schema from "@/worker/db/d1/schema"; |
| 7 | |
| 8 | describe("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 | }); |