@@ -410,7 +410,7 @@ async fn test_send_reply_edit() {
410
410
. mount ( & server)
411
411
. await ;
412
412
413
- timeline
413
+ let edited = timeline
414
414
. edit (
415
415
& reply_item,
416
416
EditedContent :: RoomMessage ( RoomMessageEventContentWithoutRelation :: text_plain (
@@ -419,6 +419,7 @@ async fn test_send_reply_edit() {
419
419
)
420
420
. await
421
421
. unwrap ( ) ;
422
+ assert ! ( edited) ;
422
423
423
424
// Let the send queue handle the event.
424
425
yield_now ( ) . await ;
@@ -444,6 +445,130 @@ async fn test_send_reply_edit() {
444
445
server. verify ( ) . await ;
445
446
}
446
447
448
+ #[ async_test]
449
+ async fn test_edit_to_replied_updates_reply ( ) {
450
+ let room_id = room_id ! ( "!a98sd12bjh:example.org" ) ;
451
+ let ( client, server) = logged_in_client_with_server ( ) . await ;
452
+ let sync_settings = SyncSettings :: new ( ) . timeout ( Duration :: from_millis ( 3000 ) ) ;
453
+
454
+ let mut sync_builder = SyncResponseBuilder :: new ( ) ;
455
+ sync_builder. add_joined_room ( JoinedRoomBuilder :: new ( room_id) ) ;
456
+
457
+ mock_sync ( & server, sync_builder. build_json_sync_response ( ) , None ) . await ;
458
+ let _response = client. sync_once ( sync_settings. clone ( ) ) . await . unwrap ( ) ;
459
+ server. reset ( ) . await ;
460
+
461
+ mock_encryption_state ( & server, false ) . await ;
462
+
463
+ let room = client. get_room ( room_id) . unwrap ( ) ;
464
+ let timeline = room. timeline ( ) . await . unwrap ( ) ;
465
+ let ( _, mut timeline_stream) =
466
+ timeline. subscribe_filter_map ( |item| item. as_event ( ) . cloned ( ) ) . await ;
467
+
468
+ let f = EventFactory :: new ( ) ;
469
+ let event_id = event_id ! ( "$original_event" ) ;
470
+ let user_id = client. user_id ( ) . unwrap ( ) ;
471
+
472
+ // When a room has two messages, one is a reply to the other…
473
+ sync_builder. add_joined_room (
474
+ JoinedRoomBuilder :: new ( room_id)
475
+ . add_timeline_event ( f. text_msg ( "bonjour" ) . sender ( user_id) . event_id ( event_id) )
476
+ . add_timeline_event ( f. text_msg ( "hi back" ) . reply_to ( event_id) . sender ( * ALICE ) )
477
+ . add_timeline_event ( f. text_msg ( "yo" ) . reply_to ( event_id) . sender ( * BOB ) ) ,
478
+ ) ;
479
+
480
+ mock_sync ( & server, sync_builder. build_json_sync_response ( ) , None ) . await ;
481
+ let _response = client. sync_once ( sync_settings. clone ( ) ) . await . unwrap ( ) ;
482
+ server. reset ( ) . await ;
483
+
484
+ // (I see all the messages in the timeline.)
485
+ let replied_to_item = assert_next_matches ! ( timeline_stream, VectorDiff :: PushBack { value } => {
486
+ assert_eq!( value. content( ) . as_message( ) . unwrap( ) . body( ) , "bonjour" ) ;
487
+ assert!( value. is_editable( ) ) ;
488
+ value
489
+ } ) ;
490
+
491
+ assert_next_matches ! ( timeline_stream, VectorDiff :: PushBack { value: reply_item } => {
492
+ let reply_message = reply_item. content( ) . as_message( ) . unwrap( ) ;
493
+ assert_eq!( reply_message. body( ) , "hi back" ) ;
494
+
495
+ let in_reply_to = reply_message. in_reply_to( ) . unwrap( ) ;
496
+ assert_eq!( in_reply_to. event_id, event_id) ;
497
+
498
+ assert_let!( TimelineDetails :: Ready ( replied_to) = & in_reply_to. event) ;
499
+ assert_eq!( replied_to. content( ) . as_message( ) . unwrap( ) . body( ) , "bonjour" ) ;
500
+ } ) ;
501
+
502
+ assert_next_matches ! ( timeline_stream, VectorDiff :: PushBack { value: reply_item } => {
503
+ let reply_message = reply_item. content( ) . as_message( ) . unwrap( ) ;
504
+ assert_eq!( reply_message. body( ) , "yo" ) ;
505
+
506
+ let in_reply_to = reply_message. in_reply_to( ) . unwrap( ) ;
507
+ assert_eq!( in_reply_to. event_id, event_id) ;
508
+
509
+ assert_let!( TimelineDetails :: Ready ( replied_to) = & in_reply_to. event) ;
510
+ assert_eq!( replied_to. content( ) . as_message( ) . unwrap( ) . body( ) , "bonjour" ) ;
511
+ } ) ;
512
+
513
+ mock_encryption_state ( & server, false ) . await ;
514
+ Mock :: given ( method ( "PUT" ) )
515
+ . and ( path_regex ( r"^/_matrix/client/r0/rooms/.*/send/.*" ) )
516
+ . respond_with (
517
+ ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( { "event_id" : "$edit_event" } ) ) ,
518
+ )
519
+ . expect ( 1 )
520
+ . mount ( & server)
521
+ . await ;
522
+
523
+ // If I edit the first message,…
524
+ let edited = timeline
525
+ . edit (
526
+ & replied_to_item,
527
+ EditedContent :: RoomMessage ( RoomMessageEventContentWithoutRelation :: text_plain (
528
+ "hello world" ,
529
+ ) ) ,
530
+ )
531
+ . await
532
+ . unwrap ( ) ;
533
+ assert ! ( edited) ;
534
+
535
+ yield_now ( ) . await ; // let the send queue handle the edit.
536
+
537
+ // The reply events are updated with the edited replied-to content.
538
+ assert_next_matches ! ( timeline_stream, VectorDiff :: Set { index: 1 , value } => {
539
+ let reply_message = value. content( ) . as_message( ) . unwrap( ) ;
540
+ assert_eq!( reply_message. body( ) , "hi back" ) ;
541
+ assert!( !reply_message. is_edited( ) ) ;
542
+
543
+ let in_reply_to = reply_message. in_reply_to( ) . unwrap( ) ;
544
+ assert_eq!( in_reply_to. event_id, event_id) ;
545
+ assert_let!( TimelineDetails :: Ready ( replied_to) = & in_reply_to. event) ;
546
+ assert_eq!( replied_to. content( ) . as_message( ) . unwrap( ) . body( ) , "hello world" ) ;
547
+ } ) ;
548
+
549
+ assert_next_matches ! ( timeline_stream, VectorDiff :: Set { index: 2 , value } => {
550
+ let reply_message = value. content( ) . as_message( ) . unwrap( ) ;
551
+ assert_eq!( reply_message. body( ) , "yo" ) ;
552
+ assert!( !reply_message. is_edited( ) ) ;
553
+
554
+ let in_reply_to = reply_message. in_reply_to( ) . unwrap( ) ;
555
+ assert_eq!( in_reply_to. event_id, event_id) ;
556
+ assert_let!( TimelineDetails :: Ready ( replied_to) = & in_reply_to. event) ;
557
+ assert_eq!( replied_to. content( ) . as_message( ) . unwrap( ) . body( ) , "hello world" ) ;
558
+ } ) ;
559
+
560
+ // And the edit happens.
561
+ assert_next_matches ! ( timeline_stream, VectorDiff :: Set { index: 0 , value } => {
562
+ let msg = value. content( ) . as_message( ) . unwrap( ) ;
563
+ assert_eq!( msg. body( ) , "hello world" ) ;
564
+ assert!( msg. is_edited( ) ) ;
565
+ } ) ;
566
+
567
+ sleep ( Duration :: from_millis ( 200 ) ) . await ;
568
+
569
+ server. verify ( ) . await ;
570
+ }
571
+
447
572
#[ async_test]
448
573
async fn test_send_edit_poll ( ) {
449
574
let room_id = room_id ! ( "!a98sd12bjh:example.org" ) ;
0 commit comments