@@ -2,6 +2,7 @@ import 'dart:convert';
2
2
import 'dart:io' ;
3
3
4
4
import 'package:checks/checks.dart' ;
5
+ import 'package:crypto/crypto.dart' ;
5
6
import 'package:http/http.dart' as http;
6
7
import 'package:test/scaffolding.dart' ;
7
8
import 'package:zulip/api/model/events.dart' ;
@@ -136,11 +137,16 @@ void main() {
136
137
check (connection.takeRequests ()).length.equals (1 ); // message-list fetchInitial
137
138
}
138
139
139
- void checkRequest (int messageId, String content) {
140
+ void checkRequest (int messageId, {
141
+ required String prevContent,
142
+ required String content,
143
+ }) {
144
+ final prevContentSha256 = sha256.convert (utf8.encode (prevContent)).toString ();
140
145
check (connection.takeRequests ()).single.isA< http.Request > ()
141
146
..method.equals ('PATCH' )
142
147
..url.path.equals ('/api/v1/messages/$messageId ' )
143
148
..bodyFields.deepEquals ({
149
+ 'prev_content_sha256' : prevContentSha256,
144
150
'content' : content,
145
151
});
146
152
}
@@ -151,8 +157,11 @@ void main() {
151
157
152
158
connection.prepare (
153
159
json: UpdateMessageResult ().toJson (), delay: Duration (seconds: 1 ));
154
- store.editMessage (messageId: message.id, newContent: 'new content' );
155
- checkRequest (message.id, 'new content' );
160
+ store.editMessage (messageId: message.id,
161
+ originalRawContent: 'old content' , newContent: 'new content' );
162
+ checkRequest (message.id,
163
+ prevContent: 'old content' ,
164
+ content: 'new content' );
156
165
checkNotifiedOnce ();
157
166
158
167
async .elapse (Duration (milliseconds: 500 ));
@@ -179,8 +188,11 @@ void main() {
179
188
180
189
connection.prepare (
181
190
json: UpdateMessageResult ().toJson (), delay: Duration (seconds: 1 ));
182
- store.editMessage (messageId: message.id, newContent: 'new content' );
183
- checkRequest (message.id, 'new content' );
191
+ store.editMessage (messageId: message.id,
192
+ originalRawContent: 'old content' , newContent: 'new content' );
193
+ checkRequest (message.id,
194
+ prevContent: 'old content' ,
195
+ content: 'new content' );
184
196
checkNotifiedOnce ();
185
197
186
198
async .elapse (Duration (milliseconds: 500 ));
@@ -189,8 +201,11 @@ void main() {
189
201
check (store.getEditMessageErrorStatus (otherMessage.id)).isNull ();
190
202
connection.prepare (
191
203
json: UpdateMessageResult ().toJson (), delay: Duration (seconds: 1 ));
192
- store.editMessage (messageId: otherMessage.id, newContent: 'other message new content' );
193
- checkRequest (otherMessage.id, 'other message new content' );
204
+ store.editMessage (messageId: otherMessage.id,
205
+ originalRawContent: 'other message old content' , newContent: 'other message new content' );
206
+ checkRequest (otherMessage.id,
207
+ prevContent: 'other message old content' ,
208
+ content: 'other message new content' );
194
209
checkNotifiedOnce ();
195
210
196
211
async .elapse (Duration (milliseconds: 500 ));
@@ -221,7 +236,8 @@ void main() {
221
236
check (store.getEditMessageErrorStatus (message.id)).isNull ();
222
237
223
238
connection.prepare (apiException: eg.apiBadRequest (), delay: Duration (seconds: 1 ));
224
- store.editMessage (messageId: message.id, newContent: 'new content' );
239
+ store.editMessage (messageId: message.id,
240
+ originalRawContent: 'old content' , newContent: 'new content' );
225
241
checkNotifiedOnce ();
226
242
async .elapse (Duration (seconds: 1 ));
227
243
check (store.getEditMessageErrorStatus (message.id)).isNotNull ().isTrue ();
@@ -233,7 +249,8 @@ void main() {
233
249
check (store.getEditMessageErrorStatus (message.id)).isNull ();
234
250
235
251
connection.prepare (apiException: eg.apiBadRequest (), delay: Duration (seconds: 1 ));
236
- store.editMessage (messageId: message.id, newContent: 'new content' );
252
+ store.editMessage (messageId: message.id,
253
+ originalRawContent: 'old content' , newContent: 'new content' );
237
254
checkNotifiedOnce ();
238
255
async .elapse (Duration (seconds: 1 ));
239
256
check (store.getEditMessageErrorStatus (message.id)).isNotNull ().isTrue ();
@@ -255,12 +272,14 @@ void main() {
255
272
256
273
connection.prepare (
257
274
json: UpdateMessageResult ().toJson (), delay: Duration (seconds: 1 ));
258
- store.editMessage (messageId: message.id, newContent: 'new content' );
275
+ store.editMessage (messageId: message.id,
276
+ originalRawContent: 'old content' , newContent: 'new content' );
259
277
async .elapse (Duration (milliseconds: 500 ));
260
278
check (connection.takeRequests ()).length.equals (1 );
261
279
checkNotifiedOnce ();
262
280
263
- await check (store.editMessage (messageId: message.id, newContent: 'newer content' ))
281
+ await check (store.editMessage (messageId: message.id,
282
+ originalRawContent: 'old content' , newContent: 'newer content' ))
264
283
.isA <Future <void >>().throws <StateError >();
265
284
check (connection.takeRequests ()).isEmpty ();
266
285
}));
@@ -273,7 +292,8 @@ void main() {
273
292
274
293
connection.prepare (
275
294
httpException: const SocketException ('failed' ), delay: Duration (seconds: 1 ));
276
- store.editMessage (messageId: message.id, newContent: 'new content' );
295
+ store.editMessage (messageId: message.id,
296
+ originalRawContent: 'old content' , newContent: 'new content' );
277
297
checkNotifiedOnce ();
278
298
279
299
async .elapse (Duration (milliseconds: 500 ));
@@ -294,7 +314,8 @@ void main() {
294
314
295
315
connection.prepare (
296
316
httpException: const SocketException ('failed' ), delay: Duration (seconds: 1 ));
297
- store.editMessage (messageId: message.id, newContent: 'new content' );
317
+ store.editMessage (messageId: message.id,
318
+ originalRawContent: 'old content' , newContent: 'new content' );
298
319
checkNotifiedOnce ();
299
320
300
321
async .elapse (Duration (seconds: 1 ));
@@ -314,7 +335,8 @@ void main() {
314
335
315
336
connection.prepare (
316
337
httpException: const SocketException ('failed' ), delay: Duration (seconds: 1 ));
317
- store.editMessage (messageId: message.id, newContent: 'new content' );
338
+ store.editMessage (messageId: message.id,
339
+ originalRawContent: 'old content' , newContent: 'new content' );
318
340
checkNotifiedOnce ();
319
341
320
342
async .elapse (Duration (seconds: 1 ));
@@ -333,7 +355,8 @@ void main() {
333
355
check (store.getEditMessageErrorStatus (message.id)).isNull ();
334
356
335
357
connection.prepare (apiException: eg.apiBadRequest (), delay: Duration (seconds: 1 ));
336
- store.editMessage (messageId: message.id, newContent: 'new content' );
358
+ store.editMessage (messageId: message.id,
359
+ originalRawContent: 'old content' , newContent: 'new content' );
337
360
checkNotifiedOnce ();
338
361
async .elapse (Duration (seconds: 1 ));
339
362
check (store.getEditMessageErrorStatus (message.id)).isNotNull ().isTrue ();
@@ -349,7 +372,8 @@ void main() {
349
372
check (store.getEditMessageErrorStatus (message.id)).isNull ();
350
373
351
374
connection.prepare (apiException: eg.apiBadRequest (), delay: Duration (seconds: 1 ));
352
- store.editMessage (messageId: message.id, newContent: 'new content' );
375
+ store.editMessage (messageId: message.id,
376
+ originalRawContent: 'old content' , newContent: 'new content' );
353
377
checkNotifiedOnce ();
354
378
355
379
async .elapse (Duration (milliseconds: 500 ));
@@ -373,7 +397,8 @@ void main() {
373
397
374
398
connection.prepare (
375
399
json: UpdateMessageResult ().toJson (), delay: Duration (seconds: 1 ));
376
- store.editMessage (messageId: message.id, newContent: 'new content' );
400
+ store.editMessage (messageId: message.id,
401
+ originalRawContent: 'old content' , newContent: 'new content' );
377
402
checkNotifiedOnce ();
378
403
379
404
async .elapse (Duration (milliseconds: 500 ));
0 commit comments