@@ -687,6 +687,85 @@ def test_fetch_since(client, room, user, no_rate_limit):
687
687
assert fetches == (sum (counts ) + 24 ) // 25
688
688
689
689
690
+ def test_fetch_since_skip_deletions (client , room , user , no_rate_limit ):
691
+ # Insert 10 posts; they will have seqno == id (i.e. 1 to 10).
692
+ for i in range (1 , 11 ):
693
+ room .add_post (user , f"fake data { i } " .encode (), pad64 (f"fake sig { i } " ))
694
+
695
+ # Delete some:
696
+ deleted = (2 , 4 , 5 , 8 , 9 )
697
+ for i in deleted :
698
+ r = sogs_delete (client , f'/room/test-room/message/{ i } ' , user )
699
+ assert r .status_code == 200
700
+
701
+ def get_and_clean_since (seqno ):
702
+ r = sogs_get (client , f"/room/test-room/messages/since/{ seqno } " , user )
703
+ assert r .status_code == 200
704
+ res = r .json
705
+ for m in res :
706
+ for k in ('posted' , 'session_id' , 'reactions' ):
707
+ if k in m :
708
+ del m [k ]
709
+ for k in ('data' , 'signature' , 'edited' ):
710
+ if k in m and m [k ] is not None :
711
+ m [k ] = True
712
+ return res
713
+
714
+ # If we poll from 1 we should only see the messages (skipping the first one with seqno=1) that
715
+ # remain (since our polling seqno is before the deleted messages were created in the first
716
+ # place):
717
+ assert get_and_clean_since (1 ) == [
718
+ {'id' : i , 'seqno' : i , 'data' : True , 'signature' : True } for i in (3 , 6 , 7 , 10 )
719
+ ]
720
+
721
+ def deleted_entry (id , seqno ):
722
+ return {'id' : id , 'seqno' : seqno , 'edited' : True , 'deleted' : True , 'data' : None }
723
+
724
+ # If we poll from 2 we should get the deletion for 2, but not the higher deletions
725
+ assert get_and_clean_since (2 ) == [
726
+ * ({'id' : i , 'seqno' : i , 'data' : True , 'signature' : True } for i in (3 , 6 , 7 , 10 )),
727
+ * (deleted_entry (i , s ) for i , s in ((2 , 11 ),)),
728
+ ]
729
+
730
+ # From 4 we should get deletions 2 and 4
731
+ assert get_and_clean_since (4 ) == [
732
+ * ({'id' : i , 'seqno' : i , 'data' : True , 'signature' : True } for i in (6 , 7 , 10 )),
733
+ * (deleted_entry (i , s ) for i , s in ((2 , 11 ), (4 , 12 ))),
734
+ ]
735
+
736
+ # and so on
737
+ assert get_and_clean_since (5 ) == [
738
+ * ({'id' : i , 'seqno' : i , 'data' : True , 'signature' : True } for i in (6 , 7 , 10 )),
739
+ * (deleted_entry (i , s ) for i , s in ((2 , 11 ), (4 , 12 ), (5 , 13 ))),
740
+ ]
741
+ assert get_and_clean_since (6 ) == [
742
+ * ({'id' : i , 'seqno' : i , 'data' : True , 'signature' : True } for i in (7 , 10 )),
743
+ * (deleted_entry (i , s ) for i , s in ((2 , 11 ), (4 , 12 ), (5 , 13 ))),
744
+ ]
745
+ assert get_and_clean_since (7 ) == [
746
+ * ({'id' : i , 'seqno' : i , 'data' : True , 'signature' : True } for i in (10 ,)),
747
+ * (deleted_entry (i , s ) for i , s in ((2 , 11 ), (4 , 12 ), (5 , 13 ))),
748
+ ]
749
+
750
+ assert get_and_clean_since (9 ) == [
751
+ * ({'id' : i , 'seqno' : i , 'data' : True , 'signature' : True } for i in (10 ,)),
752
+ * (deleted_entry (i , s ) for i , s in ((2 , 11 ), (4 , 12 ), (5 , 13 ), (8 , 14 ), (9 , 15 ))),
753
+ ]
754
+ assert get_and_clean_since (10 ) == [
755
+ * (deleted_entry (i , s ) for i , s in ((2 , 11 ), (4 , 12 ), (5 , 13 ), (8 , 14 ), (9 , 15 ))),
756
+ ]
757
+ assert get_and_clean_since (11 ) == [
758
+ * (deleted_entry (i , s ) for i , s in ((4 , 12 ), (5 , 13 ), (8 , 14 ), (9 , 15 ))),
759
+ ]
760
+ assert get_and_clean_since (13 ) == [
761
+ * (deleted_entry (i , s ) for i , s in ((8 , 14 ), (9 , 15 ))),
762
+ ]
763
+ assert get_and_clean_since (14 ) == [
764
+ * (deleted_entry (i , s ) for i , s in ((9 , 15 ),)),
765
+ ]
766
+ assert get_and_clean_since (15 ) == []
767
+
768
+
690
769
def test_fetch_before (client , room , user , no_rate_limit ):
691
770
for i in range (1000 ):
692
771
room .add_post (user , f"data-{ i } " .encode (), pad64 (f"fake sig { i } " ))
0 commit comments