WIP! A BB-style forum, on the ATmosphere! We're still working... we'll be back soon when we have something to show off!
node typescript hono htmx atproto
at root/atb-56-theme-caching-layer 74 lines 2.3 kB view raw
1import { describe, it, expect, vi } from "vitest"; 2import { assignOwnerRole } from "../lib/steps/assign-owner.js"; 3import type { SeededRole } from "../lib/steps/seed-roles.js"; 4 5describe("assignOwnerRole", () => { 6 const forumDid = "did:plc:testforum"; 7 const ownerDid = "did:plc:owner123"; 8 const ownerHandle = "alice.test"; 9 10 const seededRoles: SeededRole[] = [ 11 { name: "Owner", uri: `at://${forumDid}/space.atbb.forum.role/ownerrkey`, cid: "bafyrole" }, 12 { name: "Admin", uri: `at://${forumDid}/space.atbb.forum.role/adminrkey`, cid: "bafyadmin" }, 13 ]; 14 15 function mockDb(options: { existingMembership?: any } = {}) { 16 const selectMock = vi.fn(); 17 18 selectMock.mockImplementation(() => ({ 19 from: vi.fn().mockReturnValue({ 20 where: vi.fn().mockReturnValue({ 21 limit: vi.fn().mockImplementation(() => { 22 return options.existingMembership ? [options.existingMembership] : []; 23 }), 24 }), 25 }), 26 })); 27 28 return { 29 select: selectMock, 30 insert: vi.fn().mockReturnValue({ 31 values: vi.fn().mockReturnValue({ 32 onConflictDoNothing: vi.fn().mockResolvedValue(undefined), 33 }), 34 }), 35 } as any; 36 } 37 38 it("assigns owner role via direct DB insert", async () => { 39 const db = mockDb(); 40 41 const result = await assignOwnerRole(db, forumDid, ownerDid, ownerHandle, seededRoles); 42 43 expect(result.assigned).toBe(true); 44 expect(result.skipped).toBe(false); 45 expect(result.roleUri).toBe(seededRoles[0].uri); 46 // Verify user was inserted (upsert) 47 expect(db.insert).toHaveBeenCalled(); 48 }); 49 50 it("skips when user already has Owner role", async () => { 51 const db = mockDb({ 52 existingMembership: { 53 did: ownerDid, 54 roleUri: seededRoles[0].uri, 55 }, 56 }); 57 58 const result = await assignOwnerRole(db, forumDid, ownerDid, ownerHandle, seededRoles); 59 60 expect(result.assigned).toBe(false); 61 expect(result.skipped).toBe(true); 62 }); 63 64 it("throws when Owner role is not in seeded roles", async () => { 65 const db = mockDb(); 66 const rolesWithoutOwner: SeededRole[] = [ 67 { name: "Admin", uri: "at://did/role/admin", cid: "bafyadmin" }, 68 ]; 69 70 await expect( 71 assignOwnerRole(db, forumDid, ownerDid, ownerHandle, rolesWithoutOwner) 72 ).rejects.toThrow("Owner role not found"); 73 }); 74});