Skip to content
This repository was archived by the owner on May 18, 2025. It is now read-only.

Commit a8d88e0

Browse files
committedOct 6, 2020
Write Enzyme tests for SendMessageComposer state/history persistence behaviour
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
1 parent 965debf commit a8d88e0

File tree

1 file changed

+152
-3
lines changed

1 file changed

+152
-3
lines changed
 

‎test/components/views/rooms/SendMessageComposer-test.js

Lines changed: 152 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,28 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
import RoomViewStore from "../../../../src/stores/RoomViewStore";
18-
import {createMessageContent} from "../../../../src/components/views/rooms/SendMessageComposer";
17+
import Adapter from "enzyme-adapter-react-16";
18+
import { configure, mount } from "enzyme";
19+
import React from "react";
20+
import {act} from "react-dom/test-utils";
21+
22+
import SendMessageComposer, {createMessageContent} from "../../../../src/components/views/rooms/SendMessageComposer";
23+
import MatrixClientContext from "../../../../src/contexts/MatrixClientContext";
1924
import EditorModel from "../../../../src/editor/model";
2025
import {createPartCreator, createRenderer} from "../../../editor/mock";
26+
import {createTestClient, mkEvent, mkStubRoom} from "../../../test-utils";
27+
import BasicMessageComposer from "../../../../src/components/views/rooms/BasicMessageComposer";
28+
import {MatrixClientPeg} from "../../../../src/MatrixClientPeg";
29+
import {sleep} from "../../../../src/utils/promise";
30+
import SpecPermalinkConstructor from "../../../../src/utils/permalinks/SpecPermalinkConstructor";
31+
import defaultDispatcher from "../../../../src/dispatcher/dispatcher";
2132

2233
jest.mock("../../../../src/stores/RoomViewStore");
2334

35+
configure({ adapter: new Adapter() });
36+
2437
describe('<SendMessageComposer/>', () => {
2538
describe("createMessageContent", () => {
26-
RoomViewStore.getQuotingEvent.mockReturnValue(false);
2739
const permalinkCreator = jest.fn();
2840

2941
it("sends plaintext messages correctly", () => {
@@ -78,6 +90,143 @@ describe('<SendMessageComposer/>', () => {
7890
});
7991
});
8092
});
93+
94+
describe("functions correctly mounted", () => {
95+
const mockClient = MatrixClientPeg.matrixClient = createTestClient();
96+
const mockRoom = mkStubRoom();
97+
const mockEvent = mkEvent({
98+
type: "m.room.message",
99+
content: "Replying to this",
100+
event: true,
101+
});
102+
mockRoom.findEventById = jest.fn(eventId => {
103+
return eventId === mockEvent.getId() ? mockEvent : null;
104+
});
105+
106+
const spyDispatcher = jest.spyOn(defaultDispatcher, "dispatch");
107+
108+
beforeEach(() => {
109+
localStorage.clear();
110+
spyDispatcher.mockReset();
111+
});
112+
113+
it("renders text and placeholder correctly", () => {
114+
const wrapper = mount(<MatrixClientContext.Provider value={mockClient}>
115+
<SendMessageComposer
116+
room={mockRoom}
117+
placeholder="placeholder string"
118+
permalinkCreator={new SpecPermalinkConstructor()}
119+
/>
120+
</MatrixClientContext.Provider>);
121+
122+
expect(wrapper.find('[aria-label="placeholder string"]')).toHaveLength(1);
123+
124+
act(() => {
125+
wrapper.find(BasicMessageComposer).instance().insertText("Test Text");
126+
wrapper.update();
127+
});
128+
129+
expect(wrapper.text()).toBe("Test Text");
130+
});
131+
132+
it("correctly persists state to and from localStorage", () => {
133+
const wrapper = mount(<MatrixClientContext.Provider value={mockClient}>
134+
<SendMessageComposer
135+
room={mockRoom}
136+
placeholder=""
137+
permalinkCreator={new SpecPermalinkConstructor()}
138+
replyToEvent={mockEvent}
139+
/>
140+
</MatrixClientContext.Provider>);
141+
142+
act(() => {
143+
wrapper.find(BasicMessageComposer).instance().insertText("Test Text");
144+
wrapper.update();
145+
});
146+
147+
const key = wrapper.find(SendMessageComposer).instance()._editorStateKey;
148+
149+
expect(wrapper.text()).toBe("Test Text");
150+
expect(localStorage.getItem(key)).toBeNull();
151+
152+
// ensure the right state was persisted to localStorage
153+
wrapper.unmount();
154+
expect(JSON.parse(localStorage.getItem(key))).toStrictEqual({
155+
parts: [{"type": "plain", "text": "Test Text"}],
156+
replyEventId: mockEvent.getId(),
157+
});
158+
159+
// ensure the correct model is re-loaded
160+
wrapper.mount();
161+
expect(wrapper.text()).toBe("Test Text");
162+
expect(spyDispatcher).toHaveBeenCalledWith({
163+
action: "reply_to_event",
164+
event: mockEvent,
165+
});
166+
167+
// now try with localStorage wiped out
168+
wrapper.unmount();
169+
localStorage.removeItem(key);
170+
wrapper.mount();
171+
expect(wrapper.text()).toBe("");
172+
});
173+
174+
it("persists state correctly without replyToEvent onbeforeunload", () => {
175+
const wrapper = mount(<MatrixClientContext.Provider value={mockClient}>
176+
<SendMessageComposer
177+
room={mockRoom}
178+
placeholder=""
179+
permalinkCreator={new SpecPermalinkConstructor()}
180+
/>
181+
</MatrixClientContext.Provider>);
182+
183+
act(() => {
184+
wrapper.find(BasicMessageComposer).instance().insertText("Hello World");
185+
wrapper.update();
186+
});
187+
188+
const key = wrapper.find(SendMessageComposer).instance()._editorStateKey;
189+
190+
expect(wrapper.text()).toBe("Hello World");
191+
expect(localStorage.getItem(key)).toBeNull();
192+
193+
// ensure the right state was persisted to localStorage
194+
window.dispatchEvent(new Event('beforeunload'));
195+
expect(JSON.parse(localStorage.getItem(key))).toStrictEqual({
196+
parts: [{"type": "plain", "text": "Hello World"}],
197+
});
198+
});
199+
200+
it("persists to session history upon sending", async () => {
201+
const wrapper = mount(<MatrixClientContext.Provider value={mockClient}>
202+
<SendMessageComposer
203+
room={mockRoom}
204+
placeholder="placeholder"
205+
permalinkCreator={new SpecPermalinkConstructor()}
206+
replyToEvent={mockEvent}
207+
/>
208+
</MatrixClientContext.Provider>);
209+
210+
act(() => {
211+
wrapper.find(BasicMessageComposer).instance().insertText("This is a message");
212+
wrapper.find(".mx_SendMessageComposer").simulate("keydown", { key: "Enter" });
213+
wrapper.update();
214+
});
215+
await sleep(10); // await the async _sendMessage
216+
wrapper.update();
217+
expect(spyDispatcher).toHaveBeenCalledWith({
218+
action: "reply_to_event",
219+
event: null,
220+
});
221+
222+
expect(wrapper.text()).toBe("");
223+
const str = sessionStorage.getItem(`mx_cider_composer_history_${mockRoom.roomId}[0]`);
224+
expect(JSON.parse(str)).toStrictEqual({
225+
parts: [{"type": "plain", "text": "This is a message"}],
226+
replyEventId: mockEvent.getId(),
227+
});
228+
});
229+
});
81230
});
82231

83232

0 commit comments

Comments
 (0)
This repository has been archived.