Files
element-web/test/unit-tests/stores/BreadcrumbsStore-test.ts
Michael Telatynski c05c429803 Absorb the matrix-react-sdk repository (#28192)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: github-merge-queue <github-merge-queue@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
Co-authored-by: Kim Brose <kim.brose@nordeck.net>
Co-authored-by: Florian Duros <florianduros@element.io>
Co-authored-by: R Midhun Suresh <hi@midhun.dev>
Co-authored-by: dbkr <986903+dbkr@users.noreply.github.com>
Co-authored-by: ElementRobot <releases@riot.im>
Co-authored-by: dbkr <dbkr@users.noreply.github.com>
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
Co-authored-by: David Langley <davidl@element.io>
Co-authored-by: Michael Weimann <michaelw@matrix.org>
Co-authored-by: Timshel <Timshel@users.noreply.github.com>
Co-authored-by: Sahil Silare <32628578+sahil9001@users.noreply.github.com>
Co-authored-by: Will Hunt <will@half-shot.uk>
Co-authored-by: Hubert Chathi <hubert@uhoreg.ca>
Co-authored-by: Andrew Ferrazzutti <andrewf@element.io>
Co-authored-by: Robin <robin@robin.town>
Co-authored-by: Tulir Asokan <tulir@maunium.net>
2024-10-16 13:31:55 +01:00

176 lines
6.5 KiB
TypeScript

/*
Copyright 2024 New Vector Ltd.
Copyright 2023 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
import { mocked } from "jest-mock";
import { MatrixClient, Room } from "matrix-js-sdk/src/matrix";
import { createTestClient, flushPromises, setupAsyncStoreWithClient } from "../../test-utils";
import SettingsStore from "../../../src/settings/SettingsStore";
import { BreadcrumbsStore } from "../../../src/stores/BreadcrumbsStore";
import { Action } from "../../../src/dispatcher/actions";
import { defaultDispatcher } from "../../../src/dispatcher/dispatcher";
describe("BreadcrumbsStore", () => {
let store: BreadcrumbsStore;
const client: MatrixClient = createTestClient();
beforeEach(() => {
jest.resetAllMocks();
store = BreadcrumbsStore.instance;
setupAsyncStoreWithClient(store, client);
jest.spyOn(SettingsStore, "setValue").mockImplementation(() => Promise.resolve());
jest.spyOn(SettingsStore, "getValue").mockReturnValue(false);
});
it("does not meet room requirements if there are not enough rooms", () => {
// We don't have enough rooms, so we don't meet requirements
mocked(client.getVisibleRooms).mockReturnValue(fakeRooms(2));
expect(store.meetsRoomRequirement).toBe(false);
});
it("meets room requirements if there are enough rooms", () => {
// We do have enough rooms to show breadcrumbs
mocked(client.getVisibleRooms).mockReturnValue(fakeRooms(25));
expect(store.meetsRoomRequirement).toBe(true);
});
describe("And the feature_dynamic_room_predecessors is enabled", () => {
beforeEach(() => {
// Turn on feature_dynamic_room_predecessors setting
jest.spyOn(SettingsStore, "getValue").mockImplementation(
(settingName) => settingName === "feature_dynamic_room_predecessors",
);
});
it("passes through the dynamic room precessors flag", () => {
mocked(client.getVisibleRooms).mockReturnValue(fakeRooms(25));
store.meetsRoomRequirement;
expect(client.getVisibleRooms).toHaveBeenCalledWith(true);
});
});
describe("And the feature_dynamic_room_predecessors is not enabled", () => {
it("passes through the dynamic room precessors flag", () => {
mocked(client.getVisibleRooms).mockReturnValue(fakeRooms(25));
store.meetsRoomRequirement;
expect(client.getVisibleRooms).toHaveBeenCalledWith(false);
});
});
describe("If the feature_dynamic_room_predecessors is not enabled", () => {
beforeEach(() => {
jest.spyOn(SettingsStore, "getValue").mockReturnValue(false);
});
it("Appends a room when you join", async () => {
// Sanity: no rooms initially
expect(store.rooms).toEqual([]);
// Given a room
const room = fakeRoom();
mocked(client.getRoom).mockReturnValue(room);
mocked(client.getRoomUpgradeHistory).mockReturnValue([]);
// When we hear that we have joined it
await dispatchJoinRoom(room.roomId);
// It is stored in the store's room list
expect(store.rooms.map((r) => r.roomId)).toEqual([room.roomId]);
});
it("Replaces the old room when a newer one joins", async () => {
// Given an old room and a new room
const oldRoom = fakeRoom();
const newRoom = fakeRoom();
mocked(client.getRoom).mockImplementation((roomId) => {
if (roomId === oldRoom.roomId) return oldRoom;
return newRoom;
});
// Where the new one is a predecessor of the old one
mocked(client.getRoomUpgradeHistory).mockReturnValue([oldRoom, newRoom]);
// When we hear that we joined the old room, then the new one
await dispatchJoinRoom(oldRoom.roomId);
await dispatchJoinRoom(newRoom.roomId);
// The store only has the new one
expect(store.rooms.map((r) => r.roomId)).toEqual([newRoom.roomId]);
});
it("Passes through the dynamic predecessor setting", async () => {
// Given a room
const room = fakeRoom();
mocked(client.getRoom).mockReturnValue(room);
mocked(client.getRoomUpgradeHistory).mockReturnValue([]);
// When we signal that we have joined
await dispatchJoinRoom(room.roomId);
// We pass the value of the dynamic predecessor setting through
expect(client.getRoomUpgradeHistory).toHaveBeenCalledWith(room.roomId, false, false);
});
});
describe("If the feature_dynamic_room_predecessors is enabled", () => {
beforeEach(() => {
// Turn on feature_dynamic_room_predecessors setting
jest.spyOn(SettingsStore, "getValue").mockImplementation(
(settingName) => settingName === "feature_dynamic_room_predecessors",
);
});
it("Passes through the dynamic predecessor setting", async () => {
// Given a room
const room = fakeRoom();
mocked(client.getRoom).mockReturnValue(room);
mocked(client.getRoomUpgradeHistory).mockReturnValue([]);
// When we signal that we have joined
await dispatchJoinRoom(room.roomId);
// We pass the value of the dynamic predecessor setting through
expect(client.getRoomUpgradeHistory).toHaveBeenCalledWith(room.roomId, false, true);
});
});
/**
* Send a JoinRoom event via the dispatcher, and wait for it to process.
*/
async function dispatchJoinRoom(roomId: string) {
defaultDispatcher.dispatch(
{
action: Action.JoinRoom,
roomId,
metricsTrigger: null,
},
true, // synchronous dispatch
);
// Wait for event dispatch to happen
await flushPromises();
}
/**
* Create as many fake rooms in an array as you ask for.
*/
function fakeRooms(howMany: number): Room[] {
const ret: Room[] = [];
for (let i = 0; i < howMany; i++) {
ret.push(fakeRoom());
}
return ret;
}
let roomIdx = 0;
function fakeRoom(): Room {
roomIdx++;
return new Room(`room${roomIdx}`, client, "@user:example.com");
}
});