fca-horidai-remastered 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. package/.gitattributes +2 -0
  2. package/Extra/Bypass/956/index.js +234 -0
  3. package/Extra/Bypass/test/aaaa.json +170 -0
  4. package/Extra/Bypass/test/index.js +188 -0
  5. package/Extra/Database/index.js +469 -0
  6. package/Extra/ExtraAddons.js +82 -0
  7. package/Extra/ExtraFindUID.js +62 -0
  8. package/Extra/ExtraGetThread.js +365 -0
  9. package/Extra/ExtraScreenShot.js +430 -0
  10. package/Extra/ExtraUptimeRobot.js +38 -0
  11. package/Extra/Html/Classic/script.js +119 -0
  12. package/Extra/Html/Classic/style.css +8 -0
  13. package/Extra/Security/AES_256_GCM/index.js +0 -0
  14. package/Extra/Security/Base/Step_1.js +6 -0
  15. package/Extra/Security/Base/Step_2.js +22 -0
  16. package/Extra/Security/Base/Step_3.js +22 -0
  17. package/Extra/Security/Base/index.js +191 -0
  18. package/Extra/Security/Index.js +5 -0
  19. package/Extra/Security/Step_1.js +6 -0
  20. package/Extra/Security/Step_2.js +22 -0
  21. package/Extra/Security/Step_3.js +22 -0
  22. package/Extra/Src/Change_Environment.js +24 -0
  23. package/Extra/Src/Check_Update.js +67 -0
  24. package/Extra/Src/History.js +115 -0
  25. package/Extra/Src/Instant_Update.js +65 -0
  26. package/Extra/Src/Last-Run.js +65 -0
  27. package/Extra/Src/Premium.js +81 -0
  28. package/Extra/Src/Release_Memory.js +160 -0
  29. package/Extra/Src/Websocket.js +213 -0
  30. package/Extra/Src/image/checkmate.jpg +0 -0
  31. package/Extra/Src/test.js +28 -0
  32. package/Extra/Src/uuid.js +137 -0
  33. package/Func/AcceptAgreement.js +31 -0
  34. package/Func/ClearCache.js +64 -0
  35. package/Func/ReportV1.js +54 -0
  36. package/LICENSE +21 -0
  37. package/Language/index.json +222 -0
  38. package/Main.js +1266 -0
  39. package/README.md +152 -0
  40. package/SECURITY.md +18 -0
  41. package/broadcast.js +44 -0
  42. package/index.js +448 -0
  43. package/logger.js +66 -0
  44. package/package.json +94 -0
  45. package/src/Dev_Horizon_Data.js +125 -0
  46. package/src/Dev_getThreadInfoOLD.js +422 -0
  47. package/src/Dev_shareTest2.js +68 -0
  48. package/src/Dev_shareTest3.js +71 -0
  49. package/src/Premium.js +25 -0
  50. package/src/Screenshot.js +83 -0
  51. package/src/addExternalModule.js +16 -0
  52. package/src/addUserToGroup.js +79 -0
  53. package/src/changeAdminStatus.js +79 -0
  54. package/src/changeArchivedStatus.js +41 -0
  55. package/src/changeAvt.js +85 -0
  56. package/src/changeBio.js +65 -0
  57. package/src/changeBlockedStatus.js +36 -0
  58. package/src/changeGroupImage.js +106 -0
  59. package/src/changeNickname.js +45 -0
  60. package/src/changeThreadColor.js +62 -0
  61. package/src/changeThreadEmoji.js +42 -0
  62. package/src/createNewGroup.js +70 -0
  63. package/src/createPoll.js +60 -0
  64. package/src/deleteMessage.js +45 -0
  65. package/src/deleteThread.js +43 -0
  66. package/src/editMessage.js +53 -0
  67. package/src/forwardAttachment.js +48 -0
  68. package/src/getAccessToken.js +28 -0
  69. package/src/getCurrentUserID.js +7 -0
  70. package/src/getEmojiUrl.js +27 -0
  71. package/src/getFriendsList.js +73 -0
  72. package/src/getMessage.js +103 -0
  73. package/src/getThreadHistory.js +537 -0
  74. package/src/getThreadInfo.js +424 -0
  75. package/src/getThreadInfoOLD.js +422 -0
  76. package/src/getThreadList.js +213 -0
  77. package/src/getThreadMain.js +220 -0
  78. package/src/getThreadPictures.js +59 -0
  79. package/src/getUID.js +59 -0
  80. package/src/getUserID.js +62 -0
  81. package/src/getUserInfo.js +112 -0
  82. package/src/getUserInfoMain.js +65 -0
  83. package/src/getUserInfoV2.js +32 -0
  84. package/src/getUserInfoV3.js +63 -0
  85. package/src/getUserInfoV4.js +55 -0
  86. package/src/getUserInfoV5.js +61 -0
  87. package/src/handleFriendRequest.js +46 -0
  88. package/src/handleMessageRequest.js +49 -0
  89. package/src/httpGet.js +49 -0
  90. package/src/httpPost.js +48 -0
  91. package/src/httpPostFormData.js +41 -0
  92. package/src/listenMqtt.js +936 -0
  93. package/src/listenMqttV1.js +846 -0
  94. package/src/logout.js +68 -0
  95. package/src/markAsDelivered.js +48 -0
  96. package/src/markAsRead.js +70 -0
  97. package/src/markAsReadAll.js +43 -0
  98. package/src/markAsSeen.js +51 -0
  99. package/src/muteThread.js +47 -0
  100. package/src/removeUserFromGroup.js +49 -0
  101. package/src/resolvePhotoUrl.js +37 -0
  102. package/src/searchForThread.js +43 -0
  103. package/src/sendMessage.js +386 -0
  104. package/src/sendMqttMessage.js +71 -0
  105. package/src/sendTypingIndicator.js +80 -0
  106. package/src/setMessageReaction.js +109 -0
  107. package/src/setPostReaction.js +102 -0
  108. package/src/setTitle.js +74 -0
  109. package/src/shareContact.js +55 -0
  110. package/src/shareLink.js +58 -0
  111. package/src/threadColors.js +39 -0
  112. package/src/unfriend.js +43 -0
  113. package/src/unsendMessage.js +40 -0
  114. package/test/Database_Test.js +4 -0
  115. package/test/Db2.js +530 -0
  116. package/test/Horizon_Database/A_README.md +1 -0
  117. package/test/Horizon_Database/Database.db +0 -0
  118. package/test/data/shareAttach.js +146 -0
  119. package/test/data/something.mov +0 -0
  120. package/test/data/test.png +0 -0
  121. package/test/data/test.txt +7 -0
  122. package/test/env/.env +0 -0
  123. package/test/example-config.json +18 -0
  124. package/test/example-db.db +0 -0
  125. package/test/memoryleak.js +18 -0
  126. package/test/test-page.js +140 -0
  127. package/test/test.js +385 -0
  128. package/test/testname.js +1342 -0
  129. package/test/testv2.js +3 -0
  130. package/utils.js +3038 -0
@@ -0,0 +1,18 @@
1
+ // Instructions: Copy this file to test-config.json, fill in your test data
2
+ // and remove all comments (JSON doesn't support comments).
3
+ // Run the test with `npm test` after installing the devDependencies (mocha).
4
+ {
5
+ // Test user login information
6
+ "user" : {
7
+ "id" : "00000000000000",
8
+ "email" : "example@test.com",
9
+ "password" : "qwerty"
10
+ },
11
+ // Array of at least 2 other user IDs (not the same as the test user)
12
+ "userIDs" : [
13
+ "11111111111111",
14
+ "22222222222222"
15
+ ],
16
+ // Id of page to which test user is an admin
17
+ "pageID": "3333333333333"
18
+ }
File without changes
@@ -0,0 +1,18 @@
1
+ const memwatch = require('memwatch-next');
2
+
3
+ // bắt đầu theo dõi memory
4
+ memwatch.on('leak', function(info) {
5
+ console.error('memory leak detected:');
6
+ console.error(info);
7
+ });
8
+
9
+ // Tạo một object để tạo memory leak
10
+ let myObj = {};
11
+ setInterval(function() {
12
+ for (let i = 0; i < 10000; i++) {
13
+ myObj[i] = new Array(10000);
14
+ }
15
+ }, 1000);
16
+
17
+ // force garbage collection để release memory leak
18
+ memwatch.gc();
@@ -0,0 +1,140 @@
1
+ var login = require('../index.js');
2
+ var fs = require('fs');
3
+ var assert = require('assert');
4
+
5
+ var conf = JSON.parse(process.env.testconfig || fs.readFileSync('test/test-config.json', 'utf8'));
6
+ var credentials = {
7
+ email: conf.user.email,
8
+ password: conf.user.password,
9
+ };
10
+
11
+ var userIDs = conf.userIDs;
12
+
13
+ var options = {
14
+ selfListen: true,
15
+ listenEvents: true,
16
+ logLevel: "silent",
17
+ pageID: conf.pageID
18
+ };
19
+ var getType = require('../utils').getType;
20
+
21
+ var userID = conf.user.id;
22
+
23
+ var groupChatID;
24
+ var groupChatName;
25
+
26
+ function checkErr(done){
27
+ return function(err) {
28
+ if (err) done(err);
29
+ };
30
+ }
31
+
32
+ // describe('Login As Page:', function() {
33
+ // var api = null;
34
+ // process.on('SIGINT', () => api && !api.logout() && console.log("Logged out :)"));
35
+ // var tests = [];
36
+ // var stopListening;
37
+ // this.timeout(20000);
38
+
39
+ // function listen(done, matcher) {
40
+ // tests.push({matcher:matcher, done:done});
41
+ // }
42
+
43
+ // before(function(done) {
44
+ // login(credentials, options, function (err, localAPI) {
45
+ // if(err) return done(err);
46
+
47
+ // assert(localAPI);
48
+ // api = localAPI;
49
+ // stopListening = api.listen(function (err, msg) {
50
+ // if (err) throw err;
51
+ // // Removes matching function and calls corresponding done
52
+ // tests = tests.filter(function(test) {
53
+ // return !(test.matcher(msg) && (test.done() || true));
54
+ // });
55
+ // });
56
+
57
+ // done();
58
+ // });
59
+ // });
60
+
61
+ // it('should login without error', function (){
62
+ // assert(api);
63
+ // });
64
+
65
+ // it('should get the right user ID', function (){
66
+ // assert(userID == api.getCurrentUserID());
67
+ // });
68
+
69
+ // it('should send text message object (user)', function (done){
70
+ // var body = "text-msg-obj-" + Date.now();
71
+ // listen(done, msg =>
72
+ // msg.type === 'message' &&
73
+ // msg.body === body &&
74
+ // msg.isGroup === false
75
+ // );
76
+ // api.sendMessage({body: body}, userID, checkErr(done));
77
+ // });
78
+
79
+ // it('should send sticker message object (user)', function (done){
80
+ // var stickerID = '767334526626290';
81
+ // listen(done, msg =>
82
+ // msg.type === 'message' &&
83
+ // msg.attachments.length > 0 &&
84
+ // msg.attachments[0].type === 'sticker' &&
85
+ // msg.attachments[0].stickerID === stickerID &&
86
+ // msg.isGroup === false
87
+ // );
88
+ // api.sendMessage({sticker: stickerID}, userID, checkErr(done));
89
+ // });
90
+
91
+ // it('should send basic string (user)', function (done){
92
+ // var body = "basic-str-" + Date.now();
93
+ // listen(done, msg =>
94
+ // msg.type === 'message' &&
95
+ // msg.body === body &&
96
+ // msg.isGroup === false
97
+ // );
98
+ // api.sendMessage(body, userID, checkErr(done));
99
+ // });
100
+
101
+ // it('should send typing indicator', function (done) {
102
+ // var stopType = api.sendTypingIndicator(userID, function(err) {
103
+ // checkErr(done)(err);
104
+ // stopType();
105
+ // done();
106
+ // });
107
+ // });
108
+
109
+ // it('should get the right user info', function (done) {
110
+ // api.getUserInfo(userID, function(err, data) {
111
+ // checkErr(done)(err);
112
+ // var user = data[userID];
113
+ // assert(user.name);
114
+ // assert(user.firstName);
115
+ // assert(user.vanity !== null);
116
+ // assert(user.profileUrl);
117
+ // assert(user.gender);
118
+ // assert(user.type);
119
+ // assert(!user.isFriend);
120
+ // done();
121
+ // });
122
+ // });
123
+
124
+ // it('should get the list of friends', function (done) {
125
+ // api.getFriendsList(function(err, data) {
126
+ // checkErr(done)(err);
127
+ // assert(getType(data) === "Array");
128
+ // data.map(function(v) {parseInt(v);});
129
+ // done();
130
+ // });
131
+ // });
132
+
133
+ // it('should log out', function (done) {
134
+ // api.logout(done);
135
+ // });
136
+
137
+ // after(function (){
138
+ // if (stopListening) stopListening();
139
+ // });
140
+ // });
package/test/test.js ADDED
@@ -0,0 +1,385 @@
1
+ var login = require('../index.js');
2
+ var fs = require('fs');
3
+ var assert = require('assert');
4
+
5
+ var conf = JSON.parse(process.env.testconfig || fs.readFileSync('test/test-config.json', 'utf8'));
6
+ var credentials = {
7
+ email: conf.user.email,
8
+ password: conf.user.password,
9
+ };
10
+
11
+ var userIDs = conf.userIDs;
12
+
13
+ var options = { selfListen: true, listenEvents: true, logLevel: "silent"};
14
+ var pageOptions = {logLevel: 'silent', pageID: conf.pageID};
15
+ var getType = require('../utils').getType;
16
+ var formatDeltaMessage = require('../utils').formatDeltaMessage;
17
+ var shareAttachmentFixture = require('./data/shareAttach');
18
+
19
+ var userID = conf.user.id;
20
+
21
+ var groupChatID;
22
+ var groupChatName;
23
+
24
+ function checkErr(done){
25
+ return function(err) {
26
+ if (err) done(err);
27
+ };
28
+ }
29
+
30
+ describe('Login:', function() {
31
+ var api = null;
32
+ process.on('SIGINT', () => api && !api.logout() && console.log("Logged out :)"));
33
+ var tests = [];
34
+ var stopListening;
35
+ this.timeout(20000);
36
+
37
+ function listen(done, matcher) {
38
+ tests.push({matcher:matcher, done:done});
39
+ }
40
+
41
+ before(function(done) {
42
+ login(credentials, options, function (err, localAPI) {
43
+ if(err) return done(err);
44
+
45
+ assert(localAPI);
46
+ api = localAPI;
47
+ stopListening = api.listen(function (err, msg) {
48
+ if (err) throw err;
49
+ if (msg.type === "message") {
50
+ assert(msg.senderID && !isNaN(msg.senderID));
51
+ assert(msg.threadID && !isNaN(msg.threadID));
52
+ assert(msg.timestamp && !isNaN(msg.timestamp));
53
+ assert(msg.messageID != null && msg.messageID.length > 0);
54
+ assert(msg.body != null || msg.attachments.length > 0);
55
+ }
56
+ // Removes matching function and calls corresponding done
57
+ tests = tests.filter(function(test) {
58
+ return !(test.matcher(msg) && (test.done() || true));
59
+ });
60
+ });
61
+
62
+ done();
63
+ });
64
+ });
65
+
66
+ it('should login without error', function (){
67
+ assert(api);
68
+ });
69
+
70
+ it('should get the current user ID', function (){
71
+ assert(userID === api.getCurrentUserID());
72
+ });
73
+
74
+ it('should send text message object (user)', function (done){
75
+ var body = "text-msg-obj-" + Date.now();
76
+ listen(done, msg =>
77
+ msg.type === 'message' &&
78
+ msg.body === body &&
79
+ msg.isGroup === false
80
+ );
81
+ api.sendMessage({body: body}, userID, checkErr(done));
82
+ });
83
+
84
+ it('should send sticker message object (user)', function (done){
85
+ var stickerID = '767334526626290';
86
+ listen(done, msg =>
87
+ msg.type === 'message' &&
88
+ msg.attachments.length > 0 &&
89
+ msg.attachments[0].type === 'sticker' &&
90
+ msg.attachments[0].stickerID === stickerID &&
91
+ msg.isGroup === false
92
+ );
93
+ api.sendMessage({sticker: stickerID}, userID, checkErr(done));
94
+ });
95
+
96
+ it('should send basic string (user)', function (done){
97
+ var body = "basic-str-" + Date.now();
98
+ listen(done, msg =>
99
+ msg.type === 'message' &&
100
+ msg.body === body &&
101
+ msg.isGroup === false
102
+ );
103
+ api.sendMessage(body, userID, checkErr(done));
104
+ });
105
+
106
+ it('should get thread info (user)', function (done){
107
+ api.getThreadInfo(userID, (err, info) => {
108
+ if (err) done(err);
109
+
110
+ assert(info.participantIDs != null && info.participantIDs.length > 0);
111
+ assert(!info.participantIDs.some(isNaN));
112
+ assert(!info.participantIDs.some(v => v.length == 0));
113
+ assert(info.name != null);
114
+ assert(info.messageCount != null && !isNaN(info.messageCount));
115
+ assert(info.hasOwnProperty('emoji'));
116
+ assert(info.hasOwnProperty('nicknames'));
117
+ assert(info.hasOwnProperty('color'));
118
+ done();
119
+ });
120
+ });
121
+
122
+
123
+ it('should get the history of the chat (user)', function (done) {
124
+ api.getThreadHistory(userID, 5, null, function(err, data) {
125
+ checkErr(done)(err);
126
+ assert(getType(data) === "Array");
127
+ assert(data.every(function(v) {return getType(v) == "Object";}));
128
+ done();
129
+ });
130
+ });
131
+
132
+ it('should get the history of the chat (user) (graphql)', function (done) {
133
+ api.getThreadHistoryGraphQL(userID, 5, null, function(err, data) {
134
+ checkErr(done)(err);
135
+ assert(getType(data) === "Array");
136
+ assert(data.every(function(v) {return getType(v) == "Object";}));
137
+ done();
138
+ });
139
+ });
140
+
141
+ it('should create a chat', function (done){
142
+ var body = "new-chat-" + Date.now();
143
+ var inc = 0;
144
+
145
+ function doneHack(){
146
+ if (inc === 1) return done();
147
+ inc++;
148
+ }
149
+
150
+ listen(doneHack, msg =>
151
+ msg.type === 'message' && msg.body === body
152
+ );
153
+ api.sendMessage(body, userIDs, function(err, info){
154
+ checkErr(done)(err);
155
+ groupChatID = info.threadID;
156
+ doneHack();
157
+ });
158
+ });
159
+
160
+ it('should send text message object (group)', function (done){
161
+ var body = "text-msg-obj-" + Date.now();
162
+ listen(done, msg =>
163
+ msg.type === 'message' &&
164
+ msg.body === body &&
165
+ msg.isGroup === true
166
+ );
167
+ api.sendMessage({body: body}, groupChatID, function(err, info){
168
+ checkErr(done)(err);
169
+ assert(groupChatID === info.threadID);
170
+ });
171
+ });
172
+
173
+ it('should send basic string (group)', function (done){
174
+ var body = "basic-str-" + Date.now();
175
+ listen(done, msg =>
176
+ msg.type === 'message' &&
177
+ msg.body === body &&
178
+ msg.isGroup === true
179
+ );
180
+ api.sendMessage(body, groupChatID, function(err, info) {
181
+ checkErr(done)(err);
182
+ assert(groupChatID === info.threadID);
183
+ });
184
+ });
185
+
186
+ it('should send sticker message object (group)', function (done){
187
+ var stickerID = '767334526626290';
188
+ listen(done, function (msg) {
189
+ return msg.type === 'message' &&
190
+ msg.attachments.length > 0 &&
191
+ msg.attachments[0].type === 'sticker' &&
192
+ msg.attachments[0].stickerID === stickerID;
193
+ });
194
+ api.sendMessage({sticker: stickerID}, groupChatID, function (err, info) {
195
+ assert(groupChatID === info.threadID);
196
+ checkErr(done)(err);
197
+ });
198
+ });
199
+
200
+ it('should send an attachment with a body (group)', function (done){
201
+ var body = "attach-" + Date.now();
202
+ var attach = [];
203
+ attach.push(fs.createReadStream("test/data/test.txt"));
204
+ attach.push(fs.createReadStream("test/data/test.png"));
205
+ listen(done, function (msg) {
206
+ return msg.type === 'message' && msg.body === body;
207
+ });
208
+ api.sendMessage({attachment: attach, body: body}, groupChatID, function(err, info){
209
+ checkErr(done)(err);
210
+ assert(groupChatID === info.threadID);
211
+ });
212
+ });
213
+
214
+ it('should get the history of the chat (group)', function (done) {
215
+ api.getThreadHistory(groupChatID, 5, null, function(err, data) {
216
+ checkErr(done)(err);
217
+ assert(getType(data) === "Array");
218
+ assert(data.every(function(v) {return getType(v) == "Object";}));
219
+ done();
220
+ });
221
+ });
222
+
223
+ it('should get the history of the chat (group) (graphql)', function (done) {
224
+ api.getThreadHistoryGraphQL(groupChatID, 5, null, function(err, data) {
225
+ checkErr(done)(err);
226
+ assert(getType(data) === "Array");
227
+ assert(data.every(function(v) {return getType(v) == "Object";}));
228
+ done();
229
+ });
230
+ });
231
+
232
+
233
+ it('should change chat title', function (done){
234
+ var title = 'test-chat-title-' + Date.now();
235
+ listen(done, function (msg) {
236
+ return msg.type === 'event' &&
237
+ msg.logMessageType === 'log:thread-name' &&
238
+ msg.logMessageData.name === title;
239
+ });
240
+ groupChatName = title;
241
+ api.setTitle(title, groupChatID, checkErr(done));
242
+ });
243
+
244
+ it('should kick user', function (done) {
245
+ var id = userIDs[0];
246
+ listen(done, function (msg) {
247
+ return msg.type === 'event' &&
248
+ msg.logMessageType === 'log:unsubscribe' &&
249
+ msg.logMessageData.leftParticipantFbId === id;
250
+ });
251
+ api.removeUserFromGroup(id, groupChatID, checkErr(done));
252
+ });
253
+
254
+ it('should add user', function (done) {
255
+ var id = userIDs[0];
256
+ listen(done, function (msg) {
257
+ return (msg.type === 'event' &&
258
+ msg.logMessageType === 'log:subscribe' &&
259
+ msg.logMessageData.addedParticipants.length > 0 &&
260
+ msg.logMessageData.addedParticipants[0].userFbId === id);
261
+ });
262
+ // TODO: we don't check for errors inside this because FB changed and
263
+ // returns an error, even though we receive the event that the user was
264
+ // added
265
+ api.addUserToGroup(id, groupChatID, function() {});
266
+ });
267
+
268
+ xit('should get thread info (group)', function (done){
269
+ api.getThreadInfo(groupChatID, (err, info) => {
270
+ if (err) done(err);
271
+
272
+ assert(info.participantIDs != null && info.participantIDs.length > 0);
273
+ assert(!info.participantIDs.some(isNaN));
274
+ assert(!info.participantIDs.some(v => v.length == 0));
275
+ assert(info.name != null);
276
+ assert(info.messageCount != null && !isNaN(info.messageCount));
277
+ assert(info.hasOwnProperty('emoji'));
278
+ assert(info.hasOwnProperty('nicknames'));
279
+ assert(info.hasOwnProperty('color'));
280
+ done();
281
+ });
282
+ });
283
+
284
+ it('should retrieve a list of threads', function (done) {
285
+ api.getThreadList(0, 20, function(err, res) {
286
+ checkErr(done)(err);
287
+
288
+ // This checks to see if the group chat we just made
289
+ // is in the list... it should be.
290
+ assert(res.some(function (v) {
291
+ return (
292
+ v.threadID === groupChatID &&
293
+ userIDs.every(function (val) {
294
+ return v.participants.indexOf(val) > -1;
295
+ }) &&
296
+ v.name === groupChatName
297
+ );
298
+ }));
299
+ done();
300
+ });
301
+ });
302
+
303
+ it('should mark as read', function (done){
304
+ api.markAsRead(groupChatID, done);
305
+ });
306
+
307
+ it('should send typing indicator', function (done) {
308
+ var stopType = api.sendTypingIndicator(groupChatID, function(err) {
309
+ checkErr(done)(err);
310
+ stopType();
311
+ done();
312
+ });
313
+ });
314
+
315
+
316
+ it('should get the right user info', function (done) {
317
+ api.getUserInfo(userID, function(err, data) {
318
+ checkErr(done)(err);
319
+ var user = data[userID];
320
+ assert(user.name);
321
+ assert(user.firstName);
322
+ assert(user.vanity !== null);
323
+ assert(user.profileUrl);
324
+ assert(user.gender);
325
+ assert(user.type);
326
+ assert(!user.isFriend);
327
+ done();
328
+ });
329
+ });
330
+
331
+ it('should get the user ID', function(done) {
332
+ api.getUserInfo(userIDs[0], function(err, data) {
333
+ checkErr(done)(err);
334
+ var user = data[userIDs[0]];
335
+ api.getUserID(user.name, function(err, data) {
336
+ checkErr(done)(err);
337
+ assert(getType(data) === "Array");
338
+ assert(data.some(function(val) {
339
+ return val.userID === userIDs[0];
340
+ }));
341
+ done();
342
+ });
343
+ });
344
+ });
345
+
346
+ it('should get the list of friends', function (done) {
347
+ api.getFriendsList(function(err, data) {
348
+ try {
349
+ checkErr(done)(err);
350
+ assert(getType(data) === "Array");
351
+ data.map(v => {
352
+ assert(getType(v.firstName) === "String");
353
+ assert(getType(v.gender) === "String");
354
+ assert(getType(v.userID) === "String");
355
+ assert(getType(v.isFriend) === "Boolean");
356
+ assert(getType(v.fullName) === "String");
357
+ assert(getType(v.profilePicture) === "String");
358
+ assert(getType(v.type) === "String");
359
+ assert(v.hasOwnProperty("profileUrl")); // This can be null if the account is disabled
360
+ assert(getType(v.isBirthday) === "Boolean");
361
+ });
362
+ done();
363
+ } catch(e){
364
+ done(e);
365
+ }
366
+ });
367
+ });
368
+
369
+ it('should parse share attachment correctly', function () {
370
+ var formatted = formatDeltaMessage(shareAttachmentFixture);
371
+ assert(formatted.attachments[0].type === "share");
372
+ assert(formatted.attachments[0].title === "search engines");
373
+ assert(formatted.attachments[0].target.items[0].name === "search engines");
374
+ assert(formatted.attachments[0].target.items[0].call_to_actions.length === 3);
375
+ assert(formatted.attachments[0].target.items[0].call_to_actions[0].title === "Google");
376
+ });
377
+
378
+ it('should log out', function (done) {
379
+ api.logout(done);
380
+ });
381
+
382
+ after(function (){
383
+ if (stopListening) stopListening();
384
+ });
385
+ });