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
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});