From e5fbcf12e16c6db8d0bac83ae22ba8f66d5b4c75 Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Mon, 13 Feb 2023 15:36:39 +0100 Subject: [PATCH] Fix email lookup in invite dialog --- src/components/views/dialogs/InviteDialog.tsx | 5 +- .../views/dialogs/InviteDialog-test.tsx | 106 ++++++++++++------ 2 files changed, 75 insertions(+), 36 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index 4cb29c61d70c..da4e907cd793 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -684,7 +684,8 @@ export default class InviteDialog extends React.PureComponent t.userId === r.userId)} diff --git a/test/components/views/dialogs/InviteDialog-test.tsx b/test/components/views/dialogs/InviteDialog-test.tsx index dcc429f8cfca..9c0dcda498b0 100644 --- a/test/components/views/dialogs/InviteDialog-test.tsx +++ b/test/components/views/dialogs/InviteDialog-test.tsx @@ -17,11 +17,11 @@ limitations under the License. import React from "react"; import { render, screen } from "@testing-library/react"; import { RoomType } from "matrix-js-sdk/src/@types/event"; +import { Room } from "matrix-js-sdk/src/matrix"; import InviteDialog from "../../../../src/components/views/dialogs/InviteDialog"; -import { KIND_INVITE } from "../../../../src/components/views/dialogs/InviteDialogTypes"; -import { getMockClientWithEventEmitter, mkStubRoom } from "../../../test-utils"; -import { MatrixClientPeg } from "../../../../src/MatrixClientPeg"; +import { KIND_DM, KIND_INVITE } from "../../../../src/components/views/dialogs/InviteDialogTypes"; +import { getMockClientWithEventEmitter, mkMembership, mkMessage, mkRoomCreateEvent } from "../../../test-utils"; import DMRoomMap from "../../../../src/utils/DMRoomMap"; import SdkConfig from "../../../../src/SdkConfig"; import { ValidatedServerConfig } from "../../../../src/utils/ValidatedServerConfig"; @@ -37,8 +37,11 @@ jest.mock("../../../../src/IdentityAuthClient", () => describe("InviteDialog", () => { const roomId = "!111111111111111111:example.org"; const aliceId = "@alice:example.org"; + const aliceEmail = "foobar@email.com"; + const bobId = "@bob:example.org"; const mockClient = getMockClientWithEventEmitter({ - getUserId: jest.fn().mockReturnValue(aliceId), + getUserId: jest.fn().mockReturnValue(bobId), + getSafeUserId: jest.fn().mockReturnValue(bobId), isGuest: jest.fn().mockReturnValue(false), getVisibleRooms: jest.fn().mockReturnValue([]), getRoom: jest.fn(), @@ -58,27 +61,53 @@ describe("InviteDialog", () => { getOpenIdToken: jest.fn().mockResolvedValue({}), getIdentityAccount: jest.fn().mockResolvedValue({}), getTerms: jest.fn().mockResolvedValue({ policies: [] }), + supportsThreads: jest.fn().mockReturnValue(false), + isInitialSyncComplete: jest.fn().mockReturnValue(true), }); + let room: Room; beforeEach(() => { SdkConfig.put({ validated_server_config: {} as ValidatedServerConfig } as IConfigOptions); DMRoomMap.makeShared(); jest.clearAllMocks(); - mockClient.getUserId.mockReturnValue("@bob:example.org"); - - const room = mkStubRoom(roomId, "Room", mockClient); + mockClient.getUserId.mockReturnValue(bobId); + + room = new Room(roomId, mockClient, mockClient.getSafeUserId()); + room.addLiveEvents([ + mkMessage({ + msg: "Hello", + relatesTo: undefined, + event: true, + room: roomId, + user: mockClient.getSafeUserId(), + ts: Date.now(), + }), + ]); + room.currentState.setStateEvents([ + mkRoomCreateEvent(bobId, roomId), + mkMembership({ + event: true, + room: roomId, + mship: "join", + user: aliceId, + skey: aliceId, + }), + ]); + jest.spyOn(DMRoomMap.shared(), "getUniqueRoomsWithIndividuals").mockReturnValue({ + [aliceId]: room, + }); mockClient.getRooms.mockReturnValue([room]); mockClient.getRoom.mockReturnValue(room); }); afterAll(() => { - jest.spyOn(MatrixClientPeg, "get").mockRestore(); + jest.restoreAllMocks(); }); it("should label with space name", () => { - mockClient.getRoom(roomId).isSpaceRoom = jest.fn().mockReturnValue(true); - mockClient.getRoom(roomId).getType = jest.fn().mockReturnValue(RoomType.Space); - mockClient.getRoom(roomId).name = "Space"; + room.isSpaceRoom = jest.fn().mockReturnValue(true); + room.getType = jest.fn().mockReturnValue(RoomType.Space); + room.name = "Space"; render(); expect(screen.queryByText("Invite to Space")).toBeTruthy(); @@ -86,8 +115,7 @@ describe("InviteDialog", () => { it("should label with room name", () => { render(); - - expect(screen.queryByText("Invite to Room")).toBeTruthy(); + expect(screen.getByText(`Invite to ${roomId}`)).toBeInTheDocument(); }); it("should suggest valid MXIDs even if unknown", async () => { @@ -116,27 +144,37 @@ describe("InviteDialog", () => { expect(screen.queryByText("@localpart:server:tld")).toBeFalsy(); }); - it("should lookup inputs which look like email addresses", async () => { - mockClient.getIdentityServerUrl.mockReturnValue("https://identity-server"); - mockClient.lookupThreePid.mockResolvedValue({ - address: "foobar@email.com", - medium: "email", - mxid: "@foobar:server", - }); - mockClient.getProfileInfo.mockResolvedValue({ - displayname: "Mr. Foo", - avatar_url: "mxc://foo/bar", - }); - - render( - , - ); - - await screen.findByText("Mr. Foo"); - await screen.findByText("@foobar:server"); - expect(mockClient.lookupThreePid).toHaveBeenCalledWith("email", "foobar@email.com", expect.anything()); - expect(mockClient.getProfileInfo).toHaveBeenCalledWith("@foobar:server"); - }); + it.each([[KIND_DM], [KIND_INVITE]] as [typeof KIND_DM | typeof KIND_INVITE][])( + "should lookup inputs which look like email addresses (%s)", + async (kind: typeof KIND_DM | typeof KIND_INVITE) => { + mockClient.getIdentityServerUrl.mockReturnValue("https://identity-server"); + mockClient.lookupThreePid.mockResolvedValue({ + address: aliceEmail, + medium: "email", + mxid: aliceId, + }); + mockClient.getProfileInfo.mockResolvedValue({ + displayname: "Mrs Alice", + avatar_url: "mxc://foo/bar", + }); + + render( + , + ); + + await screen.findByText("Mrs Alice"); + // expect the email and MXID to be visible + await screen.findByText(aliceId); + await screen.findByText(aliceEmail); + expect(mockClient.lookupThreePid).toHaveBeenCalledWith("email", aliceEmail, expect.anything()); + expect(mockClient.getProfileInfo).toHaveBeenCalledWith(aliceId); + }, + ); it("should suggest e-mail even if lookup fails", async () => { mockClient.getIdentityServerUrl.mockReturnValue("https://identity-server");