1010from django .conf import settings
1111from django .contrib .auth .models import AnonymousUser , User # pylint: disable=imported-auth-user
1212from django .core .cache import cache
13+ from django .db import connection
1314from django .db .models .functions import Lower
1415from django .test import TestCase , override_settings
16+ from django .test .utils import CaptureQueriesContext
1517from edx_toggles .toggles .testutils import override_waffle_flag
1618from freezegun import freeze_time
1719from opaque_keys .edx .keys import CourseKey
4244from openedx .core .djangoapps .content .course_overviews .tests .factories import CourseOverviewFactory
4345from openedx .core .djangoapps .schedules .models import Schedule
4446from openedx .core .djangoapps .user_api .preferences .api import set_user_preference
45- from openedx .core .djangolib .testing .utils import skip_unless_lms
47+ from openedx .core .djangolib .testing .utils import assert_redact_before_delete , skip_unless_lms
4648from xmodule .modulestore import ModuleStoreEnum # pylint: disable=wrong-import-order
4749from xmodule .modulestore .tests .django_utils import ( # pylint: disable=wrong-import-order
4850 ModuleStoreTestCase ,
@@ -600,6 +602,22 @@ def test_delete_by_user_no_effect_for_user_with_no_email_change(self):
600602 assert not record_was_deleted
601603 assert 1 == len (PendingEmailChange .objects .all ())
602604
605+ def test_delete_by_user_value_redacts_pending_email_before_deletion (self ):
606+ """
607+ Verify that delete_by_user_value redacts new_email before deletion.
608+ """
609+ table = PendingEmailChange ._meta .db_table
610+ with CaptureQueriesContext (connection ) as ctx :
611+ record_was_deleted = PendingEmailChange .delete_by_user_value (self .user , field = 'user' )
612+
613+ assert_redact_before_delete (
614+ [q ['sql' ] for q in ctx ],
615+ table = table ,
616+ expected_redacted_value_list = ['redacted-before-delete@safe.com' ],
617+ )
618+ assert record_was_deleted
619+ assert not PendingEmailChange .objects .filter (user = self .user ).exists ()
620+
603621
604622class TestCourseEnrollmentAllowed (ModuleStoreTestCase ): # pylint: disable=missing-class-docstring
605623
@@ -615,11 +633,18 @@ def setUp(self):
615633 )
616634
617635 def test_retiring_user_deletes_record (self ):
618- is_successful = CourseEnrollmentAllowed .delete_by_user_value (
619- value = self .email ,
620- field = 'email'
621- )
636+ with CaptureQueriesContext (connection ) as ctx :
637+ is_successful = CourseEnrollmentAllowed .delete_by_user_value (
638+ value = self .email ,
639+ field = 'email'
640+ )
641+
622642 assert is_successful
643+ assert_redact_before_delete (
644+ [q ['sql' ] for q in ctx ],
645+ table = CourseEnrollmentAllowed ._meta .db_table ,
646+ expected_redacted_value_list = ['redacted-before-delete@safe.com' ],
647+ )
623648 user_search_results = CourseEnrollmentAllowed .objects .filter (
624649 email = self .email
625650 )
0 commit comments