Skip to content

Commit d056d14

Browse files
committed
Write the failing test
1 parent f44510e commit d056d14

File tree

1 file changed

+111
-2
lines changed

1 file changed

+111
-2
lines changed

spec/integ/matrix-client-syncing.spec.js

+111-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { MatrixEvent } from "../../src/models/event";
2-
import { EventTimeline } from "../../src/models/event-timeline";
1+
import { EventTimeline, MatrixEvent, RoomEvent } from "../../src";
32
import * as utils from "../test-utils/test-utils";
43
import { TestClient } from "../TestClient";
54

@@ -60,6 +59,116 @@ describe("MatrixClient syncing", function() {
6059
done();
6160
});
6261
});
62+
63+
it("should emit Room.myMembership for invite->leave->invite cycles", async () => {
64+
const roomId = "!cycles:example.org";
65+
66+
// First sync: an invite
67+
const inviteSyncRoomSection = {
68+
invite: {
69+
[roomId]: {
70+
invite_state: {
71+
events: [{
72+
type: "m.room.member",
73+
state_key: selfUserId,
74+
content: {
75+
membership: "invite",
76+
},
77+
}],
78+
},
79+
},
80+
},
81+
};
82+
httpBackend.when("GET", "/sync").respond(200, {
83+
...syncData,
84+
rooms: inviteSyncRoomSection,
85+
});
86+
87+
// Second sync: a leave (reject of some kind)
88+
httpBackend.when("POST", "/leave").respond(200, {});
89+
httpBackend.when("GET", "/sync").respond(200, {
90+
...syncData,
91+
rooms: {
92+
leave: {
93+
[roomId]: {
94+
account_data: { events: [] },
95+
ephemeral: { events: [] },
96+
state: {
97+
events: [{
98+
type: "m.room.member",
99+
state_key: selfUserId,
100+
content: {
101+
membership: "leave",
102+
},
103+
prev_content: {
104+
membership: "invite",
105+
},
106+
// XXX: And other fields required on an event
107+
}],
108+
},
109+
timeline: {
110+
limited: false,
111+
events: [{
112+
type: "m.room.member",
113+
state_key: selfUserId,
114+
content: {
115+
membership: "leave",
116+
},
117+
prev_content: {
118+
membership: "invite",
119+
},
120+
// XXX: And other fields required on an event
121+
}],
122+
},
123+
},
124+
},
125+
},
126+
});
127+
128+
// Third sync: another invite
129+
httpBackend.when("GET", "/sync").respond(200, {
130+
...syncData,
131+
rooms: inviteSyncRoomSection,
132+
});
133+
134+
client.on(RoomEvent.MyMembership, (room, membership, oldMembership) => {
135+
console.log("@@ ", membership, oldMembership, room.roomId);
136+
});
137+
138+
// First fire: an initial invite
139+
let fires = 0;
140+
client.once(RoomEvent.MyMembership, (room, membership, oldMembership) => { // Room, string, string
141+
fires++;
142+
expect(room.roomId).toBe(roomId);
143+
expect(membership).toBe("invite");
144+
expect(oldMembership).toBeFalsy();
145+
146+
// Second fire: a leave
147+
client.once(RoomEvent.MyMembership, (room, membership, oldMembership) => {
148+
fires++;
149+
expect(room.roomId).toBe(roomId);
150+
expect(membership).toBe("leave");
151+
expect(oldMembership).toBe("invite");
152+
153+
// Third/final fire: a second invite
154+
client.once(RoomEvent.MyMembership, (room, membership, oldMembership) => {
155+
fires++;
156+
expect(room.roomId).toBe(roomId);
157+
expect(membership).toBe("invite");
158+
expect(oldMembership).toBe("leave");
159+
});
160+
});
161+
162+
// For maximum safety, "leave" the room after we register the handler
163+
client.leave(roomId);
164+
});
165+
166+
// noinspection ES6MissingAwait
167+
client.startClient();
168+
await httpBackend.flushAllExpected();
169+
170+
expect(fires).toBe(3);
171+
});
63172
});
64173

65174
describe("resolving invites to profile info", function() {

0 commit comments

Comments
 (0)