108 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
/*
 | 
						|
Copyright 2024 New Vector Ltd.
 | 
						|
Copyright 2022 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 { EventType, KNOWN_SAFE_ROOM_VERSION, MatrixClient } from "matrix-js-sdk/src/matrix";
 | 
						|
import { KnownMembership } from "matrix-js-sdk/src/types";
 | 
						|
 | 
						|
import { canEncryptToAllUsers } from "../../../../src/createRoom";
 | 
						|
import { LocalRoom, LOCAL_ROOM_ID_PREFIX } from "../../../../src/models/LocalRoom";
 | 
						|
import { DirectoryMember, Member, ThreepidMember } from "../../../../src/utils/direct-messages";
 | 
						|
import { createDmLocalRoom } from "../../../../src/utils/dm/createDmLocalRoom";
 | 
						|
import { privateShouldBeEncrypted } from "../../../../src/utils/rooms";
 | 
						|
import { createTestClient } from "../../../test-utils";
 | 
						|
 | 
						|
jest.mock("../../../../src/utils/rooms", () => ({
 | 
						|
    privateShouldBeEncrypted: jest.fn(),
 | 
						|
}));
 | 
						|
 | 
						|
jest.mock("../../../../src/createRoom", () => ({
 | 
						|
    canEncryptToAllUsers: jest.fn(),
 | 
						|
}));
 | 
						|
 | 
						|
function assertLocalRoom(room: LocalRoom, targets: Member[], encrypted: boolean) {
 | 
						|
    expect(room.roomId).toBe(LOCAL_ROOM_ID_PREFIX + "t1");
 | 
						|
    expect(room.name).toBe(targets.length ? targets[0].name : "Empty Room");
 | 
						|
    expect(room.encrypted).toBe(encrypted);
 | 
						|
    expect(room.targets).toEqual(targets);
 | 
						|
    expect(room.getMyMembership()).toBe(KnownMembership.Join);
 | 
						|
 | 
						|
    const roomCreateEvent = room.currentState.getStateEvents(EventType.RoomCreate)[0];
 | 
						|
    expect(roomCreateEvent).toBeDefined();
 | 
						|
    expect(roomCreateEvent.getContent()["room_version"]).toBe(KNOWN_SAFE_ROOM_VERSION);
 | 
						|
 | 
						|
    // check that the user and all targets are joined
 | 
						|
    expect(room.getMember("@userId:matrix.org")?.membership).toBe(KnownMembership.Join);
 | 
						|
    targets.forEach((target: Member) => {
 | 
						|
        expect(room.getMember(target.userId)?.membership).toBe(KnownMembership.Join);
 | 
						|
    });
 | 
						|
 | 
						|
    if (encrypted) {
 | 
						|
        const encryptionEvent = room.currentState.getStateEvents(EventType.RoomEncryption)[0];
 | 
						|
        expect(encryptionEvent).toBeDefined();
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
describe("createDmLocalRoom", () => {
 | 
						|
    let mockClient: MatrixClient;
 | 
						|
    const userId1 = "@user1:example.com";
 | 
						|
    const member1 = new DirectoryMember({ user_id: userId1 });
 | 
						|
    const member2 = new ThreepidMember("user2");
 | 
						|
 | 
						|
    beforeEach(() => {
 | 
						|
        mockClient = createTestClient();
 | 
						|
    });
 | 
						|
 | 
						|
    describe("when rooms should be encrypted", () => {
 | 
						|
        beforeEach(() => {
 | 
						|
            mocked(privateShouldBeEncrypted).mockReturnValue(true);
 | 
						|
        });
 | 
						|
 | 
						|
        it("should create an encrytped room for 3PID targets", async () => {
 | 
						|
            const room = await createDmLocalRoom(mockClient, [member2]);
 | 
						|
            expect(mockClient.store.storeRoom).toHaveBeenCalledWith(room);
 | 
						|
            assertLocalRoom(room, [member2], true);
 | 
						|
        });
 | 
						|
 | 
						|
        describe("for MXID targets with encryption available", () => {
 | 
						|
            beforeEach(() => {
 | 
						|
                mocked(canEncryptToAllUsers).mockResolvedValue(true);
 | 
						|
            });
 | 
						|
 | 
						|
            it("should create an encrypted room", async () => {
 | 
						|
                const room = await createDmLocalRoom(mockClient, [member1]);
 | 
						|
                expect(mockClient.store.storeRoom).toHaveBeenCalledWith(room);
 | 
						|
                assertLocalRoom(room, [member1], true);
 | 
						|
            });
 | 
						|
        });
 | 
						|
 | 
						|
        describe("for MXID targets with encryption unavailable", () => {
 | 
						|
            beforeEach(() => {
 | 
						|
                mocked(canEncryptToAllUsers).mockResolvedValue(false);
 | 
						|
            });
 | 
						|
 | 
						|
            it("should create an unencrypted room", async () => {
 | 
						|
                const room = await createDmLocalRoom(mockClient, [member1]);
 | 
						|
                expect(mockClient.store.storeRoom).toHaveBeenCalledWith(room);
 | 
						|
                assertLocalRoom(room, [member1], false);
 | 
						|
            });
 | 
						|
        });
 | 
						|
    });
 | 
						|
 | 
						|
    describe("if rooms should not be encrypted", () => {
 | 
						|
        beforeEach(() => {
 | 
						|
            mocked(privateShouldBeEncrypted).mockReturnValue(false);
 | 
						|
        });
 | 
						|
 | 
						|
        it("should create an unencrypted room", async () => {
 | 
						|
            const room = await createDmLocalRoom(mockClient, [member1]);
 | 
						|
            assertLocalRoom(room, [member1], false);
 | 
						|
        });
 | 
						|
    });
 | 
						|
});
 |