Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit aca077c

Browse files
authored
Add tests for createEditContent which mirror tests for createMessageContent. (#10331)
1 parent 85e8d27 commit aca077c

File tree

3 files changed

+173
-21
lines changed

3 files changed

+173
-21
lines changed

src/components/views/rooms/EditMessageComposer.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ function getTextReplyFallback(mxEvent: MatrixEvent): string {
6767
return "";
6868
}
6969

70-
function createEditContent(model: EditorModel, editedEvent: MatrixEvent): IContent {
70+
// exported for tests
71+
export function createEditContent(model: EditorModel, editedEvent: MatrixEvent): IContent {
7172
const isEmote = containsEmote(model);
7273
if (isEmote) {
7374
model = stripEmoteCommand(model);
@@ -103,15 +104,16 @@ function createEditContent(model: EditorModel, editedEvent: MatrixEvent): IConte
103104
contentBody.formatted_body = `${htmlPrefix} * ${formattedBody}`;
104105
}
105106

106-
const relation = {
107-
"m.new_content": newContent,
108-
"m.relates_to": {
109-
rel_type: "m.replace",
110-
event_id: editedEvent.getId(),
107+
return Object.assign(
108+
{
109+
"m.new_content": newContent,
110+
"m.relates_to": {
111+
rel_type: "m.replace",
112+
event_id: editedEvent.getId(),
113+
},
111114
},
112-
};
113-
114-
return Object.assign(relation, contentBody);
115+
contentBody,
116+
);
115117
}
116118

117119
interface IEditMessageComposerProps extends MatrixClientProps {
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
/*
2+
Copyright 2023 The Matrix.org Foundation C.I.C.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
import { createEditContent } from "../../../../src/components/views/rooms/EditMessageComposer";
18+
import EditorModel from "../../../../src/editor/model";
19+
import { createPartCreator } from "../../../editor/mock";
20+
import { mkEvent } from "../../../test-utils";
21+
import DocumentOffset from "../../../../src/editor/offset";
22+
23+
describe("<EditMessageComposer/>", () => {
24+
const editedEvent = mkEvent({
25+
type: "m.room.message",
26+
user: "@alice:test",
27+
room: "!abc:test",
28+
content: { body: "original message", msgtype: "m.text" },
29+
event: true,
30+
});
31+
32+
describe("createEditContent", () => {
33+
it("sends plaintext messages correctly", () => {
34+
const model = new EditorModel([], createPartCreator());
35+
const documentOffset = new DocumentOffset(11, true);
36+
model.update("hello world", "insertText", documentOffset);
37+
38+
const content = createEditContent(model, editedEvent);
39+
40+
expect(content).toEqual({
41+
"body": " * hello world",
42+
"msgtype": "m.text",
43+
"m.new_content": {
44+
body: "hello world",
45+
msgtype: "m.text",
46+
},
47+
"m.relates_to": {
48+
event_id: editedEvent.getId(),
49+
rel_type: "m.replace",
50+
},
51+
});
52+
});
53+
54+
it("sends markdown messages correctly", () => {
55+
const model = new EditorModel([], createPartCreator());
56+
const documentOffset = new DocumentOffset(13, true);
57+
model.update("hello *world*", "insertText", documentOffset);
58+
59+
const content = createEditContent(model, editedEvent);
60+
61+
expect(content).toEqual({
62+
"body": " * hello *world*",
63+
"msgtype": "m.text",
64+
"format": "org.matrix.custom.html",
65+
"formatted_body": " * hello <em>world</em>",
66+
"m.new_content": {
67+
body: "hello *world*",
68+
msgtype: "m.text",
69+
format: "org.matrix.custom.html",
70+
formatted_body: "hello <em>world</em>",
71+
},
72+
"m.relates_to": {
73+
event_id: editedEvent.getId(),
74+
rel_type: "m.replace",
75+
},
76+
});
77+
});
78+
79+
it("strips /me from messages and marks them as m.emote accordingly", () => {
80+
const model = new EditorModel([], createPartCreator());
81+
const documentOffset = new DocumentOffset(22, true);
82+
model.update("/me blinks __quickly__", "insertText", documentOffset);
83+
84+
const content = createEditContent(model, editedEvent);
85+
86+
expect(content).toEqual({
87+
"body": " * blinks __quickly__",
88+
"msgtype": "m.emote",
89+
"format": "org.matrix.custom.html",
90+
"formatted_body": " * blinks <strong>quickly</strong>",
91+
"m.new_content": {
92+
body: "blinks __quickly__",
93+
msgtype: "m.emote",
94+
format: "org.matrix.custom.html",
95+
formatted_body: "blinks <strong>quickly</strong>",
96+
},
97+
"m.relates_to": {
98+
event_id: editedEvent.getId(),
99+
rel_type: "m.replace",
100+
},
101+
});
102+
});
103+
104+
it("allows emoting with non-text parts", () => {
105+
const model = new EditorModel([], createPartCreator());
106+
const documentOffset = new DocumentOffset(16, true);
107+
model.update("/me ✨sparkles✨", "insertText", documentOffset);
108+
expect(model.parts.length).toEqual(4); // Emoji count as non-text
109+
110+
const content = createEditContent(model, editedEvent);
111+
112+
expect(content).toEqual({
113+
"body": " * ✨sparkles✨",
114+
"msgtype": "m.emote",
115+
"m.new_content": {
116+
body: "✨sparkles✨",
117+
msgtype: "m.emote",
118+
},
119+
"m.relates_to": {
120+
event_id: editedEvent.getId(),
121+
rel_type: "m.replace",
122+
},
123+
});
124+
});
125+
126+
it("allows sending double-slash escaped slash commands correctly", () => {
127+
const model = new EditorModel([], createPartCreator());
128+
const documentOffset = new DocumentOffset(32, true);
129+
130+
model.update("//dev/null is my favourite place", "insertText", documentOffset);
131+
132+
const content = createEditContent(model, editedEvent);
133+
134+
// TODO Edits do not properly strip the double slash used to skip
135+
// command processing.
136+
expect(content).toEqual({
137+
"body": " * //dev/null is my favourite place",
138+
"msgtype": "m.text",
139+
"m.new_content": {
140+
body: "//dev/null is my favourite place",
141+
msgtype: "m.text",
142+
},
143+
"m.relates_to": {
144+
event_id: editedEvent.getId(),
145+
rel_type: "m.replace",
146+
},
147+
});
148+
});
149+
});
150+
});

test/components/views/rooms/SendMessageComposer-test.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import SendMessageComposer, {
2626
import MatrixClientContext from "../../../../src/contexts/MatrixClientContext";
2727
import RoomContext, { TimelineRenderingType } from "../../../../src/contexts/RoomContext";
2828
import EditorModel from "../../../../src/editor/model";
29-
import { createPartCreator, createRenderer } from "../../../editor/mock";
29+
import { createPartCreator } from "../../../editor/mock";
3030
import { createTestClient, mkEvent, mkStubRoom } from "../../../test-utils";
3131
import { MatrixClientPeg } from "../../../../src/MatrixClientPeg";
3232
import defaultDispatcher from "../../../../src/dispatcher/dispatcher";
@@ -85,7 +85,7 @@ describe("<SendMessageComposer/>", () => {
8585
const permalinkCreator = jest.fn() as any;
8686

8787
it("sends plaintext messages correctly", () => {
88-
const model = new EditorModel([], createPartCreator(), createRenderer());
88+
const model = new EditorModel([], createPartCreator());
8989
const documentOffset = new DocumentOffset(11, true);
9090
model.update("hello world", "insertText", documentOffset);
9191

@@ -98,7 +98,7 @@ describe("<SendMessageComposer/>", () => {
9898
});
9999

100100
it("sends markdown messages correctly", () => {
101-
const model = new EditorModel([], createPartCreator(), createRenderer());
101+
const model = new EditorModel([], createPartCreator());
102102
const documentOffset = new DocumentOffset(13, true);
103103
model.update("hello *world*", "insertText", documentOffset);
104104

@@ -113,7 +113,7 @@ describe("<SendMessageComposer/>", () => {
113113
});
114114

115115
it("strips /me from messages and marks them as m.emote accordingly", () => {
116-
const model = new EditorModel([], createPartCreator(), createRenderer());
116+
const model = new EditorModel([], createPartCreator());
117117
const documentOffset = new DocumentOffset(22, true);
118118
model.update("/me blinks __quickly__", "insertText", documentOffset);
119119

@@ -128,7 +128,7 @@ describe("<SendMessageComposer/>", () => {
128128
});
129129

130130
it("allows emoting with non-text parts", () => {
131-
const model = new EditorModel([], createPartCreator(), createRenderer());
131+
const model = new EditorModel([], createPartCreator());
132132
const documentOffset = new DocumentOffset(16, true);
133133
model.update("/me ✨sparkles✨", "insertText", documentOffset);
134134
expect(model.parts.length).toEqual(4); // Emoji count as non-text
@@ -142,7 +142,7 @@ describe("<SendMessageComposer/>", () => {
142142
});
143143

144144
it("allows sending double-slash escaped slash commands correctly", () => {
145-
const model = new EditorModel([], createPartCreator(), createRenderer());
145+
const model = new EditorModel([], createPartCreator());
146146
const documentOffset = new DocumentOffset(32, true);
147147

148148
model.update("//dev/null is my favourite place", "insertText", documentOffset);
@@ -349,7 +349,7 @@ describe("<SendMessageComposer/>", () => {
349349

350350
describe("isQuickReaction", () => {
351351
it("correctly detects quick reaction", () => {
352-
const model = new EditorModel([], createPartCreator(), createRenderer());
352+
const model = new EditorModel([], createPartCreator());
353353
model.update("+😊", "insertText", new DocumentOffset(3, true));
354354

355355
const isReaction = isQuickReaction(model);
@@ -358,7 +358,7 @@ describe("<SendMessageComposer/>", () => {
358358
});
359359

360360
it("correctly detects quick reaction with space", () => {
361-
const model = new EditorModel([], createPartCreator(), createRenderer());
361+
const model = new EditorModel([], createPartCreator());
362362
model.update("+ 😊", "insertText", new DocumentOffset(4, true));
363363

364364
const isReaction = isQuickReaction(model);
@@ -367,10 +367,10 @@ describe("<SendMessageComposer/>", () => {
367367
});
368368

369369
it("correctly rejects quick reaction with extra text", () => {
370-
const model = new EditorModel([], createPartCreator(), createRenderer());
371-
const model2 = new EditorModel([], createPartCreator(), createRenderer());
372-
const model3 = new EditorModel([], createPartCreator(), createRenderer());
373-
const model4 = new EditorModel([], createPartCreator(), createRenderer());
370+
const model = new EditorModel([], createPartCreator());
371+
const model2 = new EditorModel([], createPartCreator());
372+
const model3 = new EditorModel([], createPartCreator());
373+
const model4 = new EditorModel([], createPartCreator());
374374
model.update("+😊hello", "insertText", new DocumentOffset(8, true));
375375
model2.update(" +😊", "insertText", new DocumentOffset(4, true));
376376
model3.update("+ 😊😊", "insertText", new DocumentOffset(6, true));

0 commit comments

Comments
 (0)