signal-sdk 0.1.1 → 0.1.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.
- package/README.md +23 -11
- package/dist/MultiAccountManager.js +11 -19
- package/dist/SignalBot.js +40 -36
- package/dist/SignalCli.d.ts +25 -301
- package/dist/SignalCli.js +226 -971
- package/dist/__tests__/DeviceManager.test.d.ts +1 -0
- package/dist/__tests__/DeviceManager.test.js +135 -0
- package/dist/__tests__/MultiAccountManager.coverage.test.d.ts +1 -0
- package/dist/__tests__/MultiAccountManager.coverage.test.js +33 -0
- package/dist/__tests__/MultiAccountManager.test.js +3 -3
- package/dist/__tests__/SignalBot.additional.test.js +40 -37
- package/dist/__tests__/SignalBot.coverage.test.d.ts +1 -0
- package/dist/__tests__/SignalBot.coverage.test.js +385 -0
- package/dist/__tests__/SignalBot.test.js +8 -8
- package/dist/__tests__/SignalCli.advanced.test.js +47 -58
- package/dist/__tests__/SignalCli.connections.test.d.ts +1 -0
- package/dist/__tests__/SignalCli.connections.test.js +110 -0
- package/dist/__tests__/SignalCli.e2e.test.js +28 -32
- package/dist/__tests__/SignalCli.events.test.d.ts +1 -0
- package/dist/__tests__/SignalCli.events.test.js +113 -0
- package/dist/__tests__/SignalCli.integration.test.js +6 -5
- package/dist/__tests__/SignalCli.methods.test.js +150 -66
- package/dist/__tests__/SignalCli.parsing.test.js +4 -13
- package/dist/__tests__/SignalCli.simple.test.d.ts +1 -0
- package/dist/__tests__/SignalCli.simple.test.js +77 -0
- package/dist/__tests__/SignalCli.test.js +133 -74
- package/dist/__tests__/config.test.js +19 -29
- package/dist/__tests__/errors.test.js +2 -2
- package/dist/__tests__/retry.test.js +10 -8
- package/dist/__tests__/robustness.test.d.ts +1 -0
- package/dist/__tests__/robustness.test.js +59 -0
- package/dist/__tests__/security.test.d.ts +1 -0
- package/dist/__tests__/security.test.js +50 -0
- package/dist/config.js +3 -3
- package/dist/interfaces.d.ts +27 -0
- package/dist/managers/AccountManager.d.ts +27 -0
- package/dist/managers/AccountManager.js +147 -0
- package/dist/managers/BaseManager.d.ts +9 -0
- package/dist/managers/BaseManager.js +17 -0
- package/dist/managers/ContactManager.d.ts +15 -0
- package/dist/managers/ContactManager.js +123 -0
- package/dist/managers/DeviceManager.d.ts +11 -0
- package/dist/managers/DeviceManager.js +139 -0
- package/dist/managers/GroupManager.d.ts +12 -0
- package/dist/managers/GroupManager.js +78 -0
- package/dist/managers/MessageManager.d.ts +18 -0
- package/dist/managers/MessageManager.js +301 -0
- package/dist/managers/StickerManager.d.ts +8 -0
- package/dist/managers/StickerManager.js +39 -0
- package/dist/retry.js +3 -3
- package/dist/validators.d.ts +9 -0
- package/dist/validators.js +20 -0
- package/package.json +11 -4
- package/scripts/install.js +1 -1
|
@@ -46,32 +46,32 @@ describe('SignalCli Methods Tests', () => {
|
|
|
46
46
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('send', expect.objectContaining({
|
|
47
47
|
message: 'Hello',
|
|
48
48
|
recipients: ['+1234567890'],
|
|
49
|
-
account: '+1234567890'
|
|
49
|
+
account: '+1234567890',
|
|
50
50
|
}));
|
|
51
51
|
});
|
|
52
52
|
it('should send message to group', async () => {
|
|
53
53
|
await signalCli.sendMessage('group123==', 'Hello group');
|
|
54
54
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('send', expect.objectContaining({
|
|
55
55
|
message: 'Hello group',
|
|
56
|
-
groupId: 'group123=='
|
|
56
|
+
groupId: 'group123==',
|
|
57
57
|
}));
|
|
58
58
|
});
|
|
59
59
|
it('should send message with attachments', async () => {
|
|
60
60
|
await signalCli.sendMessage('+1234567890', 'Check this', { attachments: ['/path/to/file.jpg'] });
|
|
61
61
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('send', expect.objectContaining({
|
|
62
|
-
attachments: ['/path/to/file.jpg']
|
|
62
|
+
attachments: ['/path/to/file.jpg'],
|
|
63
63
|
}));
|
|
64
64
|
});
|
|
65
65
|
it('should send message with expiration', async () => {
|
|
66
66
|
await signalCli.sendMessage('+1234567890', 'Secret', { expiresInSeconds: 3600 });
|
|
67
67
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('send', expect.objectContaining({
|
|
68
|
-
expiresInSeconds: 3600
|
|
68
|
+
expiresInSeconds: 3600,
|
|
69
69
|
}));
|
|
70
70
|
});
|
|
71
71
|
it('should send view-once message', async () => {
|
|
72
72
|
await signalCli.sendMessage('+1234567890', 'View once', { isViewOnce: true });
|
|
73
73
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('send', expect.objectContaining({
|
|
74
|
-
viewOnce: true
|
|
74
|
+
viewOnce: true,
|
|
75
75
|
}));
|
|
76
76
|
});
|
|
77
77
|
it('should send reaction', async () => {
|
|
@@ -81,39 +81,39 @@ describe('SignalCli Methods Tests', () => {
|
|
|
81
81
|
targetAuthor: '+0987654321',
|
|
82
82
|
targetTimestamp: 123456,
|
|
83
83
|
remove: false,
|
|
84
|
-
account: '+1234567890'
|
|
84
|
+
account: '+1234567890',
|
|
85
85
|
}));
|
|
86
86
|
});
|
|
87
87
|
it('should send reaction with remove flag', async () => {
|
|
88
88
|
await signalCli.sendReaction('+1234567890', '+0987654321', 123456, '👍', true);
|
|
89
89
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendReaction', expect.objectContaining({
|
|
90
|
-
remove: true
|
|
90
|
+
remove: true,
|
|
91
91
|
}));
|
|
92
92
|
});
|
|
93
93
|
it('should send reaction to group', async () => {
|
|
94
94
|
await signalCli.sendReaction('group123==', '+0987654321', 123456, '👍');
|
|
95
95
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendReaction', expect.objectContaining({
|
|
96
|
-
groupId: 'group123=='
|
|
96
|
+
groupId: 'group123==',
|
|
97
97
|
}));
|
|
98
98
|
});
|
|
99
99
|
it('should send typing indicator', async () => {
|
|
100
100
|
await signalCli.sendTyping('+1234567890');
|
|
101
101
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendTyping', expect.objectContaining({
|
|
102
102
|
when: true,
|
|
103
|
-
recipients: ['+1234567890']
|
|
103
|
+
recipients: ['+1234567890'],
|
|
104
104
|
}));
|
|
105
105
|
});
|
|
106
106
|
it('should stop typing indicator', async () => {
|
|
107
107
|
await signalCli.sendTyping('+1234567890', true);
|
|
108
108
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendTyping', expect.objectContaining({
|
|
109
|
-
when: false
|
|
109
|
+
when: false,
|
|
110
110
|
}));
|
|
111
111
|
});
|
|
112
112
|
it('should remote delete message', async () => {
|
|
113
113
|
await signalCli.remoteDeleteMessage('+1234567890', 123456);
|
|
114
114
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('remoteDelete', expect.objectContaining({
|
|
115
115
|
targetTimestamp: 123456,
|
|
116
|
-
recipients: ['+1234567890']
|
|
116
|
+
recipients: ['+1234567890'],
|
|
117
117
|
}));
|
|
118
118
|
});
|
|
119
119
|
});
|
|
@@ -122,7 +122,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
122
122
|
await signalCli.updateContact('+1234567890', 'John Doe');
|
|
123
123
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateContact', expect.objectContaining({
|
|
124
124
|
recipient: '+1234567890',
|
|
125
|
-
name: 'John Doe'
|
|
125
|
+
name: 'John Doe',
|
|
126
126
|
}));
|
|
127
127
|
});
|
|
128
128
|
it('should update contact with options', async () => {
|
|
@@ -130,25 +130,25 @@ describe('SignalCli Methods Tests', () => {
|
|
|
130
130
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateContact', expect.objectContaining({
|
|
131
131
|
name: 'John Doe',
|
|
132
132
|
color: 'blue',
|
|
133
|
-
muted: true
|
|
133
|
+
muted: true,
|
|
134
134
|
}));
|
|
135
135
|
});
|
|
136
136
|
it('should block recipients', async () => {
|
|
137
137
|
await signalCli.block(['+1111111111', '+2222222222']);
|
|
138
138
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('block', expect.objectContaining({
|
|
139
|
-
recipient: ['+1111111111', '+2222222222']
|
|
139
|
+
recipient: ['+1111111111', '+2222222222'],
|
|
140
140
|
}));
|
|
141
141
|
});
|
|
142
142
|
it('should block group', async () => {
|
|
143
143
|
await signalCli.block([], 'group123==');
|
|
144
144
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('block', expect.objectContaining({
|
|
145
|
-
groupId: 'group123=='
|
|
145
|
+
groupId: 'group123==',
|
|
146
146
|
}));
|
|
147
147
|
});
|
|
148
148
|
it('should unblock recipients', async () => {
|
|
149
149
|
await signalCli.unblock(['+1111111111']);
|
|
150
150
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('unblock', expect.objectContaining({
|
|
151
|
-
recipient: ['+1111111111']
|
|
151
|
+
recipient: ['+1111111111'],
|
|
152
152
|
}));
|
|
153
153
|
});
|
|
154
154
|
});
|
|
@@ -156,13 +156,13 @@ describe('SignalCli Methods Tests', () => {
|
|
|
156
156
|
it('should quit group', async () => {
|
|
157
157
|
await signalCli.quitGroup('group123==');
|
|
158
158
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('quitGroup', expect.objectContaining({
|
|
159
|
-
groupId: 'group123=='
|
|
159
|
+
groupId: 'group123==',
|
|
160
160
|
}));
|
|
161
161
|
});
|
|
162
162
|
it('should join group', async () => {
|
|
163
163
|
await signalCli.joinGroup('https://signal.group/...');
|
|
164
164
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('joinGroup', expect.objectContaining({
|
|
165
|
-
uri: 'https://signal.group/...'
|
|
165
|
+
uri: 'https://signal.group/...',
|
|
166
166
|
}));
|
|
167
167
|
});
|
|
168
168
|
});
|
|
@@ -170,7 +170,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
170
170
|
it('should update profile with name only', async () => {
|
|
171
171
|
await signalCli.updateProfile('John Doe');
|
|
172
172
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateProfile', expect.objectContaining({
|
|
173
|
-
name: 'John Doe'
|
|
173
|
+
name: 'John Doe',
|
|
174
174
|
}));
|
|
175
175
|
});
|
|
176
176
|
it('should update profile with all fields', async () => {
|
|
@@ -179,7 +179,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
179
179
|
name: 'John Doe',
|
|
180
180
|
about: 'Hello!',
|
|
181
181
|
aboutEmoji: '👋',
|
|
182
|
-
avatar: '/path/to/avatar.jpg'
|
|
182
|
+
avatar: '/path/to/avatar.jpg',
|
|
183
183
|
}));
|
|
184
184
|
});
|
|
185
185
|
});
|
|
@@ -189,13 +189,13 @@ describe('SignalCli Methods Tests', () => {
|
|
|
189
189
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendReceipt', expect.objectContaining({
|
|
190
190
|
recipient: '+1234567890',
|
|
191
191
|
targetTimestamp: 123456,
|
|
192
|
-
type: 'read'
|
|
192
|
+
type: 'read',
|
|
193
193
|
}));
|
|
194
194
|
});
|
|
195
195
|
it('should send viewed receipt', async () => {
|
|
196
196
|
await signalCli.sendReceipt('+1234567890', 123456, 'viewed');
|
|
197
197
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendReceipt', expect.objectContaining({
|
|
198
|
-
type: 'viewed'
|
|
198
|
+
type: 'viewed',
|
|
199
199
|
}));
|
|
200
200
|
});
|
|
201
201
|
});
|
|
@@ -205,14 +205,14 @@ describe('SignalCli Methods Tests', () => {
|
|
|
205
205
|
const packs = await signalCli.listStickerPacks();
|
|
206
206
|
expect(packs).toHaveLength(1);
|
|
207
207
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('listStickerPacks', expect.objectContaining({
|
|
208
|
-
account: '+1234567890'
|
|
208
|
+
account: '+1234567890',
|
|
209
209
|
}));
|
|
210
210
|
});
|
|
211
211
|
it('should add sticker pack', async () => {
|
|
212
212
|
await signalCli.addStickerPack('packId123', 'packKey456');
|
|
213
213
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('addStickerPack', expect.objectContaining({
|
|
214
214
|
packId: 'packId123',
|
|
215
|
-
packKey: 'packKey456'
|
|
215
|
+
packKey: 'packKey456',
|
|
216
216
|
}));
|
|
217
217
|
});
|
|
218
218
|
});
|
|
@@ -220,7 +220,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
220
220
|
it('should register account', async () => {
|
|
221
221
|
await signalCli.register('+1234567890');
|
|
222
222
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('register', expect.objectContaining({
|
|
223
|
-
account: '+1234567890'
|
|
223
|
+
account: '+1234567890',
|
|
224
224
|
}));
|
|
225
225
|
});
|
|
226
226
|
it('should register with voice and captcha', async () => {
|
|
@@ -228,32 +228,32 @@ describe('SignalCli Methods Tests', () => {
|
|
|
228
228
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('register', expect.objectContaining({
|
|
229
229
|
account: '+1234567890',
|
|
230
230
|
voice: true,
|
|
231
|
-
captcha: 'captcha123'
|
|
231
|
+
captcha: 'captcha123',
|
|
232
232
|
}));
|
|
233
233
|
});
|
|
234
234
|
it('should verify account', async () => {
|
|
235
235
|
await signalCli.verify('+1234567890', 'token123');
|
|
236
236
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('verify', expect.objectContaining({
|
|
237
237
|
account: '+1234567890',
|
|
238
|
-
token: 'token123'
|
|
238
|
+
token: 'token123',
|
|
239
239
|
}));
|
|
240
240
|
});
|
|
241
241
|
it('should verify with PIN', async () => {
|
|
242
242
|
await signalCli.verify('+1234567890', 'token123', '1234');
|
|
243
243
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('verify', expect.objectContaining({
|
|
244
|
-
pin: '1234'
|
|
244
|
+
pin: '1234',
|
|
245
245
|
}));
|
|
246
246
|
});
|
|
247
247
|
it('should unregister account', async () => {
|
|
248
248
|
await signalCli.unregister();
|
|
249
249
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('unregister', expect.objectContaining({
|
|
250
|
-
account: '+1234567890'
|
|
250
|
+
account: '+1234567890',
|
|
251
251
|
}));
|
|
252
252
|
});
|
|
253
253
|
it('should delete local account data', async () => {
|
|
254
254
|
await signalCli.deleteLocalAccountData();
|
|
255
255
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('deleteLocalAccountData', expect.objectContaining({
|
|
256
|
-
account: '+1234567890'
|
|
256
|
+
account: '+1234567890',
|
|
257
257
|
}));
|
|
258
258
|
});
|
|
259
259
|
it('should update account configuration', async () => {
|
|
@@ -261,7 +261,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
261
261
|
await signalCli.updateAccountConfiguration(config);
|
|
262
262
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateConfiguration', expect.objectContaining({
|
|
263
263
|
readReceipts: true,
|
|
264
|
-
typingIndicators: true
|
|
264
|
+
typingIndicators: true,
|
|
265
265
|
}));
|
|
266
266
|
});
|
|
267
267
|
});
|
|
@@ -269,7 +269,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
269
269
|
it('should remove device', async () => {
|
|
270
270
|
await signalCli.removeDevice(2);
|
|
271
271
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('removeDevice', expect.objectContaining({
|
|
272
|
-
deviceId: 2
|
|
272
|
+
deviceId: 2,
|
|
273
273
|
}));
|
|
274
274
|
});
|
|
275
275
|
});
|
|
@@ -277,13 +277,13 @@ describe('SignalCli Methods Tests', () => {
|
|
|
277
277
|
it('should set PIN', async () => {
|
|
278
278
|
await signalCli.setPin('1234');
|
|
279
279
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('setPin', expect.objectContaining({
|
|
280
|
-
pin: '1234'
|
|
280
|
+
pin: '1234',
|
|
281
281
|
}));
|
|
282
282
|
});
|
|
283
283
|
it('should remove PIN', async () => {
|
|
284
284
|
await signalCli.removePin();
|
|
285
285
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('removePin', expect.objectContaining({
|
|
286
|
-
account: '+1234567890'
|
|
286
|
+
account: '+1234567890',
|
|
287
287
|
}));
|
|
288
288
|
});
|
|
289
289
|
});
|
|
@@ -293,14 +293,14 @@ describe('SignalCli Methods Tests', () => {
|
|
|
293
293
|
const identities = await signalCli.listIdentities();
|
|
294
294
|
expect(identities).toHaveLength(1);
|
|
295
295
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('listIdentities', expect.objectContaining({
|
|
296
|
-
account: '+1234567890'
|
|
296
|
+
account: '+1234567890',
|
|
297
297
|
}));
|
|
298
298
|
});
|
|
299
299
|
it('should list identities for specific number', async () => {
|
|
300
300
|
sendJsonRpcRequestSpy.mockResolvedValue([{ number: '+1111111111' }]);
|
|
301
301
|
await signalCli.listIdentities('+1111111111');
|
|
302
302
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('listIdentities', expect.objectContaining({
|
|
303
|
-
number: '+1111111111'
|
|
303
|
+
number: '+1111111111',
|
|
304
304
|
}));
|
|
305
305
|
});
|
|
306
306
|
it('should trust identity', async () => {
|
|
@@ -308,13 +308,13 @@ describe('SignalCli Methods Tests', () => {
|
|
|
308
308
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('trust', expect.objectContaining({
|
|
309
309
|
recipient: '+1111111111',
|
|
310
310
|
safetyNumber: 'fingerprint123',
|
|
311
|
-
verified: true
|
|
311
|
+
verified: true,
|
|
312
312
|
}));
|
|
313
313
|
});
|
|
314
314
|
it('should trust identity with verified flag', async () => {
|
|
315
315
|
await signalCli.trustIdentity('+1111111111', 'fingerprint123', false);
|
|
316
316
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('trust', expect.objectContaining({
|
|
317
|
-
verified: false
|
|
317
|
+
verified: false,
|
|
318
318
|
}));
|
|
319
319
|
});
|
|
320
320
|
});
|
|
@@ -324,14 +324,14 @@ describe('SignalCli Methods Tests', () => {
|
|
|
324
324
|
const uri = await signalCli.link('MyDevice');
|
|
325
325
|
expect(uri).toBe('sgnl://link?...');
|
|
326
326
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('link', {
|
|
327
|
-
deviceName: 'MyDevice'
|
|
327
|
+
deviceName: 'MyDevice',
|
|
328
328
|
});
|
|
329
329
|
});
|
|
330
330
|
it('should link without device name', async () => {
|
|
331
331
|
sendJsonRpcRequestSpy.mockResolvedValue({ uri: 'sgnl://link?...' });
|
|
332
332
|
await signalCli.link();
|
|
333
333
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('link', {
|
|
334
|
-
deviceName: undefined
|
|
334
|
+
deviceName: undefined,
|
|
335
335
|
});
|
|
336
336
|
});
|
|
337
337
|
});
|
|
@@ -340,22 +340,22 @@ describe('SignalCli Methods Tests', () => {
|
|
|
340
340
|
await signalCli.sendPollCreate({
|
|
341
341
|
question: 'What is your favorite color?',
|
|
342
342
|
options: ['Red', 'Blue', 'Green'],
|
|
343
|
-
groupId: 'group123=='
|
|
343
|
+
groupId: 'group123==',
|
|
344
344
|
});
|
|
345
345
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendPollCreate', expect.objectContaining({
|
|
346
346
|
question: 'What is your favorite color?',
|
|
347
347
|
options: ['Red', 'Blue', 'Green'],
|
|
348
|
-
groupId: 'group123=='
|
|
348
|
+
groupId: 'group123==',
|
|
349
349
|
}));
|
|
350
350
|
});
|
|
351
351
|
it('should send poll create to recipients', async () => {
|
|
352
352
|
await signalCli.sendPollCreate({
|
|
353
353
|
question: 'What is your favorite color?',
|
|
354
354
|
options: ['Red', 'Blue'],
|
|
355
|
-
recipients: ['+1111111111', '+2222222222']
|
|
355
|
+
recipients: ['+1111111111', '+2222222222'],
|
|
356
356
|
});
|
|
357
357
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendPollCreate', expect.objectContaining({
|
|
358
|
-
recipients: ['+1111111111', '+2222222222']
|
|
358
|
+
recipients: ['+1111111111', '+2222222222'],
|
|
359
359
|
}));
|
|
360
360
|
});
|
|
361
361
|
it('should send poll create with multiSelect', async () => {
|
|
@@ -363,43 +363,127 @@ describe('SignalCli Methods Tests', () => {
|
|
|
363
363
|
question: 'Select options',
|
|
364
364
|
options: ['A', 'B', 'C'],
|
|
365
365
|
groupId: 'group123==',
|
|
366
|
-
multiSelect: true
|
|
366
|
+
multiSelect: true,
|
|
367
367
|
});
|
|
368
368
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendPollCreate', expect.objectContaining({
|
|
369
|
-
multiSelect: true
|
|
369
|
+
multiSelect: true,
|
|
370
370
|
}));
|
|
371
371
|
});
|
|
372
372
|
it('should send poll vote to individual', async () => {
|
|
373
373
|
await signalCli.sendPollVote('+1234567890', {
|
|
374
374
|
pollAuthor: '+9876543210',
|
|
375
375
|
pollTimestamp: 123456,
|
|
376
|
-
optionIndexes: [0, 2]
|
|
376
|
+
optionIndexes: [0, 2],
|
|
377
377
|
});
|
|
378
378
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendPollVote', expect.objectContaining({
|
|
379
379
|
pollAuthor: '+9876543210',
|
|
380
380
|
pollTimestamp: 123456,
|
|
381
381
|
options: [0, 2],
|
|
382
|
-
recipient: '+1234567890'
|
|
382
|
+
recipient: '+1234567890',
|
|
383
383
|
}));
|
|
384
384
|
});
|
|
385
385
|
it('should send poll vote to group', async () => {
|
|
386
386
|
await signalCli.sendPollVote('group123==', {
|
|
387
387
|
pollAuthor: '+9876543210',
|
|
388
388
|
pollTimestamp: 123456,
|
|
389
|
-
optionIndexes: [1]
|
|
389
|
+
optionIndexes: [1],
|
|
390
390
|
});
|
|
391
391
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendPollVote', expect.objectContaining({
|
|
392
|
-
groupId: 'group123=='
|
|
392
|
+
groupId: 'group123==',
|
|
393
393
|
}));
|
|
394
394
|
});
|
|
395
395
|
it('should send poll terminate', async () => {
|
|
396
396
|
await signalCli.sendPollTerminate('+1234567890', {
|
|
397
|
-
pollTimestamp: 123456
|
|
397
|
+
pollTimestamp: 123456,
|
|
398
398
|
});
|
|
399
399
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendPollTerminate', expect.objectContaining({
|
|
400
|
-
pollTimestamp: 123456
|
|
400
|
+
pollTimestamp: 123456,
|
|
401
|
+
}));
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
describe('Update Account Methods', () => {
|
|
405
|
+
it('should update account with device name', async () => {
|
|
406
|
+
sendJsonRpcRequestSpy.mockResolvedValue({ username: 'user.123' });
|
|
407
|
+
const result = await signalCli.updateAccount({ deviceName: 'New Device' });
|
|
408
|
+
expect(result.success).toBe(true);
|
|
409
|
+
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateAccount', expect.objectContaining({
|
|
410
|
+
deviceName: 'New Device',
|
|
411
|
+
}));
|
|
412
|
+
});
|
|
413
|
+
it('should update account with username', async () => {
|
|
414
|
+
sendJsonRpcRequestSpy.mockResolvedValue({ username: 'newuser.456', usernameLink: 'link' });
|
|
415
|
+
const result = await signalCli.updateAccount({ username: 'newuser.456' });
|
|
416
|
+
expect(result.success).toBe(true);
|
|
417
|
+
expect(result.username).toBe('newuser.456');
|
|
418
|
+
});
|
|
419
|
+
it('should delete username', async () => {
|
|
420
|
+
sendJsonRpcRequestSpy.mockResolvedValue({});
|
|
421
|
+
await signalCli.updateAccount({ deleteUsername: true });
|
|
422
|
+
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateAccount', expect.objectContaining({
|
|
423
|
+
deleteUsername: true,
|
|
401
424
|
}));
|
|
402
425
|
});
|
|
426
|
+
it('should update privacy settings', async () => {
|
|
427
|
+
sendJsonRpcRequestSpy.mockResolvedValue({});
|
|
428
|
+
await signalCli.updateAccount({
|
|
429
|
+
unrestrictedUnidentifiedSender: true,
|
|
430
|
+
discoverableByNumber: false,
|
|
431
|
+
numberSharing: false,
|
|
432
|
+
});
|
|
433
|
+
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateAccount', expect.objectContaining({
|
|
434
|
+
unrestrictedUnidentifiedSender: true,
|
|
435
|
+
discoverableByNumber: false,
|
|
436
|
+
numberSharing: false,
|
|
437
|
+
}));
|
|
438
|
+
});
|
|
439
|
+
it('should handle update account error', async () => {
|
|
440
|
+
sendJsonRpcRequestSpy.mockRejectedValue(new Error('Update failed'));
|
|
441
|
+
const result = await signalCli.updateAccount({ deviceName: 'Device' });
|
|
442
|
+
expect(result.success).toBe(false);
|
|
443
|
+
});
|
|
444
|
+
});
|
|
445
|
+
describe('Device Management Methods (v0.13.23+)', () => {
|
|
446
|
+
it('should list devices', async () => {
|
|
447
|
+
const mockDevices = [
|
|
448
|
+
{ id: 1, name: 'Primary', lastSeen: Date.now() },
|
|
449
|
+
{ id: 2, name: 'Tablet', lastSeen: Date.now() },
|
|
450
|
+
];
|
|
451
|
+
sendJsonRpcRequestSpy.mockResolvedValue(mockDevices);
|
|
452
|
+
const result = await signalCli.listDevices();
|
|
453
|
+
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('listDevices', {
|
|
454
|
+
account: '+1234567890',
|
|
455
|
+
});
|
|
456
|
+
expect(result).toEqual(mockDevices);
|
|
457
|
+
});
|
|
458
|
+
it('should update device name', async () => {
|
|
459
|
+
sendJsonRpcRequestSpy.mockResolvedValue(undefined);
|
|
460
|
+
await signalCli.updateDevice({
|
|
461
|
+
deviceId: 3,
|
|
462
|
+
deviceName: 'My Laptop',
|
|
463
|
+
});
|
|
464
|
+
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateDevice', {
|
|
465
|
+
account: '+1234567890',
|
|
466
|
+
deviceId: 3,
|
|
467
|
+
deviceName: 'My Laptop',
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
it('should validate device ID', async () => {
|
|
471
|
+
await expect(signalCli.updateDevice({
|
|
472
|
+
deviceId: 0,
|
|
473
|
+
deviceName: 'Invalid',
|
|
474
|
+
})).rejects.toThrow();
|
|
475
|
+
await expect(signalCli.updateDevice({
|
|
476
|
+
deviceId: -5,
|
|
477
|
+
deviceName: 'Invalid',
|
|
478
|
+
})).rejects.toThrow();
|
|
479
|
+
});
|
|
480
|
+
it('should validate device name is not too long', async () => {
|
|
481
|
+
const longName = 'x'.repeat(300);
|
|
482
|
+
await expect(signalCli.updateDevice({
|
|
483
|
+
deviceId: 2,
|
|
484
|
+
deviceName: longName,
|
|
485
|
+
})).rejects.toThrow();
|
|
486
|
+
});
|
|
403
487
|
});
|
|
404
488
|
describe('Update Account Methods', () => {
|
|
405
489
|
it('should update account with device name', async () => {
|
|
@@ -407,7 +491,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
407
491
|
const result = await signalCli.updateAccount({ deviceName: 'New Device' });
|
|
408
492
|
expect(result.success).toBe(true);
|
|
409
493
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateAccount', expect.objectContaining({
|
|
410
|
-
deviceName: 'New Device'
|
|
494
|
+
deviceName: 'New Device',
|
|
411
495
|
}));
|
|
412
496
|
});
|
|
413
497
|
it('should update account with username', async () => {
|
|
@@ -420,7 +504,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
420
504
|
sendJsonRpcRequestSpy.mockResolvedValue({});
|
|
421
505
|
await signalCli.updateAccount({ deleteUsername: true });
|
|
422
506
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateAccount', expect.objectContaining({
|
|
423
|
-
deleteUsername: true
|
|
507
|
+
deleteUsername: true,
|
|
424
508
|
}));
|
|
425
509
|
});
|
|
426
510
|
it('should update privacy settings', async () => {
|
|
@@ -428,12 +512,12 @@ describe('SignalCli Methods Tests', () => {
|
|
|
428
512
|
await signalCli.updateAccount({
|
|
429
513
|
unrestrictedUnidentifiedSender: true,
|
|
430
514
|
discoverableByNumber: false,
|
|
431
|
-
numberSharing: false
|
|
515
|
+
numberSharing: false,
|
|
432
516
|
});
|
|
433
517
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('updateAccount', expect.objectContaining({
|
|
434
518
|
unrestrictedUnidentifiedSender: true,
|
|
435
519
|
discoverableByNumber: false,
|
|
436
|
-
numberSharing: false
|
|
520
|
+
numberSharing: false,
|
|
437
521
|
}));
|
|
438
522
|
});
|
|
439
523
|
it('should handle update account error', async () => {
|
|
@@ -449,21 +533,21 @@ describe('SignalCli Methods Tests', () => {
|
|
|
449
533
|
const data = await signalCli.getAttachment({ id: 'attachment123' });
|
|
450
534
|
expect(data).toBe('base64data...');
|
|
451
535
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('getAttachment', expect.objectContaining({
|
|
452
|
-
id: 'attachment123'
|
|
536
|
+
id: 'attachment123',
|
|
453
537
|
}));
|
|
454
538
|
});
|
|
455
539
|
it('should get attachment with groupId', async () => {
|
|
456
540
|
sendJsonRpcRequestSpy.mockResolvedValue('base64data');
|
|
457
541
|
await signalCli.getAttachment({ id: 'att1', groupId: 'group123==' });
|
|
458
542
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('getAttachment', expect.objectContaining({
|
|
459
|
-
groupId: 'group123=='
|
|
543
|
+
groupId: 'group123==',
|
|
460
544
|
}));
|
|
461
545
|
});
|
|
462
546
|
it('should get attachment with recipient', async () => {
|
|
463
547
|
sendJsonRpcRequestSpy.mockResolvedValue('base64data');
|
|
464
548
|
await signalCli.getAttachment({ id: 'att1', recipient: '+1111111111' });
|
|
465
549
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('getAttachment', expect.objectContaining({
|
|
466
|
-
recipient: '+1111111111'
|
|
550
|
+
recipient: '+1111111111',
|
|
467
551
|
}));
|
|
468
552
|
});
|
|
469
553
|
});
|
|
@@ -473,7 +557,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
473
557
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('startChangeNumber', {
|
|
474
558
|
account: '+1234567890',
|
|
475
559
|
number: '+33612345678',
|
|
476
|
-
voice: false
|
|
560
|
+
voice: false,
|
|
477
561
|
});
|
|
478
562
|
});
|
|
479
563
|
it('should start change number with voice verification', async () => {
|
|
@@ -481,7 +565,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
481
565
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('startChangeNumber', {
|
|
482
566
|
account: '+1234567890',
|
|
483
567
|
number: '+33612345678',
|
|
484
|
-
voice: true
|
|
568
|
+
voice: true,
|
|
485
569
|
});
|
|
486
570
|
});
|
|
487
571
|
it('should start change number with captcha', async () => {
|
|
@@ -491,7 +575,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
491
575
|
account: '+1234567890',
|
|
492
576
|
number: '+33612345678',
|
|
493
577
|
voice: false,
|
|
494
|
-
captcha
|
|
578
|
+
captcha,
|
|
495
579
|
});
|
|
496
580
|
});
|
|
497
581
|
it('should validate phone number in startChangeNumber', async () => {
|
|
@@ -502,7 +586,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
502
586
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('finishChangeNumber', {
|
|
503
587
|
account: '+1234567890',
|
|
504
588
|
number: '+33612345678',
|
|
505
|
-
verificationCode: '123456'
|
|
589
|
+
verificationCode: '123456',
|
|
506
590
|
});
|
|
507
591
|
});
|
|
508
592
|
it('should finish change number with PIN', async () => {
|
|
@@ -511,7 +595,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
511
595
|
account: '+1234567890',
|
|
512
596
|
number: '+33612345678',
|
|
513
597
|
verificationCode: '123456',
|
|
514
|
-
pin: '1234'
|
|
598
|
+
pin: '1234',
|
|
515
599
|
});
|
|
516
600
|
});
|
|
517
601
|
it('should validate phone number in finishChangeNumber', async () => {
|
|
@@ -533,7 +617,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
533
617
|
account: '+1234567890',
|
|
534
618
|
recipient,
|
|
535
619
|
receipt,
|
|
536
|
-
note
|
|
620
|
+
note,
|
|
537
621
|
});
|
|
538
622
|
});
|
|
539
623
|
it('should send payment notification without note', async () => {
|
|
@@ -543,7 +627,7 @@ describe('SignalCli Methods Tests', () => {
|
|
|
543
627
|
expect(sendJsonRpcRequestSpy).toHaveBeenCalledWith('sendPaymentNotification', {
|
|
544
628
|
account: '+1234567890',
|
|
545
629
|
recipient,
|
|
546
|
-
receipt
|
|
630
|
+
receipt,
|
|
547
631
|
});
|
|
548
632
|
});
|
|
549
633
|
it('should validate recipient in sendPaymentNotification', async () => {
|
|
@@ -95,20 +95,11 @@ describe('SignalCli - Enhanced Parsing (Phase 5)', () => {
|
|
|
95
95
|
isMember: true,
|
|
96
96
|
isBlocked: false,
|
|
97
97
|
messageExpirationTime: 0,
|
|
98
|
-
members: [
|
|
99
|
-
|
|
100
|
-
{ number: '+33222222222' },
|
|
101
|
-
],
|
|
102
|
-
pendingMembers: [
|
|
103
|
-
{ number: '+33333333333' },
|
|
104
|
-
],
|
|
98
|
+
members: [{ number: '+33111111111' }, { number: '+33222222222' }],
|
|
99
|
+
pendingMembers: [{ number: '+33333333333' }],
|
|
105
100
|
requestingMembers: [],
|
|
106
|
-
admins: [
|
|
107
|
-
|
|
108
|
-
],
|
|
109
|
-
banned: [
|
|
110
|
-
{ number: '+33444444444' },
|
|
111
|
-
],
|
|
101
|
+
admins: [{ number: '+33111111111' }],
|
|
102
|
+
banned: [{ number: '+33444444444' }],
|
|
112
103
|
permissionAddMember: 'ONLY_ADMINS',
|
|
113
104
|
permissionEditDetails: 'ONLY_ADMINS',
|
|
114
105
|
permissionSendMessage: 'EVERY_MEMBER',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|