import React from "react"; import expect from 'expect'; import Adapter from "enzyme-adapter-react-16"; import { configure, mount } from "enzyme"; import sdk from "../../../skinned-sdk"; import {mkEvent, mkStubRoom} from "../../../test-utils"; import MatrixClientPeg from "../../../../src/MatrixClientPeg"; import * as languageHandler from "../../../../src/languageHandler"; import {sleep} from "../../../../src/utils/promise"; const TextualBody = sdk.getComponent("views.messages.TextualBody"); configure({ adapter: new Adapter() }); describe("", () => { afterEach(() => { MatrixClientPeg.matrixClient = null; }); describe("renders m.emote correctly", () => { MatrixClientPeg.matrixClient = { getRoom: () => mkStubRoom("room_id"), getAccountData: () => undefined, }; const ev = mkEvent({ type: "m.room.message", room: "room_id", user: "sender", content: { body: "winks", msgtype: "m.emote", }, event: true, }); const wrapper = mount(); expect(wrapper.text()).toBe("* sender winks"); const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe('winks'); }); describe("renders m.notice correctly", () => { MatrixClientPeg.matrixClient = { getRoom: () => mkStubRoom("room_id"), getAccountData: () => undefined, }; const ev = mkEvent({ type: "m.room.message", room: "room_id", user: "bot_sender", content: { body: "this is a notice, probably from a bot", msgtype: "m.notice", }, event: true, }); const wrapper = mount(); expect(wrapper.text()).toBe(ev.getContent().body); const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe(`${ ev.getContent().body }`); }); describe("renders plain-text m.text correctly", () => { MatrixClientPeg.matrixClient = { getRoom: () => mkStubRoom("room_id"), getAccountData: () => undefined, }; describe("simple message renders as expected", () => { const ev = mkEvent({ type: "m.room.message", room: "room_id", user: "sender", content: { body: "this is a plaintext message", msgtype: "m.text", }, event: true, }); const wrapper = mount(); expect(wrapper.text()).toBe(ev.getContent().body); const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe(`${ ev.getContent().body }`); }); // If pills were rendered within a Portal/same shadow DOM then it'd be easier to test describe("linkification get applied correctly into the DOM", () => { 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 = mount(); expect(wrapper.text()).toBe(ev.getContent().body); const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe('' + 'Visit ' + 'https://matrix.org/'); }); }); describe("renders formatted m.text correctly", () => { MatrixClientPeg.matrixClient = { getRoom: () => mkStubRoom("room_id"), getAccountData: () => undefined, getUserId: () => "@me:my_server", getHomeserverUrl: () => "https://my_server/", on: () => undefined, removeListener: () => undefined, }; describe("italics, bold, underline and strikethrough render as expected", () => { const ev = mkEvent({ type: "m.room.message", room: "room_id", user: "sender", content: { body: "foo *baz* __bar__ del u", msgtype: "m.text", format: "org.matrix.custom.html", formatted_body: "foo baz bar del u", }, event: true, }); const wrapper = mount(); expect(wrapper.text()).toBe("foo baz bar del u"); const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe('' + ev.getContent().formatted_body + ''); }); describe("spoilers get injected properly into the DOM", () => { const ev = mkEvent({ type: "m.room.message", room: "room_id", user: "sender", content: { body: "Hey [Spoiler for movie](mxc://someserver/somefile)", msgtype: "m.text", format: "org.matrix.custom.html", formatted_body: "Hey the movie was awesome", }, event: true, }); const wrapper = mount(); expect(wrapper.text()).toBe("Hey (movie) the movie was awesome"); const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe('' + 'Hey ' + '' + '(movie) ' + 'the movie was awesome' + ''); }); // If pills were rendered within a Portal/same shadow DOM then it'd be easier to test describe("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 = mount(); expect(wrapper.text()).toBe("Hey Member"); const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe('' + 'Hey ' + '' + 'Member' + ''); }); }); describe("renders url previews correctly", () => { languageHandler.setMissingEntryGenerator(key => key.split('|', 2)[1]); MatrixClientPeg.matrixClient = { getRoom: () => mkStubRoom("room_id"), getAccountData: () => undefined, getUrlPreview: (url) => new Promise(() => {}), }; 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 = mount(); expect(wrapper.text()).toBe(ev.getContent().body); let widgets = wrapper.find("LinkPreviewWidget"); // at this point we should have exactly one widget expect(widgets.length).toBe(1); expect(widgets.at(0).prop("link")).toBe("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, }); 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("LinkPreviewWidget"); // at this point we should have exactly two widgets (not the matrix.org one anymore) expect(widgets.length).toBe(2); expect(widgets.at(0).prop("link")).toBe("https://vector.im/"); expect(widgets.at(1).prop("link")).toBe("https://riot.im/"); }); }); }); });