diff --git a/spec/unit/room.spec.js b/spec/unit/room.spec.js index 793a6b5e7..6a4a8f598 100644 --- a/spec/unit/room.spec.js +++ b/spec/unit/room.spec.js @@ -1272,4 +1272,64 @@ describe("Room", function() { expect(callCount).toEqual(1); }); }); + + describe("setLazyLoadedMembers", function() { + it("should apply member info in promise", async function() { + const room = new Room(roomId); + expect(room.membersNeedLoading()).toEqual(true); + const infoA = {userId: userA, membership: "invite"}; + const infoB = {userId: userB, membership: "join"}; + const promise = room.setLazyLoadedMembers(Promise.resolve([infoA, infoB])); + await promise; + expect(room.membersNeedLoading()).toEqual(false); + const memberA = room.getMember(userA); + const memberB = room.getMember(userB); + expect(memberA.membership).toEqual("invite"); + expect(memberA.isLazyLoaded()).toEqual(true); + expect(memberB.membership).toEqual("join"); + expect(memberB.isLazyLoaded()).toEqual(true); + }); + + it("should revert needs loading on error", async function() { + const room = new Room(roomId); + let hasThrown = false; + try { + await room.setLazyLoadedMembers(Promise.reject(new Error("bugger"))); + } + catch(err) { + hasThrown = true; + } + expect(hasThrown).toEqual(true); + expect(room.membersNeedLoading()).toEqual(true); + }); + + it("should revert needs loading on error", async function() { + const room = new Room(roomId); + let hasThrown = false; + try { + await room.setLazyLoadedMembers(Promise.reject(new Error("bugger"))); + } + catch(err) { + hasThrown = true; + } + expect(hasThrown).toEqual(true); + expect(room.membersNeedLoading()).toEqual(true); + }); + + it("second call (also in immediate succession) should be ignored", async function() { + const room = new Room(roomId); + const promise1 = room.setLazyLoadedMembers(Promise.resolve([ + {userId: userA, membership: "join"}, + {userId: userB, membership: "join"} + ])); + const promise2 = room.setLazyLoadedMembers(Promise.resolve([ + {userId: userC, membership: "join"} + ])); + await Promise.all([promise1, promise2]); + expect(room.getMember(userA)).toBeTruthy(); + expect(room.getMember(userB)).toBeTruthy(); + expect(room.getMember(userC)).toBeFalsy(); + }); + + }); }); diff --git a/src/models/room.js b/src/models/room.js index a5cade4e6..ffda156cc 100644 --- a/src/models/room.js +++ b/src/models/room.js @@ -229,6 +229,9 @@ Room.prototype.membersNeedLoading = function() { * @param {Promise} membersPromise promise with array of {userId, avatarUrl, displayName, membership} tuples */ Room.prototype.setLazyLoadedMembers = async function(membersPromise) { + if (!this._membersNeedLoading) { + return; + } this._membersNeedLoading = false; let members = null; try {