/* Copyright 2024 New Vector Ltd. Copyright 2023 Mikhail Aheichyk Copyright 2023 Nordeck IT + Consulting GmbH. 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 { render, screen } from "@testing-library/react"; import React, { ComponentProps } from "react"; import { mocked } from "jest-mock"; import { MatrixClient, PendingEventOrdering, Room } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; import MatrixClientContext from "../../../../src/contexts/MatrixClientContext"; import RoomContextMenu from "../../../../src/components/views/context_menus/RoomContextMenu"; import { shouldShowComponent } from "../../../../src/customisations/helpers/UIComponents"; import { stubClient } from "../../../test-utils"; import { MatrixClientPeg } from "../../../../src/MatrixClientPeg"; import DMRoomMap from "../../../../src/utils/DMRoomMap"; import SettingsStore from "../../../../src/settings/SettingsStore"; import { EchoChamber } from "../../../../src/stores/local-echo/EchoChamber"; import { RoomNotifState } from "../../../../src/RoomNotifs"; jest.mock("../../../../src/customisations/helpers/UIComponents", () => ({ shouldShowComponent: jest.fn(), })); describe("RoomContextMenu", () => { const ROOM_ID = "!123:matrix.org"; let room: Room; let mockClient: MatrixClient; let onFinished: () => void; beforeEach(() => { jest.clearAllMocks(); stubClient(); mockClient = mocked(MatrixClientPeg.safeGet()); room = new Room(ROOM_ID, mockClient, mockClient.getUserId() ?? "", { pendingEventOrdering: PendingEventOrdering.Detached, }); const dmRoomMap = { getUserIdForRoomId: jest.fn(), } as unknown as DMRoomMap; DMRoomMap.setShared(dmRoomMap); onFinished = jest.fn(); }); function renderComponent(props: Partial> = {}) { render( , ); } it("does not render invite menu item when UIComponent customisations disable invite", () => { jest.spyOn(room, "canInvite").mockReturnValue(true); mocked(shouldShowComponent).mockReturnValue(false); renderComponent(); expect(screen.queryByRole("menuitem", { name: "Invite" })).not.toBeInTheDocument(); }); it("renders invite menu item when UIComponent customisations enable invite", () => { jest.spyOn(room, "canInvite").mockReturnValue(true); mocked(shouldShowComponent).mockReturnValue(true); renderComponent(); expect(screen.getByRole("menuitem", { name: "Invite" })).toBeInTheDocument(); }); it("when developer mode is disabled, it should not render the developer tools option", () => { renderComponent(); expect(screen.queryByText("Developer tools")).not.toBeInTheDocument(); }); describe("when developer mode is enabled", () => { beforeEach(() => { jest.spyOn(SettingsStore, "getValue").mockImplementation((setting) => setting === "developerMode"); }); it("should render the developer tools option", () => { renderComponent(); expect(screen.getByText("Developer tools")).toBeInTheDocument(); }); }); it("should render notification option for joined rooms", () => { const chamber = EchoChamber.forRoom(room); chamber.notificationVolume = RoomNotifState.Mute; jest.spyOn(room, "getMyMembership").mockReturnValue(KnownMembership.Join); renderComponent(); expect( screen.getByRole("menuitem", { name: "Notifications" }).querySelector(".mx_IconizedContextMenu_sublabel"), ).toHaveTextContent("Mute"); }); });