diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js
index 19720e077a..1095fb4aee 100644
--- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js
+++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js
@@ -24,7 +24,7 @@ import MatrixClientPeg from '../../../../MatrixClientPeg';
import { scorePassword } from '../../../../utils/PasswordScorer';
import { _t } from '../../../../languageHandler';
import { accessSecretStorage } from '../../../../CrossSigningManager';
-import SettingsStore from '../../../../../lib/settings/SettingsStore';
+import SettingsStore from '../../../../settings/SettingsStore';
const PHASE_PASSPHRASE = 0;
const PHASE_PASSPHRASE_CONFIRM = 1;
diff --git a/src/components/views/settings/KeyBackupPanel.js b/src/components/views/settings/KeyBackupPanel.js
index bfa96f277f..3781f97dbe 100644
--- a/src/components/views/settings/KeyBackupPanel.js
+++ b/src/components/views/settings/KeyBackupPanel.js
@@ -21,7 +21,7 @@ import sdk from '../../../index';
import MatrixClientPeg from '../../../MatrixClientPeg';
import { _t } from '../../../languageHandler';
import Modal from '../../../Modal';
-import SettingsStore from '../../../../lib/settings/SettingsStore';
+import SettingsStore from '../../../settings/SettingsStore';
export default class KeyBackupPanel extends React.PureComponent {
constructor(props) {
diff --git a/test/components/views/messages/TextualBody-test.js b/test/components/views/messages/TextualBody-test.js
index d93bfd307b..9e721d1d09 100644
--- a/test/components/views/messages/TextualBody-test.js
+++ b/test/components/views/messages/TextualBody-test.js
@@ -6,6 +6,8 @@ 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");
@@ -190,6 +192,66 @@ describe("", () => {
'');
});
});
+
+ 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/");
+ });
+ });
+ });
});