Try to resolve emails before creating a DM (#10164)

This commit is contained in:
Michael Weimann 2023-02-16 14:17:43 +01:00 committed by GitHub
parent f0359a5c18
commit 8feed1a225
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 319 additions and 7 deletions

View file

@ -16,6 +16,7 @@ limitations under the License.
import { mocked } from "jest-mock";
import { ClientEvent, MatrixClient, Room } from "matrix-js-sdk/src/matrix";
import { logger } from "matrix-js-sdk/src/logger";
import DMRoomMap from "../../src/utils/DMRoomMap";
import { createTestClient } from "../test-utils";
@ -28,6 +29,8 @@ import { waitForRoomReadyAndApplyAfterCreateCallbacks } from "../../src/utils/lo
import { findDMRoom } from "../../src/utils/dm/findDMRoom";
import { createDmLocalRoom } from "../../src/utils/dm/createDmLocalRoom";
import { startDm } from "../../src/utils/dm/startDm";
import { Member } from "../../src/utils/direct-messages";
import { resolveThreePids } from "../../src/utils/threepids";
jest.mock("../../src/utils/rooms", () => ({
...(jest.requireActual("../../src/utils/rooms") as object),
@ -59,6 +62,12 @@ jest.mock("../../src/utils/dm/startDm", () => ({
startDm: jest.fn(),
}));
jest.mock("../../src/utils/threepids", () => ({
resolveThreePids: jest.fn().mockImplementation(async (members: Member[]) => {
return members;
}),
}));
describe("direct-messages", () => {
const userId1 = "@user1:example.com";
const member1 = new dmModule.DirectoryMember({ user_id: userId1 });
@ -69,8 +78,6 @@ describe("direct-messages", () => {
let roomEvents: Room[];
beforeEach(() => {
jest.restoreAllMocks();
mockClient = createTestClient();
jest.spyOn(MatrixClientPeg, "get").mockReturnValue(mockClient);
roomEvents = [];
@ -89,10 +96,17 @@ describe("direct-messages", () => {
} as unknown as DMRoomMap;
jest.spyOn(DMRoomMap, "shared").mockReturnValue(dmRoomMap);
jest.spyOn(dis, "dispatch");
jest.spyOn(logger, "warn");
jest.useFakeTimers();
jest.setSystemTime(new Date(2022, 7, 4, 11, 12, 30, 42));
});
afterEach(() => {
jest.restoreAllMocks();
jest.useRealTimers();
});
describe("startDmOnFirstMessage", () => {
describe("if no room exists", () => {
beforeEach(() => {
@ -101,7 +115,8 @@ describe("direct-messages", () => {
it("should create a local room and dispatch a view room event", async () => {
mocked(createDmLocalRoom).mockResolvedValue(localRoom);
const room = await dmModule.startDmOnFirstMessage(mockClient, [member1]);
const members = [member1];
const room = await dmModule.startDmOnFirstMessage(mockClient, members);
expect(room).toBe(localRoom);
expect(dis.dispatch).toHaveBeenCalledWith({
action: Action.ViewRoom,
@ -109,6 +124,25 @@ describe("direct-messages", () => {
joining: false,
targets: [member1],
});
// assert, that startDmOnFirstMessage tries to resolve 3rd-party IDs
expect(resolveThreePids).toHaveBeenCalledWith(members, mockClient);
});
it("should work when resolveThreePids raises an error", async () => {
const error = new Error("error 4711");
mocked(resolveThreePids).mockRejectedValue(error);
mocked(createDmLocalRoom).mockResolvedValue(localRoom);
const members = [member1];
const room = await dmModule.startDmOnFirstMessage(mockClient, members);
expect(room).toBe(localRoom);
// ensure that startDmOnFirstMessage tries to resolve 3rd-party IDs
expect(resolveThreePids).toHaveBeenCalledWith(members, mockClient);
// ensure that the error is logged
expect(logger.warn).toHaveBeenCalledWith("Error resolving 3rd-party members", error);
});
});