relay filter/appview bootstrap
1import { describe, it, expect, mock, beforeEach } from "bun:test";
2import { processQueue } from "../../src/services/queue";
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.forUpdate = mockFn;
20 mockObj.skipLocked = mockFn;
21 mockObj.execute = mock(() => Promise.resolve([]));
22 mockObj.executeTakeFirst = mock(() => Promise.resolve(null));
23
24 return mockObj;
25};
26
27const dbMock = createChainableMock();
28
29const mockTransactionExecute = mock((callback: (trx: any) => Promise<any>) => callback(dbMock));
30dbMock.transaction = mock(() => ({ execute: mockTransactionExecute }));
31
32mock.module("../../src/db", () => ({
33 db: dbMock,
34 pool: {
35 connect: mock(() => Promise.resolve({
36 on: mock(() => {}),
37 query: mock(() => Promise.resolve()),
38 release: mock(() => {})
39 }))
40 }
41}));
42
43const mockBroadcast = mock(() => {});
44const mockGetClientCount = mock(() => 0);
45mock.module("../../src/services/websocket", () => ({
46 broadcast: mockBroadcast,
47 getClientCount: mockGetClientCount
48}));
49
50describe("Queue Service", () => {
51 beforeEach(() => {
52 dbMock.execute.mockResolvedValue([]);
53 mockBroadcast.mockClear();
54 });
55
56 it("should process pending records", async () => {
57 const mockRecords = [{
58 id: 1,
59 record_data: { $type: "test" },
60 status: "pending",
61 created_at: new Date()
62 }];
63
64 dbMock.execute
65 .mockResolvedValueOnce(mockRecords)
66 .mockResolvedValueOnce([]);
67
68 await processQueue();
69
70 expect(mockBroadcast).toHaveBeenCalled();
71 expect(mockBroadcast).toHaveBeenCalledWith({
72 type: "new_records",
73 records: [mockRecords[0].record_data]
74 });
75 });
76
77 it("should do nothing if no records found", async () => {
78 dbMock.execute.mockResolvedValueOnce([]);
79
80 await processQueue();
81
82 expect(mockBroadcast).not.toHaveBeenCalled();
83 });
84});