relay filter/appview bootstrap
1import { describe, it, expect, mock, beforeEach } from "bun:test";
2import { listInvitesHandler } from "../../src/api/channel";
3
4const createChainableMock = () => {
5 const mockObj: any = {};
6 const mockFn = mock(() => mockObj);
7
8 mockObj.selectFrom = mockFn;
9 mockObj.selectAll = mockFn;
10 mockObj.select = mockFn;
11 mockObj.where = mockFn;
12 mockObj.orderBy = mockFn;
13 mockObj.limit = mockFn;
14 mockObj.offset = mockFn;
15 mockObj.innerJoin = mockFn;
16 mockObj.leftJoin = mockFn;
17 mockObj.updateTable = mockFn;
18 mockObj.set = mockFn;
19 mockObj.execute = mock(() => Promise.resolve([]));
20
21 return mockObj;
22};
23
24const dbMock = createChainableMock();
25
26mock.module("../../src/db", () => ({
27 db: dbMock
28}));
29
30describe("listInvitesHandler", () => {
31 beforeEach(() => {
32 dbMock.execute.mockResolvedValue([]);
33 dbMock.selectFrom.mockClear();
34 });
35
36 it("should throw if recipient is missing", async () => {
37 const ctx = { params: {} };
38 expect(listInvitesHandler(ctx as any)).rejects.toThrow("Missing required parameter: recipient");
39 });
40
41 it("should return invites", async () => {
42 const mockData = [{
43 uri: "at://...",
44 cid: "bafy...",
45 creator_did: "did:plc:...",
46 created_at: new Date(),
47 indexed_at: new Date(),
48 channel: "bafy_channel",
49 channel_uri: "at://channel..."
50 }];
51 dbMock.execute.mockResolvedValue(mockData);
52
53 const ctx = { params: { recipient: "did:plc:123" } };
54 const result = await listInvitesHandler(ctx as any);
55
56 expect(result.body.invites).toHaveLength(1);
57 expect(result.body.invites[0].uri).toBe("at://...");
58 });
59});