Merge pull request #28538 from element-hq/t3chguy/fix/20721

This commit is contained in:
Michael Telatynski 2024-12-02 11:23:18 +00:00 committed by GitHub
commit 00aadf1580
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 212 additions and 89 deletions

View file

@ -91,7 +91,7 @@ describe("RightPanel", () => {
if (name !== "RightPanel.phases") return realGetValue(name, roomId);
if (roomId === "r1") {
return {
history: [{ phase: RightPanelPhases.RoomMemberList }],
history: [{ phase: RightPanelPhases.MemberList }],
isOpen: true,
};
}
@ -123,7 +123,7 @@ describe("RightPanel", () => {
await rpsUpdated;
await waitFor(() => expect(screen.queryByTestId("spinner")).not.toBeInTheDocument());
// room one will be in the RoomMemberList phase - confirm this is rendered
// room one will be in the MemberList phase - confirm this is rendered
expect(container.getElementsByClassName("mx_MemberList")).toHaveLength(1);
// wait for RPS room 2 updates to fire, then rerender

View file

@ -75,6 +75,7 @@ import { ViewRoomErrorPayload } from "../../../../src/dispatcher/payloads/ViewRo
import { SearchScope } from "../../../../src/Searching";
import { MEGOLM_ENCRYPTION_ALGORITHM } from "../../../../src/utils/crypto";
import MatrixClientContext from "../../../../src/contexts/MatrixClientContext";
import { ViewUserPayload } from "../../../../src/dispatcher/payloads/ViewUserPayload.ts";
describe("RoomView", () => {
let cli: MockedObject<MatrixClient>;
@ -202,6 +203,21 @@ describe("RoomView", () => {
return ref.current!;
};
it("should show member list right panel phase on Action.ViewUser without `payload.member`", async () => {
const spy = jest.spyOn(stores.rightPanelStore, "showOrHidePhase");
await renderRoomView(false);
defaultDispatcher.dispatch<ViewUserPayload>(
{
action: Action.ViewUser,
member: undefined,
},
true,
);
expect(spy).toHaveBeenCalledWith(RightPanelPhases.MemberList);
});
it("when there is no room predecessor, getHiddenHighlightCount should return 0", async () => {
const instance = await getRoomViewInstance();
expect(instance.getHiddenHighlightCount()).toBe(0);

View file

@ -0,0 +1,117 @@
/*
Copyright 2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
import React from "react";
import { mocked, MockedObject } from "jest-mock";
import { MatrixClient, MatrixEvent, Room } from "matrix-js-sdk/src/matrix";
import { render, cleanup, screen, fireEvent } from "jest-matrix-react";
import { stubClient, mockPlatformPeg, unmockPlatformPeg, withClientContextRenderOptions } from "../../../test-utils";
import { RightPanelPhases } from "../../../../src/stores/right-panel/RightPanelStorePhases";
import SpaceRoomView from "../../../../src/components/structures/SpaceRoomView.tsx";
import ResizeNotifier from "../../../../src/utils/ResizeNotifier.ts";
import { RoomPermalinkCreator } from "../../../../src/utils/permalinks/Permalinks.ts";
import RightPanelStore from "../../../../src/stores/right-panel/RightPanelStore.ts";
import DMRoomMap from "../../../../src/utils/DMRoomMap.ts";
describe("SpaceRoomView", () => {
let cli: MockedObject<MatrixClient>;
let space: Room;
beforeEach(() => {
mockPlatformPeg({ reload: () => {} });
cli = mocked(stubClient());
space = new Room(`!space:example.org`, cli, cli.getSafeUserId());
space.currentState.setStateEvents([
new MatrixEvent({
type: "m.room.create",
room_id: space.roomId,
sender: cli.getSafeUserId(),
state_key: "",
content: {
creator: cli.getSafeUserId(),
type: "m.space",
},
}),
new MatrixEvent({
type: "m.room.member",
room_id: space.roomId,
sender: cli.getSafeUserId(),
state_key: cli.getSafeUserId(),
content: {
membership: "join",
},
}),
new MatrixEvent({
type: "m.room.member",
room_id: space.roomId,
sender: "@userA:server",
state_key: "@userA:server",
content: {
membership: "join",
},
}),
new MatrixEvent({
type: "m.room.member",
room_id: space.roomId,
sender: "@userB:server",
state_key: "@userB:server",
content: {
membership: "join",
},
}),
new MatrixEvent({
type: "m.room.member",
room_id: space.roomId,
sender: "@userC:server",
state_key: "@userC:server",
content: {
membership: "join",
},
}),
]);
space.updateMyMembership("join");
DMRoomMap.makeShared(cli);
});
afterEach(() => {
unmockPlatformPeg();
jest.clearAllMocks();
cleanup();
});
const renderSpaceRoomView = async (): Promise<ReturnType<typeof render>> => {
const resizeNotifier = new ResizeNotifier();
const permalinkCreator = new RoomPermalinkCreator(space);
const spaceRoomView = render(
<SpaceRoomView
space={space}
resizeNotifier={resizeNotifier}
permalinkCreator={permalinkCreator}
onJoinButtonClicked={jest.fn()}
onRejectButtonClicked={jest.fn()}
/>,
withClientContextRenderOptions(cli),
);
return spaceRoomView;
};
describe("SpaceLanding", () => {
it("should show member list right panel phase on members click on landing", async () => {
const spy = jest.spyOn(RightPanelStore.instance, "setCard");
const { container } = await renderSpaceRoomView();
await expect(screen.findByText("Welcome to")).resolves.toBeVisible();
fireEvent.click(container.querySelector(".mx_FacePile")!);
expect(spy).toHaveBeenCalledWith({ phase: RightPanelPhases.MemberList });
});
});
});

View file

@ -1302,7 +1302,7 @@ exports[`RoomView should not display the timeline when the room encryption is lo
aria-label="Open room settings"
aria-live="off"
class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61"
data-color="1"
data-color="2"
data-testid="avatar-img"
data-type="round"
role="button"
@ -1329,7 +1329,7 @@ exports[`RoomView should not display the timeline when the room encryption is lo
<span
class="mx_RoomHeader_truncated mx_lineClamp"
>
!5:example.org
!6:example.org
</span>
</div>
</div>
@ -1513,7 +1513,7 @@ exports[`RoomView should not display the timeline when the room encryption is lo
aria-label="Open room settings"
aria-live="off"
class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61"
data-color="1"
data-color="2"
data-testid="avatar-img"
data-type="round"
role="button"
@ -1540,7 +1540,7 @@ exports[`RoomView should not display the timeline when the room encryption is lo
<span
class="mx_RoomHeader_truncated mx_lineClamp"
>
!5:example.org
!6:example.org
</span>
</div>
</div>
@ -1897,7 +1897,7 @@ exports[`RoomView video rooms should render joined video room view 1`] = `
aria-label="Open room settings"
aria-live="off"
class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61"
data-color="5"
data-color="6"
data-testid="avatar-img"
data-type="round"
role="button"
@ -1924,7 +1924,7 @@ exports[`RoomView video rooms should render joined video room view 1`] = `
<span
class="mx_RoomHeader_truncated mx_lineClamp"
>
!12:example.org
!13:example.org
</span>
</div>
</div>

View file

@ -255,10 +255,7 @@ describe("<RoomSummaryCard />", () => {
fireEvent.click(getByText("People"));
expect(RightPanelStore.instance.pushCard).toHaveBeenCalledWith(
{ phase: RightPanelPhases.RoomMemberList },
true,
);
expect(RightPanelStore.instance.pushCard).toHaveBeenCalledWith({ phase: RightPanelPhases.MemberList }, true);
});
it("opens room threads list on button click", () => {

View file

@ -188,7 +188,7 @@ describe("<UserInfo />", () => {
const defaultProps = {
user: defaultUser,
// idk what is wrong with this type
phase: RightPanelPhases.RoomMemberInfo as RightPanelPhases.RoomMemberInfo,
phase: RightPanelPhases.MemberInfo as RightPanelPhases.MemberInfo,
onClose: jest.fn(),
};
@ -455,7 +455,7 @@ describe("<UserInfo />", () => {
mockCrypto.getUserVerificationStatus.mockResolvedValue(new UserVerificationStatus(false, false, false));
const { container } = renderComponent({
phase: RightPanelPhases.SpaceMemberInfo,
phase: RightPanelPhases.MemberInfo,
verificationRequest,
room: mockRoom,
});
@ -649,7 +649,7 @@ describe("<UserInfo />", () => {
mockClient.getDomain.mockReturnValue("example.com");
const { container } = renderComponent({
phase: RightPanelPhases.RoomMemberInfo,
phase: RightPanelPhases.MemberInfo,
room: mockRoom,
});

View file

@ -224,7 +224,7 @@ describe("<PinnedMessageBanner />", () => {
// The Right panel is opened on another card
jest.spyOn(RightPanelStore.instance, "isOpenForRoom").mockReturnValue(true);
jest.spyOn(RightPanelStore.instance, "currentCard", "get").mockReturnValue({
phase: RightPanelPhases.RoomMemberList,
phase: RightPanelPhases.MemberList,
});
renderBanner();

View file

@ -158,7 +158,7 @@ describe("RoomHeader", () => {
fireEvent.click(facePile);
expect(setCardSpy).toHaveBeenCalledWith({ phase: RightPanelPhases.RoomMemberList });
expect(setCardSpy).toHaveBeenCalledWith({ phase: RightPanelPhases.MemberList });
});
it("has room info icon that opens the room info panel", async () => {

View file

@ -18,6 +18,9 @@ import { ActiveRoomChangedPayload } from "../../../../src/dispatcher/payloads/Ac
import RightPanelStore from "../../../../src/stores/right-panel/RightPanelStore";
import { RightPanelPhases } from "../../../../src/stores/right-panel/RightPanelStorePhases";
import SettingsStore from "../../../../src/settings/SettingsStore";
import { pendingVerificationRequestForUser } from "../../../../src/verification.ts";
jest.mock("../../../../src/verification");
describe("RightPanelStore", () => {
// Mock out the settings store so the right panel store can't persist values between tests
@ -97,7 +100,7 @@ describe("RightPanelStore", () => {
it("does nothing if given an invalid state", async () => {
await viewRoom("!1:example.org");
// Needs a member specified to be valid
store.setCard({ phase: RightPanelPhases.RoomMemberInfo }, true, "!1:example.org");
store.setCard({ phase: RightPanelPhases.MemberInfo }, true, "!1:example.org");
expect(store.roomPhaseHistory).toEqual([]);
});
it("only creates a single history entry if given the same card twice", async () => {
@ -114,15 +117,15 @@ describe("RightPanelStore", () => {
it("overwrites history if changing the phase", async () => {
await viewRoom("!1:example.org");
store.setCard({ phase: RightPanelPhases.RoomSummary }, true, "!1:example.org");
store.setCard({ phase: RightPanelPhases.RoomMemberList }, true, "!1:example.org");
expect(store.roomPhaseHistory).toEqual([{ phase: RightPanelPhases.RoomMemberList, state: {} }]);
store.setCard({ phase: RightPanelPhases.MemberList }, true, "!1:example.org");
expect(store.roomPhaseHistory).toEqual([{ phase: RightPanelPhases.MemberList, state: {} }]);
});
});
describe("setCards", () => {
it("overwrites history", async () => {
await viewRoom("!1:example.org");
store.setCard({ phase: RightPanelPhases.RoomMemberList }, true, "!1:example.org");
store.setCard({ phase: RightPanelPhases.MemberList }, true, "!1:example.org");
store.setCards(
[{ phase: RightPanelPhases.RoomSummary }, { phase: RightPanelPhases.PinnedMessages }],
true,
@ -200,21 +203,40 @@ describe("RightPanelStore", () => {
store.setCards(
[
{
phase: RightPanelPhases.RoomMemberList,
phase: RightPanelPhases.MemberList,
},
{
phase: RightPanelPhases.RoomMemberInfo,
phase: RightPanelPhases.MemberInfo,
state: { member: new RoomMember("!1:example.org", "@alice:example.org") },
},
],
true,
"!1:example.org",
);
expect(store.currentCardForRoom("!1:example.org").phase).toEqual(RightPanelPhases.RoomMemberInfo);
expect(store.currentCardForRoom("!1:example.org").phase).toEqual(RightPanelPhases.MemberInfo);
// Switch away and back
await viewRoom("!2:example.org");
await viewRoom("!1:example.org");
expect(store.currentCardForRoom("!1:example.org").phase).toEqual(RightPanelPhases.RoomMemberList);
expect(store.currentCardForRoom("!1:example.org").phase).toEqual(RightPanelPhases.MemberList);
});
it("should redirect to verification if set to phase MemberInfo for a user with a pending verification", async () => {
const member = new RoomMember("!1:example.org", "@alice:example.org");
const verificationRequest = { mockVerificationRequest: true } as any;
mocked(pendingVerificationRequestForUser).mockReturnValue(verificationRequest);
await viewRoom("!1:example.org");
store.setCard(
{
phase: RightPanelPhases.MemberInfo,
state: { member },
},
true,
"!1:example.org",
);
expect(store.currentCard).toEqual({
phase: RightPanelPhases.EncryptionPanel,
state: { member, verificationRequest },
});
});
});

View file

@ -30,7 +30,7 @@ describe("onView3pidInvite()", () => {
};
onView3pidInvite(payload, rightPanelStore);
expect(rightPanelStore.showOrHidePhase).toHaveBeenCalledWith(RightPanelPhases.RoomMemberList);
expect(rightPanelStore.showOrHidePhase).toHaveBeenCalledWith(RightPanelPhases.MemberList);
expect(rightPanelStore.pushCard).not.toHaveBeenCalled();
});
@ -43,7 +43,7 @@ describe("onView3pidInvite()", () => {
expect(rightPanelStore.showOrHidePhase).not.toHaveBeenCalled();
expect(rightPanelStore.pushCard).toHaveBeenCalledWith({
phase: RightPanelPhases.Room3pidMemberInfo,
phase: RightPanelPhases.ThreePidMemberInfo,
state: { memberInfoEvent: payload.event },
});
});