UNPKG

13.1 kBJavaScriptView Raw
1"use strict";
2import 'source-map-support/register';
3const sdk = require("../..");
4const HttpBackend = require("matrix-mock-request");
5const utils = require("../test-utils");
6
7import expect from 'expect';
8import Promise from 'bluebird';
9
10describe("MatrixClient events", function() {
11 const baseUrl = "http://localhost.or.something";
12 let client;
13 let httpBackend;
14 const selfUserId = "@alice:localhost";
15 const selfAccessToken = "aseukfgwef";
16
17 beforeEach(function() {
18 utils.beforeEach(this); // eslint-disable-line babel/no-invalid-this
19 httpBackend = new HttpBackend();
20 sdk.request(httpBackend.requestFn);
21 client = sdk.createClient({
22 baseUrl: baseUrl,
23 userId: selfUserId,
24 accessToken: selfAccessToken,
25 });
26 httpBackend.when("GET", "/pushrules").respond(200, {});
27 httpBackend.when("POST", "/filter").respond(200, { filter_id: "a filter id" });
28 });
29
30 afterEach(function() {
31 httpBackend.verifyNoOutstandingExpectation();
32 client.stopClient();
33 return httpBackend.stop();
34 });
35
36 describe("emissions", function() {
37 const SYNC_DATA = {
38 next_batch: "s_5_3",
39 presence: {
40 events: [
41 utils.mkPresence({
42 user: "@foo:bar", name: "Foo Bar", presence: "online",
43 }),
44 ],
45 },
46 rooms: {
47 join: {
48 "!erufh:bar": {
49 timeline: {
50 events: [
51 utils.mkMessage({
52 room: "!erufh:bar", user: "@foo:bar", msg: "hmmm",
53 }),
54 ],
55 prev_batch: "s",
56 },
57 state: {
58 events: [
59 utils.mkMembership({
60 room: "!erufh:bar", mship: "join", user: "@foo:bar",
61 }),
62 utils.mkEvent({
63 type: "m.room.create", room: "!erufh:bar",
64 user: "@foo:bar",
65 content: {
66 creator: "@foo:bar",
67 },
68 }),
69 ],
70 },
71 },
72 },
73 },
74 };
75 const NEXT_SYNC_DATA = {
76 next_batch: "e_6_7",
77 rooms: {
78 join: {
79 "!erufh:bar": {
80 timeline: {
81 events: [
82 utils.mkMessage({
83 room: "!erufh:bar", user: "@foo:bar",
84 msg: "ello ello",
85 }),
86 utils.mkMessage({
87 room: "!erufh:bar", user: "@foo:bar", msg: ":D",
88 }),
89 ],
90 },
91 ephemeral: {
92 events: [
93 utils.mkEvent({
94 type: "m.typing", room: "!erufh:bar", content: {
95 user_ids: ["@foo:bar"],
96 },
97 }),
98 ],
99 },
100 },
101 },
102 },
103 };
104
105 it("should emit events from both the first and subsequent /sync calls",
106 function() {
107 httpBackend.when("GET", "/sync").respond(200, SYNC_DATA);
108 httpBackend.when("GET", "/sync").respond(200, NEXT_SYNC_DATA);
109
110 let expectedEvents = [];
111 expectedEvents = expectedEvents.concat(
112 SYNC_DATA.presence.events,
113 SYNC_DATA.rooms.join["!erufh:bar"].timeline.events,
114 SYNC_DATA.rooms.join["!erufh:bar"].state.events,
115 NEXT_SYNC_DATA.rooms.join["!erufh:bar"].timeline.events,
116 NEXT_SYNC_DATA.rooms.join["!erufh:bar"].ephemeral.events,
117 );
118
119 client.on("event", function(event) {
120 let found = false;
121 for (let i = 0; i < expectedEvents.length; i++) {
122 if (expectedEvents[i].event_id === event.getId()) {
123 expectedEvents.splice(i, 1);
124 found = true;
125 break;
126 }
127 }
128 expect(found).toBe(
129 true, "Unexpected 'event' emitted: " + event.getType(),
130 );
131 });
132
133 client.startClient();
134
135 return Promise.all([
136 // wait for two SYNCING events
137 utils.syncPromise(client).then(() => {
138 return utils.syncPromise(client);
139 }),
140 httpBackend.flushAllExpected(),
141 ]).then(() => {
142 expect(expectedEvents.length).toEqual(
143 0, "Failed to see all events from /sync calls",
144 );
145 });
146 });
147
148 it("should emit User events", function(done) {
149 httpBackend.when("GET", "/sync").respond(200, SYNC_DATA);
150 httpBackend.when("GET", "/sync").respond(200, NEXT_SYNC_DATA);
151 let fired = false;
152 client.on("User.presence", function(event, user) {
153 fired = true;
154 expect(user).toBeTruthy();
155 expect(event).toBeTruthy();
156 if (!user || !event) {
157 return;
158 }
159
160 expect(event.event).toMatch(SYNC_DATA.presence.events[0]);
161 expect(user.presence).toEqual(
162 SYNC_DATA.presence.events[0].content.presence,
163 );
164 });
165 client.startClient();
166
167 httpBackend.flushAllExpected().done(function() {
168 expect(fired).toBe(true, "User.presence didn't fire.");
169 done();
170 });
171 });
172
173 it("should emit Room events", function() {
174 httpBackend.when("GET", "/sync").respond(200, SYNC_DATA);
175 httpBackend.when("GET", "/sync").respond(200, NEXT_SYNC_DATA);
176 let roomInvokeCount = 0;
177 let roomNameInvokeCount = 0;
178 let timelineFireCount = 0;
179 client.on("Room", function(room) {
180 roomInvokeCount++;
181 expect(room.roomId).toEqual("!erufh:bar");
182 });
183 client.on("Room.timeline", function(event, room) {
184 timelineFireCount++;
185 expect(room.roomId).toEqual("!erufh:bar");
186 });
187 client.on("Room.name", function(room) {
188 roomNameInvokeCount++;
189 });
190
191 client.startClient();
192
193 return Promise.all([
194 httpBackend.flushAllExpected(),
195 utils.syncPromise(client, 2),
196 ]).then(function() {
197 expect(roomInvokeCount).toEqual(
198 1, "Room fired wrong number of times.",
199 );
200 expect(roomNameInvokeCount).toEqual(
201 1, "Room.name fired wrong number of times.",
202 );
203 expect(timelineFireCount).toEqual(
204 3, "Room.timeline fired the wrong number of times",
205 );
206 });
207 });
208
209 it("should emit RoomState events", function() {
210 httpBackend.when("GET", "/sync").respond(200, SYNC_DATA);
211 httpBackend.when("GET", "/sync").respond(200, NEXT_SYNC_DATA);
212
213 const roomStateEventTypes = [
214 "m.room.member", "m.room.create",
215 ];
216 let eventsInvokeCount = 0;
217 let membersInvokeCount = 0;
218 let newMemberInvokeCount = 0;
219 client.on("RoomState.events", function(event, state) {
220 eventsInvokeCount++;
221 const index = roomStateEventTypes.indexOf(event.getType());
222 expect(index).toNotEqual(
223 -1, "Unexpected room state event type: " + event.getType(),
224 );
225 if (index >= 0) {
226 roomStateEventTypes.splice(index, 1);
227 }
228 });
229 client.on("RoomState.members", function(event, state, member) {
230 membersInvokeCount++;
231 expect(member.roomId).toEqual("!erufh:bar");
232 expect(member.userId).toEqual("@foo:bar");
233 expect(member.membership).toEqual("join");
234 });
235 client.on("RoomState.newMember", function(event, state, member) {
236 newMemberInvokeCount++;
237 expect(member.roomId).toEqual("!erufh:bar");
238 expect(member.userId).toEqual("@foo:bar");
239 expect(member.membership).toBeFalsy();
240 });
241
242 client.startClient();
243
244 return Promise.all([
245 httpBackend.flushAllExpected(),
246 utils.syncPromise(client, 2),
247 ]).then(function() {
248 expect(membersInvokeCount).toEqual(
249 1, "RoomState.members fired wrong number of times",
250 );
251 expect(newMemberInvokeCount).toEqual(
252 1, "RoomState.newMember fired wrong number of times",
253 );
254 expect(eventsInvokeCount).toEqual(
255 2, "RoomState.events fired wrong number of times",
256 );
257 });
258 });
259
260 it("should emit RoomMember events", function() {
261 httpBackend.when("GET", "/sync").respond(200, SYNC_DATA);
262 httpBackend.when("GET", "/sync").respond(200, NEXT_SYNC_DATA);
263
264 let typingInvokeCount = 0;
265 let powerLevelInvokeCount = 0;
266 let nameInvokeCount = 0;
267 let membershipInvokeCount = 0;
268 client.on("RoomMember.name", function(event, member) {
269 nameInvokeCount++;
270 });
271 client.on("RoomMember.typing", function(event, member) {
272 typingInvokeCount++;
273 expect(member.typing).toBe(true);
274 });
275 client.on("RoomMember.powerLevel", function(event, member) {
276 powerLevelInvokeCount++;
277 });
278 client.on("RoomMember.membership", function(event, member) {
279 membershipInvokeCount++;
280 expect(member.membership).toEqual("join");
281 });
282
283 client.startClient();
284
285 return Promise.all([
286 httpBackend.flushAllExpected(),
287 utils.syncPromise(client, 2),
288 ]).then(function() {
289 expect(typingInvokeCount).toEqual(
290 1, "RoomMember.typing fired wrong number of times",
291 );
292 expect(powerLevelInvokeCount).toEqual(
293 0, "RoomMember.powerLevel fired wrong number of times",
294 );
295 expect(nameInvokeCount).toEqual(
296 0, "RoomMember.name fired wrong number of times",
297 );
298 expect(membershipInvokeCount).toEqual(
299 1, "RoomMember.membership fired wrong number of times",
300 );
301 });
302 });
303
304 it("should emit Session.logged_out on M_UNKNOWN_TOKEN", function() {
305 const error = { errcode: 'M_UNKNOWN_TOKEN' };
306 httpBackend.when("GET", "/sync").respond(401, error);
307
308 let sessionLoggedOutCount = 0;
309 client.on("Session.logged_out", function(errObj) {
310 sessionLoggedOutCount++;
311 expect(errObj.data).toEqual(error);
312 });
313
314 client.startClient();
315
316 return httpBackend.flushAllExpected().then(function() {
317 expect(sessionLoggedOutCount).toEqual(
318 1, "Session.logged_out fired wrong number of times",
319 );
320 });
321 });
322
323 it("should emit Session.logged_out on M_UNKNOWN_TOKEN (soft logout)", function() {
324 const error = { errcode: 'M_UNKNOWN_TOKEN', soft_logout: true };
325 httpBackend.when("GET", "/sync").respond(401, error);
326
327 let sessionLoggedOutCount = 0;
328 client.on("Session.logged_out", function(errObj) {
329 sessionLoggedOutCount++;
330 expect(errObj.data).toEqual(error);
331 });
332
333 client.startClient();
334
335 return httpBackend.flushAllExpected().then(function() {
336 expect(sessionLoggedOutCount).toEqual(
337 1, "Session.logged_out fired wrong number of times",
338 );
339 });
340 });
341 });
342});