Visit https://matrix.org/
https://matrix.org/\n\n", }, event: true, }); const wrapper = getComponent({ mxEvent: ev }, matrixClient); expect(wrapper.text()).toBe("Visit https://matrix.org/\n1https://matrix.org/\n\n"); const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toMatchSnapshot(); }); // If pills were rendered within a Portal/same shadow DOM then it'd be easier to test it("pills get injected correctly into the DOM", () => { const ev = mkEvent({ type: "m.room.message", room: "room_id", user: "sender", content: { body: "Hey User", msgtype: "m.text", format: "org.matrix.custom.html", formatted_body: "Hey Member", }, event: true, }); const wrapper = getComponent({ mxEvent: ev }, matrixClient); expect(wrapper.text()).toBe("Hey Member"); const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toMatchSnapshot(); }); it("pills do not appear in code blocks", () => { const ev = mkEvent({ type: "m.room.message", room: "room_id", user: "sender", content: { body: "`@room`\n```\n@room\n```", msgtype: "m.text", format: "org.matrix.custom.html", formatted_body: "
@room
@room\n\n",
                },
                event: true,
            });
            const wrapper = getComponent({ mxEvent: ev });
            expect(wrapper.text()).toBe("@room\n1@room\n\n");
            const content = wrapper.find(".mx_EventTile_body");
            expect(content.html()).toMatchSnapshot();
        });
        it("pills do not appear for event permalinks", () => {
            const ev = mkEvent({
                type: "m.room.message",
                room: "room_id",
                user: "sender",
                content: {
                    body:
                        "An [event link](https://matrix.to/#/!ZxbRYPQXDXKGmDnJNg:example.com/" +
                        "$16085560162aNpaH:example.com?via=example.com) with text",
                    msgtype: "m.text",
                    format: "org.matrix.custom.html",
                    formatted_body:
                        "An event link with text",
                },
                event: true,
            });
            const wrapper = getComponent({ mxEvent: ev }, matrixClient);
            expect(wrapper.text()).toBe("An event link with text");
            const content = wrapper.find(".mx_EventTile_body");
            expect(content.html()).toBe(
                '' +
                'An event link with text',
            );
        });
        it("pills appear for room links with vias", () => {
            const ev = mkEvent({
                type: "m.room.message",
                room: "room_id",
                user: "sender",
                content: {
                    body:
                        "A [room link](https://matrix.to/#/!ZxbRYPQXDXKGmDnJNg:example.com" +
                        "?via=example.com&via=bob.com) with vias",
                    msgtype: "m.text",
                    format: "org.matrix.custom.html",
                    formatted_body:
                        "A room link with vias",
                },
                event: true,
            });
            const wrapper = getComponent({ mxEvent: ev }, matrixClient);
            expect(wrapper.text()).toBe("A room name with vias");
            const content = wrapper.find(".mx_EventTile_body");
            expect(content.html()).toBe(
                '' +
                'A ' +
                'room name with vias',
            );
        });
        it('renders formatted body without html corretly', () => {
            const ev = mkEvent({
                type: "m.room.message",
                room: "room_id",
                user: "sender",
                content: {
                    body: "escaped \\*markdown\\*",
                    msgtype: "m.text",
                    format: "org.matrix.custom.html",
                    formatted_body: "escaped *markdown*",
                },
                event: true,
            });
            const wrapper = getComponent({ mxEvent: ev }, matrixClient);
            const content = wrapper.find(".mx_EventTile_body");
            expect(content.html()).toBe(
                '' +
                'escaped *markdown*' +
                '',
            );
        });
    });
    it("renders url previews correctly", () => {
        languageHandler.setMissingEntryGenerator(key => key.split('|', 2)[1]);
        const matrixClient = getMockClientWithEventEmitter({
            getRoom: () => mkStubRoom("room_id", "room name", undefined),
            getAccountData: () => undefined,
            getUrlPreview: (url) => new Promise(() => {}),
            isGuest: () => false,
            mxcUrlToHttp: (s) => s,
        });
        DMRoomMap.makeShared();
        const ev = mkEvent({
            type: "m.room.message",
            room: "room_id",
            user: "sender",
            content: {
                body: "Visit https://matrix.org/",
                msgtype: "m.text",
            },
            event: true,
        });
        const wrapper = getComponent({ mxEvent: ev, showUrlPreview: true, onHeightChanged: jest.fn() }, matrixClient);
        expect(wrapper.text()).toBe(ev.getContent().body);
        let widgets = wrapper.find("LinkPreviewGroup");
        // at this point we should have exactly one link
        expect(widgets.at(0).prop("links")).toEqual(["https://matrix.org/"]);
        // simulate an event edit and check the transition from the old URL preview to the new one
        const ev2 = mkEvent({
            type: "m.room.message",
            room: "room_id",
            user: "sender",
            content: {
                "m.new_content": {
                    body: "Visit https://vector.im/ and https://riot.im/",
                    msgtype: "m.text",
                },
            },
            event: true,
        });
        jest.spyOn(ev, 'replacingEventDate').mockReturnValue(new Date(1993, 7, 3));
        ev.makeReplaced(ev2);
        wrapper.setProps({
            mxEvent: ev,
            replacingEventId: ev.getId(),
        }, () => {
            expect(wrapper.text()).toBe(ev2.getContent()["m.new_content"].body + "(edited)");
            // XXX: this is to give TextualBody enough time for state to settle
            wrapper.setState({}, () => {
                widgets = wrapper.find("LinkPreviewGroup");
                // at this point we should have exactly two links (not the matrix.org one anymore)
                expect(widgets.at(0).prop("links")).toEqual(["https://vector.im/", "https://riot.im/"]);
            });
        });
    });
});