@bopen-io/messagebox-server 1.2.2 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/out/knexfile.js +25 -0
  2. package/out/knexfile.js.map +1 -0
  3. package/out/src/__tests/compose.test.js +25 -0
  4. package/out/src/__tests/compose.test.js.map +1 -0
  5. package/out/src/app.js +162 -0
  6. package/out/src/app.js.map +1 -0
  7. package/out/src/compose.js +239 -0
  8. package/out/src/compose.js.map +1 -0
  9. package/out/src/config/firebase.js +150 -0
  10. package/out/src/config/firebase.js.map +1 -0
  11. package/out/src/context.js +23 -0
  12. package/out/src/context.js.map +1 -0
  13. package/out/src/index.js +311 -0
  14. package/out/src/index.js.map +1 -0
  15. package/out/src/migrations/2022-12-28-001-initial-migration.js +28 -0
  16. package/out/src/migrations/2022-12-28-001-initial-migration.js.map +1 -0
  17. package/out/src/migrations/2023-01-17-messages-update.js +11 -0
  18. package/out/src/migrations/2023-01-17-messages-update.js.map +1 -0
  19. package/out/src/migrations/2024-03-05-001-messageID-upgrade.js +21 -0
  20. package/out/src/migrations/2024-03-05-001-messageID-upgrade.js.map +1 -0
  21. package/out/src/migrations/2025-01-31-001-notification-permissions.js +59 -0
  22. package/out/src/migrations/2025-01-31-001-notification-permissions.js.map +1 -0
  23. package/out/src/migrations/2025-01-31-002-device-registrations.js +24 -0
  24. package/out/src/migrations/2025-01-31-002-device-registrations.js.map +1 -0
  25. package/out/src/routes/__tests/acknowledgeMessage.test.js +135 -0
  26. package/out/src/routes/__tests/acknowledgeMessage.test.js.map +1 -0
  27. package/out/src/routes/__tests/listMessages.test.js +217 -0
  28. package/out/src/routes/__tests/listMessages.test.js.map +1 -0
  29. package/out/src/routes/__tests/sendMessage.test.js +313 -0
  30. package/out/src/routes/__tests/sendMessage.test.js.map +1 -0
  31. package/out/src/routes/acknowledgeMessage.js +133 -0
  32. package/out/src/routes/acknowledgeMessage.js.map +1 -0
  33. package/out/src/routes/index.js +17 -0
  34. package/out/src/routes/index.js.map +1 -0
  35. package/out/src/routes/listDevices.js +63 -0
  36. package/out/src/routes/listDevices.js.map +1 -0
  37. package/out/src/routes/listMessages.js +176 -0
  38. package/out/src/routes/listMessages.js.map +1 -0
  39. package/out/src/routes/permissions/getPermission.js +138 -0
  40. package/out/src/routes/permissions/getPermission.js.map +1 -0
  41. package/out/src/routes/permissions/getQuote.js +165 -0
  42. package/out/src/routes/permissions/getQuote.js.map +1 -0
  43. package/out/src/routes/permissions/index.js +12 -0
  44. package/out/src/routes/permissions/index.js.map +1 -0
  45. package/out/src/routes/permissions/listPermissions.js +179 -0
  46. package/out/src/routes/permissions/listPermissions.js.map +1 -0
  47. package/out/src/routes/permissions/setPermission.js +137 -0
  48. package/out/src/routes/permissions/setPermission.js.map +1 -0
  49. package/out/src/routes/registerDevice.js +139 -0
  50. package/out/src/routes/registerDevice.js.map +1 -0
  51. package/out/src/routes/sendMessage.js +438 -0
  52. package/out/src/routes/sendMessage.js.map +1 -0
  53. package/out/src/runtimeDeps.js +15 -0
  54. package/out/src/runtimeDeps.js.map +1 -0
  55. package/out/src/swagger.js +48 -0
  56. package/out/src/swagger.js.map +1 -0
  57. package/out/src/telemetry.js +134 -0
  58. package/out/src/telemetry.js.map +1 -0
  59. package/out/src/types/messagePermissions.js +2 -0
  60. package/out/src/types/messagePermissions.js.map +1 -0
  61. package/out/src/types/notifications.js +2 -0
  62. package/out/src/types/notifications.js.map +1 -0
  63. package/out/src/utils/logger.js +85 -0
  64. package/out/src/utils/logger.js.map +1 -0
  65. package/out/src/utils/messagePermissions.js +115 -0
  66. package/out/src/utils/messagePermissions.js.map +1 -0
  67. package/out/src/utils/sendFCMNotification.js +110 -0
  68. package/out/src/utils/sendFCMNotification.js.map +1 -0
  69. package/out/tsconfig.tsbuildinfo +1 -0
  70. package/out/types/jest.config.d.ts +4 -0
  71. package/out/types/jest.config.d.ts.map +1 -0
  72. package/out/types/jest.config.integration.d.ts +5 -0
  73. package/out/types/jest.config.integration.d.ts.map +1 -0
  74. package/out/types/knexfile.d.ts +6 -0
  75. package/out/types/knexfile.d.ts.map +1 -0
  76. package/out/types/src/__tests/compose.test.d.ts +2 -0
  77. package/out/types/src/__tests/compose.test.d.ts.map +1 -0
  78. package/out/types/src/app.d.ts +63 -0
  79. package/out/types/src/app.d.ts.map +1 -0
  80. package/out/types/src/compose.d.ts +22 -0
  81. package/out/types/src/compose.d.ts.map +1 -0
  82. package/out/types/src/config/firebase.d.ts +34 -0
  83. package/out/types/src/config/firebase.d.ts.map +1 -0
  84. package/out/types/src/context.d.ts +23 -0
  85. package/out/types/src/context.d.ts.map +1 -0
  86. package/out/types/src/index.d.ts +43 -0
  87. package/out/types/src/index.d.ts.map +1 -0
  88. package/out/types/src/migrations/2022-12-28-001-initial-migration.d.ts +4 -0
  89. package/out/types/src/migrations/2022-12-28-001-initial-migration.d.ts.map +1 -0
  90. package/out/types/src/migrations/2023-01-17-messages-update.d.ts +4 -0
  91. package/out/types/src/migrations/2023-01-17-messages-update.d.ts.map +1 -0
  92. package/out/types/src/migrations/2024-03-05-001-messageID-upgrade.d.ts +4 -0
  93. package/out/types/src/migrations/2024-03-05-001-messageID-upgrade.d.ts.map +1 -0
  94. package/out/types/src/migrations/2025-01-31-001-notification-permissions.d.ts +4 -0
  95. package/out/types/src/migrations/2025-01-31-001-notification-permissions.d.ts.map +1 -0
  96. package/out/types/src/migrations/2025-01-31-002-device-registrations.d.ts +4 -0
  97. package/out/types/src/migrations/2025-01-31-002-device-registrations.d.ts.map +1 -0
  98. package/out/types/src/routes/__tests/acknowledgeMessage.test.d.ts +2 -0
  99. package/out/types/src/routes/__tests/acknowledgeMessage.test.d.ts.map +1 -0
  100. package/out/types/src/routes/__tests/listMessages.test.d.ts +2 -0
  101. package/out/types/src/routes/__tests/listMessages.test.d.ts.map +1 -0
  102. package/out/types/src/routes/__tests/sendMessage.test.d.ts +2 -0
  103. package/out/types/src/routes/__tests/sendMessage.test.d.ts.map +1 -0
  104. package/out/types/src/routes/acknowledgeMessage.d.ts +100 -0
  105. package/out/types/src/routes/acknowledgeMessage.d.ts.map +1 -0
  106. package/out/types/src/routes/index.d.ts +11 -0
  107. package/out/types/src/routes/index.d.ts.map +1 -0
  108. package/out/types/src/routes/listDevices.d.ts +19 -0
  109. package/out/types/src/routes/listDevices.d.ts.map +1 -0
  110. package/out/types/src/routes/listMessages.d.ts +124 -0
  111. package/out/types/src/routes/listMessages.d.ts.map +1 -0
  112. package/out/types/src/routes/permissions/getPermission.d.ts +46 -0
  113. package/out/types/src/routes/permissions/getPermission.d.ts.map +1 -0
  114. package/out/types/src/routes/permissions/getQuote.d.ts +50 -0
  115. package/out/types/src/routes/permissions/getQuote.d.ts.map +1 -0
  116. package/out/types/src/routes/permissions/index.d.ts +18 -0
  117. package/out/types/src/routes/permissions/index.d.ts.map +1 -0
  118. package/out/types/src/routes/permissions/listPermissions.d.ts +106 -0
  119. package/out/types/src/routes/permissions/listPermissions.d.ts.map +1 -0
  120. package/out/types/src/routes/permissions/setPermission.d.ts +53 -0
  121. package/out/types/src/routes/permissions/setPermission.d.ts.map +1 -0
  122. package/out/types/src/routes/registerDevice.d.ts +67 -0
  123. package/out/types/src/routes/registerDevice.d.ts.map +1 -0
  124. package/out/types/src/routes/sendMessage.d.ts +140 -0
  125. package/out/types/src/routes/sendMessage.d.ts.map +1 -0
  126. package/out/types/src/runtimeDeps.d.ts +17 -0
  127. package/out/types/src/runtimeDeps.d.ts.map +1 -0
  128. package/out/types/src/swagger.d.ts +3 -0
  129. package/out/types/src/swagger.d.ts.map +1 -0
  130. package/out/types/src/telemetry.d.ts +2 -0
  131. package/out/types/src/telemetry.d.ts.map +1 -0
  132. package/out/types/src/types/messagePermissions.d.ts +15 -0
  133. package/out/types/src/types/messagePermissions.d.ts.map +1 -0
  134. package/out/types/src/types/notifications.d.ts +20 -0
  135. package/out/types/src/types/notifications.d.ts.map +1 -0
  136. package/out/types/src/utils/logger.d.ts +17 -0
  137. package/out/types/src/utils/logger.d.ts.map +1 -0
  138. package/out/types/src/utils/messagePermissions.d.ts +29 -0
  139. package/out/types/src/utils/messagePermissions.d.ts.map +1 -0
  140. package/out/types/src/utils/sendFCMNotification.d.ts +22 -0
  141. package/out/types/src/utils/sendFCMNotification.d.ts.map +1 -0
  142. package/package.json +1 -1
@@ -0,0 +1,135 @@
1
+ /* eslint-env jest */
2
+ import acknowledgeMessage from '../acknowledgeMessage.js';
3
+ import mockKnex from 'mock-knex';
4
+ import knexLib from 'knex';
5
+ import knexConfig from '../../../knexfile.js';
6
+ import { bindMessageBoxRuntime } from '../../runtimeDeps.js';
7
+ const testKnex = knexLib.default?.(knexConfig.development) ??
8
+ knexLib(knexConfig.development);
9
+ bindMessageBoxRuntime({ knex: testKnex });
10
+ const knex = acknowledgeMessage.knex;
11
+ let queryTracker;
12
+ // Define Mock Express Response Object
13
+ const mockRes = {
14
+ status: jest.fn().mockReturnThis(),
15
+ json: jest.fn().mockReturnThis(),
16
+ sendStatus: jest.fn().mockReturnThis(),
17
+ send: jest.fn().mockReturnThis(),
18
+ end: jest.fn().mockReturnThis(),
19
+ setHeader: jest.fn().mockReturnThis(),
20
+ getHeader: jest.fn(),
21
+ getHeaders: jest.fn(),
22
+ header: jest.fn().mockReturnThis(),
23
+ type: jest.fn().mockReturnThis(),
24
+ format: jest.fn(),
25
+ location: jest.fn().mockReturnThis(),
26
+ redirect: jest.fn().mockReturnThis(),
27
+ append: jest.fn().mockReturnThis(),
28
+ render: jest.fn(),
29
+ vary: jest.fn().mockReturnThis(),
30
+ cookie: jest.fn().mockReturnThis(),
31
+ clearCookie: jest.fn().mockReturnThis()
32
+ };
33
+ let validReq;
34
+ describe('acknowledgeMessage', () => {
35
+ beforeAll(() => {
36
+ mockKnex.mock(knex);
37
+ });
38
+ beforeEach(() => {
39
+ jest.spyOn(console, 'error').mockImplementation(() => { });
40
+ queryTracker = mockKnex.getTracker();
41
+ queryTracker.install();
42
+ validReq = {
43
+ auth: {
44
+ identityKey: 'mockIdKey'
45
+ },
46
+ body: {
47
+ messageIds: ['123']
48
+ },
49
+ get: jest.fn(),
50
+ header: jest.fn()
51
+ };
52
+ });
53
+ afterEach(() => {
54
+ jest.clearAllMocks();
55
+ if (queryTracker !== null && queryTracker !== undefined) {
56
+ queryTracker.uninstall();
57
+ }
58
+ });
59
+ afterAll(() => {
60
+ mockKnex.unmock(knex);
61
+ });
62
+ it('Throws an error if messageId is missing', async () => {
63
+ delete validReq.body.messageIds;
64
+ await acknowledgeMessage.func(validReq, mockRes);
65
+ expect(mockRes.status).toHaveBeenCalledWith(400);
66
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
67
+ status: 'error',
68
+ code: 'ERR_MESSAGE_ID_REQUIRED'
69
+ }));
70
+ });
71
+ it('Throws an error if messageIds is not an Array', async () => {
72
+ validReq.body.messageIds = '24';
73
+ await acknowledgeMessage.func(validReq, mockRes);
74
+ expect(mockRes.status).toHaveBeenCalledWith(400);
75
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
76
+ status: 'error',
77
+ code: 'ERR_INVALID_MESSAGE_ID',
78
+ description: 'Message IDs must be formatted as an array of strings!'
79
+ }));
80
+ }, 7000);
81
+ it('Deletes a message', async () => {
82
+ queryTracker.on('query', (q, s) => {
83
+ if (s === 1) {
84
+ expect(q.method).toEqual('del');
85
+ expect(q.sql).toEqual('delete from `messages` where `recipient` = ? and `messageId` in (?)');
86
+ expect(q.bindings).toEqual([
87
+ 'mockIdKey',
88
+ '123'
89
+ ]);
90
+ q.response(true);
91
+ }
92
+ else {
93
+ q.response([]);
94
+ }
95
+ });
96
+ await acknowledgeMessage.func(validReq, mockRes);
97
+ expect(mockRes.status).toHaveBeenCalledWith(200);
98
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
99
+ status: 'success'
100
+ }));
101
+ });
102
+ it('Throws an error if deletion fails', async () => {
103
+ queryTracker.on('query', (q, step) => {
104
+ if (step === 1) {
105
+ expect(q.method).toEqual('del');
106
+ expect(q.sql).toEqual('delete from `messages` where `recipient` = ? and `messageId` in (?)');
107
+ expect(q.bindings).toEqual(['mockIdKey', '123']);
108
+ q.response(0); // Simulate deletion failure
109
+ }
110
+ else {
111
+ q.response([]); // Prevent test from hanging due to unhandled second query
112
+ }
113
+ });
114
+ await acknowledgeMessage.func(validReq, mockRes);
115
+ expect(mockRes.status).toHaveBeenCalledWith(400);
116
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
117
+ status: 'error',
118
+ code: 'ERR_INVALID_ACKNOWLEDGMENT',
119
+ description: 'Message not found!'
120
+ }));
121
+ }, 7000);
122
+ it('Throws unknown errors', async () => {
123
+ queryTracker.on('query', () => {
124
+ throw new Error('Failed');
125
+ });
126
+ await acknowledgeMessage.func(validReq, mockRes);
127
+ expect(mockRes.status).toHaveBeenCalledWith(500);
128
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
129
+ status: 'error',
130
+ code: 'ERR_INTERNAL_ERROR',
131
+ description: 'An internal error has occurred while acknowledging the message'
132
+ }));
133
+ });
134
+ });
135
+ //# sourceMappingURL=acknowledgeMessage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acknowledgeMessage.test.js","sourceRoot":"","sources":["../../../../src/routes/__tests/acknowledgeMessage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ /* eslint-env jest */
2
+ import listMessages from '../listMessages.js';
3
+ import mockKnex from 'mock-knex';
4
+ import knexLib from 'knex';
5
+ import knexConfig from '../../../knexfile.js';
6
+ import { bindMessageBoxRuntime } from '../../runtimeDeps.js';
7
+ // Ensure proper handling of mock-knex
8
+ const testKnex = knexLib.default?.(knexConfig.development) ??
9
+ knexLib(knexConfig.development);
10
+ bindMessageBoxRuntime({ knex: testKnex });
11
+ const knex = listMessages.knex;
12
+ let queryTracker;
13
+ // Define Mock Express Response Object
14
+ const mockRes = {
15
+ status: jest.fn().mockReturnThis(),
16
+ json: jest.fn().mockReturnThis(),
17
+ sendStatus: jest.fn().mockReturnThis(),
18
+ send: jest.fn().mockReturnThis(),
19
+ end: jest.fn().mockReturnThis(),
20
+ setHeader: jest.fn().mockReturnThis(),
21
+ getHeader: jest.fn(),
22
+ getHeaders: jest.fn(),
23
+ header: jest.fn().mockReturnThis(),
24
+ type: jest.fn().mockReturnThis(),
25
+ format: jest.fn(),
26
+ location: jest.fn().mockReturnThis(),
27
+ redirect: jest.fn().mockReturnThis(),
28
+ append: jest.fn().mockReturnThis(),
29
+ render: jest.fn(),
30
+ vary: jest.fn().mockReturnThis(),
31
+ cookie: jest.fn().mockReturnThis(),
32
+ clearCookie: jest.fn().mockReturnThis()
33
+ };
34
+ let validReq;
35
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
36
+ let validRes;
37
+ let validMessageBoxes;
38
+ let validMessages;
39
+ let expectedMessages;
40
+ describe('listMessages', () => {
41
+ beforeAll(() => {
42
+ mockKnex.mock(knex);
43
+ });
44
+ beforeEach(() => {
45
+ jest.spyOn(console, 'error').mockImplementation(() => { });
46
+ queryTracker = mockKnex.getTracker();
47
+ queryTracker.install();
48
+ validMessages = [{
49
+ sender: '028d37b941208cd6b8a4c28288eda5f2f16c2b3ab0fcb6d13c18b47fe37b971fc1',
50
+ messageId: 'msg-1',
51
+ body: '{}',
52
+ created_at: '2024-01-01',
53
+ updated_at: '2024-01-01'
54
+ }];
55
+ expectedMessages = [{
56
+ sender: '028d37b941208cd6b8a4c28288eda5f2f16c2b3ab0fcb6d13c18b47fe37b971fc1',
57
+ messageId: 'msg-1',
58
+ body: '{}',
59
+ createdAt: '2024-01-01',
60
+ updatedAt: '2024-01-01'
61
+ }];
62
+ // Mock Data
63
+ validRes = {
64
+ status: 'success',
65
+ messages: validMessages
66
+ };
67
+ validMessageBoxes = [
68
+ { messageBoxId: 42 },
69
+ { messageBoxId: 31 }
70
+ ];
71
+ // Fully typed mock request
72
+ validReq = {
73
+ auth: {
74
+ identityKey: 'mockIdKey'
75
+ },
76
+ body: {
77
+ messageBox: 'payment_inbox'
78
+ },
79
+ get: jest.fn(),
80
+ header: jest.fn()
81
+ };
82
+ });
83
+ afterEach(() => {
84
+ jest.clearAllMocks();
85
+ if (queryTracker !== null && queryTracker !== undefined) {
86
+ queryTracker.uninstall();
87
+ }
88
+ });
89
+ afterAll(() => {
90
+ mockKnex.unmock(knex);
91
+ });
92
+ it('Throws an error if a messageBox is not provided', async () => {
93
+ validReq.body.messageBox = undefined;
94
+ queryTracker.on('query', (q) => {
95
+ q.response([]);
96
+ });
97
+ await listMessages.func(validReq, mockRes);
98
+ expect(mockRes.status).toHaveBeenCalledWith(400);
99
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
100
+ status: 'error',
101
+ code: 'ERR_MESSAGEBOX_REQUIRED',
102
+ description: 'Please provide the name of a valid MessageBox!'
103
+ }));
104
+ });
105
+ it('Throws an error if messageBox is not a string', async () => {
106
+ validReq.body.messageBox = 123;
107
+ queryTracker.on('query', (q) => {
108
+ q.response([]);
109
+ });
110
+ await listMessages.func(validReq, mockRes);
111
+ expect(mockRes.status).toHaveBeenCalledWith(400);
112
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
113
+ status: 'error',
114
+ code: 'ERR_INVALID_MESSAGEBOX',
115
+ description: 'MessageBox name must be a string!'
116
+ }));
117
+ });
118
+ it('Throws an error if no matching messageBox is found', async () => {
119
+ validReq.body.messageBox = 'pay_inbox';
120
+ queryTracker.on('query', (q, s) => {
121
+ if (s === 1) {
122
+ expect(q.method).toEqual('select');
123
+ expect(q.sql).toEqual('select `messageBoxId` from `messageBox` where `identityKey` = ? and `type` = ?');
124
+ q.response([undefined]);
125
+ }
126
+ else {
127
+ q.response([]);
128
+ }
129
+ });
130
+ await listMessages.func(validReq, mockRes);
131
+ expect(mockRes.status).toHaveBeenCalledWith(200);
132
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
133
+ status: 'success',
134
+ messages: []
135
+ }));
136
+ });
137
+ it('Returns ID of messageBox', async () => {
138
+ queryTracker.on('query', (q, s) => {
139
+ if (s === 1) {
140
+ expect(q.method).toEqual('select');
141
+ expect(q.sql).toEqual('select `messageBoxId` from `messageBox` where `identityKey` = ? and `type` = ?');
142
+ expect(q.bindings).toEqual([
143
+ 'mockIdKey',
144
+ 'payment_inbox'
145
+ ]);
146
+ q.response([validMessageBoxes[0]]);
147
+ }
148
+ else if (s === 2) {
149
+ q.response(validMessages);
150
+ }
151
+ else {
152
+ q.response([]);
153
+ }
154
+ });
155
+ await listMessages.func(validReq, mockRes);
156
+ expect(mockRes.status).toHaveBeenCalledWith(200);
157
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
158
+ status: 'success',
159
+ messages: expectedMessages
160
+ }));
161
+ });
162
+ it('Returns empty array if no messages found', async () => {
163
+ queryTracker.on('query', (q, s) => {
164
+ if (s === 1) {
165
+ q.response([{ messageBoxId: 123 }]);
166
+ }
167
+ else if (s === 2) {
168
+ expect(q.method).toEqual('select');
169
+ expect(q.sql).toEqual('select `messageId`, `body`, `sender`, `created_at`, `updated_at` from `messages` where `recipient` = ? and `messageBoxId` = ?');
170
+ q.response([]);
171
+ }
172
+ else {
173
+ q.response([]);
174
+ }
175
+ });
176
+ await listMessages.func(validReq, mockRes);
177
+ expect(mockRes.status).toHaveBeenCalledWith(200);
178
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
179
+ status: 'success',
180
+ messages: []
181
+ }));
182
+ });
183
+ it('Returns list of messages found', async () => {
184
+ queryTracker.on('query', (q, s) => {
185
+ if (s === 1) {
186
+ q.response([{ messageBoxId: 123 }]);
187
+ }
188
+ else if (s === 2) {
189
+ expect(q.method).toEqual('select');
190
+ expect(q.sql).toEqual('select `messageId`, `body`, `sender`, `created_at`, `updated_at` from `messages` where `recipient` = ? and `messageBoxId` = ?');
191
+ q.response(validMessages);
192
+ }
193
+ else {
194
+ q.response([]);
195
+ }
196
+ });
197
+ await listMessages.func(validReq, mockRes);
198
+ expect(mockRes.status).toHaveBeenCalledWith(200);
199
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
200
+ status: 'success',
201
+ messages: expectedMessages
202
+ }));
203
+ });
204
+ it('Throws unknown errors', async () => {
205
+ queryTracker.on('query', () => {
206
+ throw new Error('Failed');
207
+ });
208
+ await listMessages.func(validReq, mockRes);
209
+ expect(mockRes.status).toHaveBeenCalledWith(500);
210
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
211
+ status: 'error',
212
+ code: 'ERR_INTERNAL_ERROR',
213
+ description: 'An internal error has occurred while listing messages.'
214
+ }));
215
+ });
216
+ });
217
+ //# sourceMappingURL=listMessages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listMessages.test.js","sourceRoot":"","sources":["../../../../src/routes/__tests/listMessages.test.ts"],"names":[],"mappings":"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"}