From e08061474420d2cb9ac10213d14d693176205ba7 Mon Sep 17 00:00:00 2001 From: Andy Balaam Date: Fri, 3 Feb 2023 10:16:46 +0000 Subject: [PATCH] Pass the dynamic predecessor feature flag when listing rooms --- src/stores/room-list/RoomListStore.ts | 3 +- test/stores/room-list/RoomListStore-test.ts | 46 ++++++++++++++++++++- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts index 09d9cca2e4e8..c7f33bdca02c 100644 --- a/src/stores/room-list/RoomListStore.ts +++ b/src/stores/room-list/RoomListStore.ts @@ -496,7 +496,8 @@ export class RoomListStoreClass extends AsyncStoreWithClient implements private getPlausibleRooms(): Room[] { if (!this.matrixClient) return []; - let rooms = this.matrixClient.getVisibleRooms().filter((r) => VisibilityProvider.instance.isRoomVisible(r)); + let rooms = this.matrixClient.getVisibleRooms(SettingsStore.getValue("feature_dynamic_room_predecessors")); + rooms = rooms.filter((r) => VisibilityProvider.instance.isRoomVisible(r)); if (this.prefilterConditions.length > 0) { rooms = rooms.filter((r) => { diff --git a/test/stores/room-list/RoomListStore-test.ts b/test/stores/room-list/RoomListStore-test.ts index 8ce3dff22a3e..1fdbb63830fe 100644 --- a/test/stores/room-list/RoomListStore-test.ts +++ b/test/stores/room-list/RoomListStore-test.ts @@ -14,13 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { EventType, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; +import { EventType, MatrixEvent, PendingEventOrdering, Room } from "matrix-js-sdk/src/matrix"; import { MatrixDispatcher } from "../../../src/dispatcher/dispatcher"; import SettingsStore from "../../../src/settings/SettingsStore"; import { ListAlgorithm, SortAlgorithm } from "../../../src/stores/room-list/algorithms/models"; import { OrderedDefaultTagIDs, RoomUpdateCause } from "../../../src/stores/room-list/models"; import RoomListStore, { RoomListStoreClass } from "../../../src/stores/room-list/RoomListStore"; +import DMRoomMap from "../../../src/utils/DMRoomMap"; import { stubClient, upsertRoomStateEvents } from "../../test-utils"; describe("RoomListStore", () => { @@ -62,7 +63,9 @@ describe("RoomListStore", () => { upsertRoomStateEvents(roomWithPredecessorEvent, [predecessor]); const roomWithCreatePredecessor = new Room(newRoomId, client, userId, {}); upsertRoomStateEvents(roomWithCreatePredecessor, [createWithPredecessor]); - const roomNoPredecessor = new Room(roomNoPredecessorId, client, userId, {}); + const roomNoPredecessor = new Room(roomNoPredecessorId, client, userId, { + pendingEventOrdering: PendingEventOrdering.Detached, + }); upsertRoomStateEvents(roomNoPredecessor, [createNoPredecessor]); const oldRoom = new Room(oldRoomId, client, userId, {}); client.getRoom = jest.fn().mockImplementation((roomId) => { @@ -138,6 +141,31 @@ describe("RoomListStore", () => { expect(handleRoomUpdate).toHaveBeenCalledTimes(1); }); + it("Lists all rooms that the client says are visible", () => { + // Given 3 rooms that are visible according to the client + const room1 = new Room("!r1:e.com", client, userId, { pendingEventOrdering: PendingEventOrdering.Detached }); + const room2 = new Room("!r2:e.com", client, userId, { pendingEventOrdering: PendingEventOrdering.Detached }); + const room3 = new Room("!r3:e.com", client, userId, { pendingEventOrdering: PendingEventOrdering.Detached }); + room1.updateMyMembership("join"); + room2.updateMyMembership("join"); + room3.updateMyMembership("join"); + DMRoomMap.makeShared(); + const { store } = createStore(); + client.getVisibleRooms = jest.fn().mockReturnValue([room1, room2, room3]); + + // When we make the list of rooms + store.regenerateAllLists({ trigger: false }); + + // Then the list contains all 3 + expect(store.orderedLists).toMatchObject({ + "im.vector.fake.recent": [room1, room2, room3], + }); + + // We asked not to use MSC3946 when we asked the client for the visible rooms + expect(client.getVisibleRooms).toHaveBeenCalledWith(false); + expect(client.getVisibleRooms).toHaveBeenCalledTimes(1); + }); + describe("When feature_dynamic_room_predecessors = true", () => { beforeEach(() => { jest.spyOn(SettingsStore, "getValue").mockImplementation( @@ -168,5 +196,19 @@ describe("RoomListStore", () => { // And the new room is added expect(handleRoomUpdate).toHaveBeenCalledWith(roomWithPredecessorEvent, RoomUpdateCause.NewRoom); }); + + it("Passes the feature flag on to the client when asking for visible rooms", () => { + // Given a store that we can ask for a room list + DMRoomMap.makeShared(); + const { store } = createStore(); + client.getVisibleRooms = jest.fn().mockReturnValue([]); + + // When we make the list of rooms + store.regenerateAllLists({ trigger: false }); + + // We asked to use MSC3946 when we asked the client for the visible rooms + expect(client.getVisibleRooms).toHaveBeenCalledWith(true); + expect(client.getVisibleRooms).toHaveBeenCalledTimes(1); + }); }); });