You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-08-22 15:12:49 +03:00
440 lines
16 KiB
JavaScript
440 lines
16 KiB
JavaScript
"use strict";
|
|
var sdk = require("../..");
|
|
var HttpBackend = require("../mock-request");
|
|
var utils = require("../test-utils");
|
|
|
|
describe("MatrixClient", function() {
|
|
var baseUrl = "http://localhost.or.something";
|
|
var client, httpBackend;
|
|
var selfUserId = "@alice:localhost";
|
|
var selfAccessToken = "aseukfgwef";
|
|
var otherUserId = "@bob:localhost";
|
|
|
|
beforeEach(function() {
|
|
utils.beforeEach(this);
|
|
httpBackend = new HttpBackend();
|
|
sdk.request(httpBackend.requestFn);
|
|
client = sdk.createClient({
|
|
baseUrl: baseUrl,
|
|
userId: selfUserId,
|
|
accessToken: selfAccessToken
|
|
});
|
|
});
|
|
|
|
afterEach(function() {
|
|
httpBackend.verifyNoOutstandingExpectation();
|
|
});
|
|
|
|
describe("startClient", function() {
|
|
var initialSync = {
|
|
end: "s_5_3",
|
|
presence: [],
|
|
rooms: []
|
|
};
|
|
var eventData = {
|
|
start: "s_5_3",
|
|
end: "e_6_7",
|
|
chunk: []
|
|
};
|
|
|
|
it("should start with /initialSync then move onto /events.", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should pass the 'end' token from /initialSync to the from= param " +
|
|
" of /events", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").check(function(req) {
|
|
expect(req.queryParams.from).toEqual(initialSync.end);
|
|
}).respond(200, eventData);
|
|
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("EventEmitter", function() {
|
|
var initialSync = {
|
|
end: "s_5_3",
|
|
presence: [{
|
|
event_id: "$wefiuewh:bar",
|
|
type: "m.presence",
|
|
content: {
|
|
user_id: "@foo:bar",
|
|
displayname: "Foo Bar",
|
|
presence: "online"
|
|
}
|
|
}],
|
|
rooms: [{
|
|
room_id: "!erufh:bar",
|
|
membership: "join",
|
|
messages: {
|
|
start: "s",
|
|
end: "t",
|
|
chunk: [
|
|
utils.mkMessage("!erufh:bar", "@foo:bar", "hmmm")
|
|
]
|
|
},
|
|
state: [
|
|
utils.mkMembership("!erufh:bar", "join", "@foo:bar"),
|
|
utils.mkEvent("m.room.create", "!erufh:bar", "@foo:bar", {
|
|
creator: "@foo:bar"
|
|
})
|
|
]
|
|
}]
|
|
};
|
|
var eventData = {
|
|
start: "s_5_3",
|
|
end: "e_6_7",
|
|
chunk: [
|
|
utils.mkMessage("!erufh:bar", "@foo:bar", "ello ello"),
|
|
utils.mkMessage("!erufh:bar", "@foo:bar", ":D"),
|
|
utils.mkEvent("m.typing", "!erufh:bar", "bar", {
|
|
user_ids: ["@foo:bar"]
|
|
})
|
|
]
|
|
};
|
|
|
|
it("should emit events from both /initialSync and /events", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
|
|
// initial sync events are unordered, so make an array of the types
|
|
// that should be emitted and we'll just pick them off one by one,
|
|
// so long as this is emptied we're good.
|
|
var initialSyncEventTypes = [
|
|
"m.presence", "m.room.member", "m.room.message", "m.room.create"
|
|
];
|
|
var chunkIndex = 0;
|
|
client.on("event", function(event) {
|
|
if (initialSyncEventTypes.length === 0) {
|
|
if (chunkIndex + 1 >= eventData.chunk.length) {
|
|
return;
|
|
}
|
|
// this should be /events now
|
|
expect(eventData.chunk[chunkIndex].event_id).toEqual(
|
|
event.getId()
|
|
);
|
|
chunkIndex++;
|
|
return;
|
|
}
|
|
var index = initialSyncEventTypes.indexOf(event.getType());
|
|
expect(index).not.toEqual(
|
|
-1, "Unexpected event type: " + event.getType()
|
|
);
|
|
if (index >= 0) {
|
|
initialSyncEventTypes.splice(index, 1);
|
|
}
|
|
});
|
|
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
expect(initialSyncEventTypes.length).toEqual(
|
|
0, "Failed to see all events from /initialSync"
|
|
);
|
|
expect(chunkIndex + 1).toEqual(
|
|
eventData.chunk.length, "Failed to see all events from /events"
|
|
);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should emit User events", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
var fired = false;
|
|
client.on("User.presence", function(event, user) {
|
|
fired = true;
|
|
console.log("handle");
|
|
expect(user).toBeDefined();
|
|
expect(event).toBeDefined();
|
|
if (!user || !event) { return; }
|
|
|
|
expect(event.event).toEqual(initialSync.presence[0]);
|
|
expect(user.presence).toEqual(
|
|
initialSync.presence[0].content.presence
|
|
);
|
|
});
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
expect(fired).toBe(true, "User.presence didn't fire.");
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should emit Room events", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
var roomInvokeCount = 0;
|
|
var roomNameInvokeCount = 0;
|
|
var timelineFireCount = 0;
|
|
client.on("Room", function(room) {
|
|
roomInvokeCount++;
|
|
expect(room.roomId).toEqual("!erufh:bar");
|
|
});
|
|
client.on("Room.timeline", function(event, room) {
|
|
timelineFireCount++;
|
|
expect(room.roomId).toEqual("!erufh:bar");
|
|
});
|
|
client.on("Room.name", function(room) {
|
|
roomNameInvokeCount++;
|
|
});
|
|
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
expect(roomInvokeCount).toEqual(
|
|
1, "Room fired wrong number of times."
|
|
);
|
|
expect(roomNameInvokeCount).toEqual(
|
|
1, "Room.name fired wrong number of times."
|
|
);
|
|
expect(timelineFireCount).toEqual(
|
|
3, "Room.timeline fired the wrong number of times"
|
|
);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should emit RoomState events", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
|
|
var roomStateEventTypes = [
|
|
"m.room.member", "m.room.create"
|
|
];
|
|
var eventsInvokeCount = 0;
|
|
var membersInvokeCount = 0;
|
|
var newMemberInvokeCount = 0;
|
|
client.on("RoomState.events", function(event, state) {
|
|
eventsInvokeCount++;
|
|
var index = roomStateEventTypes.indexOf(event.getType());
|
|
expect(index).not.toEqual(
|
|
-1, "Unexpected room state event type: " + event.getType()
|
|
);
|
|
if (index >= 0) {
|
|
roomStateEventTypes.splice(index, 1);
|
|
}
|
|
});
|
|
client.on("RoomState.members", function(event, state, member) {
|
|
membersInvokeCount++;
|
|
expect(member.roomId).toEqual("!erufh:bar");
|
|
expect(member.userId).toEqual("@foo:bar");
|
|
expect(member.membership).toEqual("join");
|
|
});
|
|
client.on("RoomState.newMember", function(event, state, member) {
|
|
newMemberInvokeCount++;
|
|
expect(member.roomId).toEqual("!erufh:bar");
|
|
expect(member.userId).toEqual("@foo:bar");
|
|
expect(member.membership).toBeFalsy();
|
|
});
|
|
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
expect(membersInvokeCount).toEqual(
|
|
1, "RoomState.members fired wrong number of times"
|
|
);
|
|
expect(newMemberInvokeCount).toEqual(
|
|
1, "RoomState.newMember fired wrong number of times"
|
|
);
|
|
expect(eventsInvokeCount).toEqual(
|
|
2, "RoomState.events fired wrong number of times"
|
|
);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should emit RoomMember events", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
|
|
var typingInvokeCount = 0;
|
|
var powerLevelInvokeCount = 0;
|
|
var nameInvokeCount = 0;
|
|
var membershipInvokeCount = 0;
|
|
client.on("RoomMember.name", function(event, member) {
|
|
nameInvokeCount++;
|
|
});
|
|
client.on("RoomMember.typing", function(event, member) {
|
|
typingInvokeCount++;
|
|
expect(member.typing).toBe(true);
|
|
});
|
|
client.on("RoomMember.powerLevel", function(event, member) {
|
|
powerLevelInvokeCount++;
|
|
});
|
|
client.on("RoomMember.membership", function(event, member) {
|
|
membershipInvokeCount++;
|
|
expect(member.membership).toEqual("join");
|
|
});
|
|
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
expect(typingInvokeCount).toEqual(
|
|
1, "RoomMember.typing fired wrong number of times"
|
|
);
|
|
expect(powerLevelInvokeCount).toEqual(
|
|
0, "RoomMember.powerLevel fired wrong number of times"
|
|
);
|
|
expect(nameInvokeCount).toEqual(
|
|
0, "RoomMember.name fired wrong number of times"
|
|
);
|
|
expect(membershipInvokeCount).toEqual(
|
|
1, "RoomMember.membership fired wrong number of times"
|
|
);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("room state", function() {
|
|
var roomOne = "!foo:localhost";
|
|
var roomTwo = "!bar:localhost";
|
|
var msgText = "some text here";
|
|
var otherDisplayName = "Bob Smith";
|
|
var initialSync = {
|
|
end: "s_5_3",
|
|
presence: [],
|
|
rooms: [
|
|
{
|
|
membership: "join",
|
|
room_id: roomOne,
|
|
messages: {
|
|
start: "f_1_1",
|
|
end: "f_2_2",
|
|
chunk: [
|
|
utils.mkMessage(roomOne, otherUserId, "hello")
|
|
]
|
|
},
|
|
state: [
|
|
utils.mkEvent(
|
|
"m.room.name", roomOne, otherUserId,
|
|
{
|
|
name: "Old room name"
|
|
}
|
|
),
|
|
utils.mkMembership(roomOne, "join", otherUserId),
|
|
utils.mkMembership(roomOne, "join", selfUserId),
|
|
utils.mkEvent(
|
|
"m.room.create", roomOne, selfUserId,
|
|
{
|
|
creator: selfUserId
|
|
}
|
|
)
|
|
]
|
|
},
|
|
{
|
|
membership: "join",
|
|
room_id: roomTwo,
|
|
messages: {
|
|
start: "f_1_1",
|
|
end: "f_2_2",
|
|
chunk: [
|
|
utils.mkMessage(roomTwo, otherUserId, "hiii")
|
|
]
|
|
},
|
|
state: [
|
|
utils.mkMembership(
|
|
roomTwo, "join", otherUserId, null, otherDisplayName
|
|
),
|
|
utils.mkMembership(roomTwo, "join", selfUserId),
|
|
utils.mkEvent(
|
|
"m.room.create", roomTwo, selfUserId,
|
|
{
|
|
creator: selfUserId
|
|
}
|
|
)
|
|
]
|
|
}
|
|
]
|
|
};
|
|
var eventData = {
|
|
start: "s_5_3",
|
|
end: "e_6_7",
|
|
chunk: [
|
|
utils.mkEvent("m.room.name", roomOne, selfUserId, {
|
|
name: "A new room name"
|
|
}),
|
|
utils.mkMessage(roomTwo, otherUserId, msgText),
|
|
utils.mkEvent("m.typing", roomTwo, undefined, {
|
|
user_ids: [otherUserId]
|
|
})
|
|
]
|
|
};
|
|
|
|
it("should continually recalculate the right room name.", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
var room = client.getRoom(roomOne);
|
|
// should have clobbered the name to the one from /events
|
|
expect(room.name).toEqual(eventData.chunk[0].content.name);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should store the right events in the timeline.", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
var room = client.getRoom(roomTwo);
|
|
// should have added the message from /events
|
|
expect(room.timeline.length).toEqual(2);
|
|
expect(room.timeline[1].getContent().body).toEqual(msgText);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should set the right room name.", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
|
|
client.startClient();
|
|
httpBackend.flush().done(function() {
|
|
var room = client.getRoom(roomTwo);
|
|
// should use the display name of the other person.
|
|
expect(room.name).toEqual(otherDisplayName);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should set the right user's typing flag.", function(done) {
|
|
httpBackend.when("GET", "/initialSync").respond(200, initialSync);
|
|
httpBackend.when("GET", "/events").respond(200, eventData);
|
|
|
|
client.startClient();
|
|
|
|
httpBackend.flush().done(function() {
|
|
var room = client.getRoom(roomTwo);
|
|
var member = room.getMember(otherUserId);
|
|
expect(member).toBeDefined();
|
|
expect(member.typing).toEqual(true);
|
|
member = room.getMember(selfUserId);
|
|
expect(member).toBeDefined();
|
|
expect(member.typing).toEqual(false);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
});
|