@@ -99,6 +99,16 @@ def upgrade_test_user_to_phone(user):
99
99
return user
100
100
101
101
102
+ def add_verified_realphone_to_user (phone_user : User ):
103
+ number = "+12223334444"
104
+ return RealPhone .objects .create (
105
+ user = phone_user ,
106
+ number = number ,
107
+ verification_sent_date = datetime .now (UTC ),
108
+ verified = True ,
109
+ )
110
+
111
+
102
112
@pytest .fixture (autouse = True )
103
113
def phone_user (db ):
104
114
return make_phone_test_user ()
@@ -772,6 +782,89 @@ def test_save_store_phone_log_true_doesnt_delete_data() -> None:
772
782
assert inbound_contact
773
783
774
784
785
+ def _setup_phone_user_for_last_engagment (phone_user ):
786
+ add_verified_realphone_to_user (phone_user )
787
+ relay_number = RelayNumber .objects .create (user = phone_user , number = "+12223334444" )
788
+
789
+ # Get initial last_engagement
790
+ initial_last_engagement = phone_user .profile .last_engagement
791
+ return relay_number , initial_last_engagement
792
+
793
+
794
+ def test_relaynumber_save_updates_last_engagement (phone_user ):
795
+ """
796
+ Test that updating specific RelayNumber fields triggers last_engagement update.
797
+ """
798
+ relay_number , initial_last_engagement = _setup_phone_user_for_last_engagment (
799
+ phone_user
800
+ )
801
+
802
+ # Update one of the tracked fields
803
+ relay_number .calls_forwarded += 1
804
+ relay_number .save ()
805
+
806
+ # Check if last_engagement was updated
807
+ phone_user .profile .refresh_from_db ()
808
+ assert phone_user .profile .last_engagement is not None
809
+
810
+ if initial_last_engagement :
811
+ assert phone_user .profile .last_engagement > initial_last_engagement
812
+
813
+
814
+ def test_relaynumber_save_no_update_when_other_fields_change (phone_user ):
815
+ """
816
+ Test that updating fields NOT in the tracked list does NOT update last_engagement.
817
+ """
818
+ relay_number , initial_last_engagement = _setup_phone_user_for_last_engagment (
819
+ phone_user
820
+ )
821
+
822
+ # Update a field that is NOT in the tracked list
823
+ relay_number .remaining_seconds -= 10
824
+ relay_number .save ()
825
+
826
+ # Ensure last_engagement was NOT updated
827
+ phone_user .profile .refresh_from_db ()
828
+ assert phone_user .profile .last_engagement == initial_last_engagement
829
+
830
+
831
+ def test_relaynumber_create_does_not_trigger_last_engagement (phone_user ):
832
+ """
833
+ Test that creating a new RelayNumber does NOT trigger last_engagement update.
834
+ """
835
+ add_verified_realphone_to_user (phone_user )
836
+ initial_last_engagement = phone_user .profile .last_engagement
837
+
838
+ RelayNumber .objects .create (user = phone_user , number = "+12223334444" )
839
+
840
+ # Ensure last_engagement was NOT updated
841
+ phone_user .profile .refresh_from_db ()
842
+ assert phone_user .profile .last_engagement == initial_last_engagement
843
+
844
+
845
+ def test_multiple_relaynumber_updates_trigger_last_engagement_once (phone_user ):
846
+ """
847
+ Test that multiple updates to a tracked field still updates last_engagement.
848
+ """
849
+ relay_number , initial_last_engagement = _setup_phone_user_for_last_engagment (
850
+ phone_user
851
+ )
852
+
853
+ # Update multiple tracked fields
854
+ relay_number .calls_forwarded += 1
855
+ relay_number .calls_blocked += 1
856
+ relay_number .texts_forwarded += 1
857
+ relay_number .save ()
858
+
859
+ # Check if last_engagement was updated
860
+ phone_user .profile .refresh_from_db ()
861
+
862
+ assert phone_user .profile .last_engagement is not None
863
+
864
+ if initial_last_engagement :
865
+ assert phone_user .profile .last_engagement > initial_last_engagement
866
+
867
+
775
868
def test_save_store_phone_log_false_deletes_data () -> None :
776
869
user = make_phone_test_user ()
777
870
baker .make (RealPhone , user = user , verified = True )
0 commit comments