diff --git a/lib/client.js b/lib/client.js index eef32f0f7..fa65ef005 100644 --- a/lib/client.js +++ b/lib/client.js @@ -2091,7 +2091,7 @@ function _pollForEvents(client) { }); Object.keys(roomIdsWithNewInvites).forEach(function(inviteRoomId) { - _resolveInvites(self.store.getRoom(inviteRoomId)); + _resolveInvites(self, self.store.getRoom(inviteRoomId)); }); } if (data) { @@ -2198,7 +2198,7 @@ function reEmit(reEmitEntity, emittableEntity, eventNames) { } function _resolveInvites(client, room) { - if (!room || !client.resolveInvitesToProfiles) { + if (!room || !client._config.resolveInvitesToProfiles) { return; } // For each invited room member we want to give them a displayname/avatar url diff --git a/spec/integ/matrix-client-syncing.spec.js b/spec/integ/matrix-client-syncing.spec.js index 6e85f0c36..b49e09ef9 100644 --- a/spec/integ/matrix-client-syncing.spec.js +++ b/spec/integ/matrix-client-syncing.spec.js @@ -10,6 +10,11 @@ describe("MatrixClient syncing", function() { var selfUserId = "@alice:localhost"; var selfAccessToken = "aseukfgwef"; var otherUserId = "@bob:localhost"; + var userA = "@alice:bar"; + var userB = "@bob:bar"; + var userC = "@claire:bar"; + var roomOne = "!foo:localhost"; + var roomTwo = "!bar:localhost"; beforeEach(function() { utils.beforeEach(this); @@ -65,10 +70,124 @@ describe("MatrixClient syncing", function() { }); }); + describe("resolving invites to profile info", function() { + 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({ + room: roomOne, user: otherUserId, msg: "hello" + }) + ] + }, + state: [ + utils.mkMembership({ + room: roomOne, mship: "join", user: otherUserId + }), + utils.mkMembership({ + room: roomOne, mship: "join", user: selfUserId + }), + utils.mkEvent({ + type: "m.room.create", room: roomOne, user: selfUserId, + content: { + creator: selfUserId + } + }) + ] + }] + }; + var eventData = { + start: "s_5_3", + end: "e_6_7", + chunk: [] + }; + + beforeEach(function() { + eventData.chunk = []; + }); + + it("should resolve incoming invites from /events", function(done) { + eventData.chunk = [ + utils.mkMembership({ + room: roomOne, mship: "invite", user: userC + }) + ]; + + httpBackend.when("GET", "/initialSync").respond(200, initialSync); + httpBackend.when("GET", "/events").respond(200, eventData); + httpBackend.when("GET", "/profile/" + encodeURIComponent(userC)).respond(200, { + avatar_url: "mxc://flibble/wibble", + displayname: "The Boss" + }); + + client.startClient({ + resolveInvitesToProfiles: true + }); + + httpBackend.flush().done(function() { + var member = client.getRoom(roomOne).getMember(userC); + expect(member.name).toEqual("The Boss"); + expect( + member.getAvatarUrl("home.server.url", null, null, null, false) + ).toBeDefined(); + done(); + }); + }); + + it("should use cached values from m.presence wherever possible", function(done) { + eventData.chunk = [ + utils.mkPresence({ + user: userC, presence: "online", name: "The Ghost" + }), + utils.mkMembership({ + room: roomOne, mship: "invite", user: userC + }) + ]; + + httpBackend.when("GET", "/initialSync").respond(200, initialSync); + httpBackend.when("GET", "/events").respond(200, eventData); + + client.startClient({ + resolveInvitesToProfiles: true + }); + + httpBackend.flush().done(function() { + var member = client.getRoom(roomOne).getMember(userC); + expect(member.name).toEqual("The Ghost"); + done(); + }); + }); + + it("should no-op if resolveInvitesToProfiles is not set", function(done) { + eventData.chunk = [ + utils.mkMembership({ + room: roomOne, mship: "invite", user: userC + }) + ]; + + httpBackend.when("GET", "/initialSync").respond(200, initialSync); + httpBackend.when("GET", "/events").respond(200, eventData); + + client.startClient(); + + httpBackend.flush().done(function() { + var member = client.getRoom(roomOne).getMember(userC); + expect(member.name).toEqual(userC); + expect( + member.getAvatarUrl("home.server.url", null, null, null, false) + ).toBeNull(); + done(); + }); + }); + }); + describe("users", function() { - var userA = "@alice:bar"; - var userB = "@bob:bar"; - var userC = "@claire:bar"; var initialSync = { end: "s_5_3", presence: [ @@ -113,8 +232,6 @@ describe("MatrixClient syncing", function() { }); describe("room state", function() { - var roomOne = "!foo:localhost"; - var roomTwo = "!bar:localhost"; var msgText = "some text here"; var otherDisplayName = "Bob Smith"; var initialSync = { @@ -272,7 +389,6 @@ describe("MatrixClient syncing", function() { }); describe("receipts", function() { - var roomOne = "!foo:localhost"; var initialSync = { end: "s_5_3", presence: [], diff --git a/spec/mock-request.js b/spec/mock-request.js index 4e10f6275..9a541b757 100644 --- a/spec/mock-request.js +++ b/spec/mock-request.js @@ -13,6 +13,7 @@ function HttpBackend() { this.requestFn = function(opts, callback) { var realReq = new Request(opts.method, opts.uri, opts.body, opts.qs); realReq.callback = callback; + console.log("HTTP backend received request: %s %s", opts.method, opts.uri); self.requests.push(realReq); }; }