|
5 | 5 |
|
6 | 6 | import csv |
7 | 7 | import os |
| 8 | +from contextlib import contextmanager |
8 | 9 |
|
9 | 10 | import pytest |
10 | 11 | from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user |
|
29 | 30 | user_file = 'userfile.csv' |
30 | 31 |
|
31 | 32 |
|
| 33 | +@contextmanager |
| 34 | +def disconnected_social_auth_redaction_signal(): |
| 35 | + """ |
| 36 | + Temporarily disconnect the fallback signal so these tests exercise the command path. |
| 37 | + """ |
| 38 | + pre_delete.disconnect(redact_social_auth_pii_before_deletion, sender=UserSocialAuth) |
| 39 | + try: |
| 40 | + yield |
| 41 | + finally: |
| 42 | + pre_delete.connect(redact_social_auth_pii_before_deletion, sender=UserSocialAuth) |
| 43 | + |
| 44 | + |
| 45 | +def assert_update_before_delete(sql_list, table='social_auth_usersocialauth'): |
| 46 | + table_key = table.upper() |
| 47 | + update_indices = [i for i, sql in enumerate(sql_list) if 'UPDATE' in sql.upper() and table_key in sql.upper()] |
| 48 | + delete_indices = [i for i, sql in enumerate(sql_list) if 'DELETE' in sql.upper() and table_key in sql.upper()] |
| 49 | + assert update_indices, f'Expected at least one UPDATE on {table}' |
| 50 | + assert delete_indices, f'Expected at least one DELETE on {table}' |
| 51 | + assert update_indices[0] < delete_indices[0], 'Expected UPDATE to precede DELETE' |
| 52 | + |
| 53 | + |
32 | 54 | def generate_dummy_users(): |
33 | 55 | """ |
34 | 56 | Function to generate dummy users that needs to be retired |
@@ -137,21 +159,10 @@ def test_retire_user_redacts_sso_pii_before_deletion(setup_retirement_states): |
137 | 159 | ) |
138 | 160 | social_auth_id = social_auth.id |
139 | 161 |
|
140 | | - # Disconnect the safety-net signal so we prove retire_user itself redacts first. |
141 | | - pre_delete.disconnect(redact_social_auth_pii_before_deletion, sender=UserSocialAuth) |
142 | | - try: |
143 | | - with CaptureQueriesContext(connection) as ctx: |
144 | | - call_command('retire_user', username=user.username, user_email=user.email) |
145 | | - finally: |
146 | | - pre_delete.connect(redact_social_auth_pii_before_deletion, sender=UserSocialAuth) |
| 162 | + with disconnected_social_auth_redaction_signal(), CaptureQueriesContext(connection) as ctx: |
| 163 | + call_command('retire_user', username=user.username, user_email=user.email) |
147 | 164 |
|
148 | | - sql_list = [q['sql'] for q in ctx] |
149 | | - table_key = 'SOCIAL_AUTH_USERSOCIALAUTH' |
150 | | - update_indices = [i for i, s in enumerate(sql_list) if 'UPDATE' in s.upper() and table_key in s.upper()] |
151 | | - delete_indices = [i for i, s in enumerate(sql_list) if 'DELETE' in s.upper() and table_key in s.upper()] |
152 | | - assert update_indices, 'Expected at least one UPDATE (redaction) on social_auth_usersocialauth' |
153 | | - assert delete_indices, 'Expected at least one DELETE on social_auth_usersocialauth' |
154 | | - assert update_indices[0] < delete_indices[0], 'Expected UPDATE (redaction) to precede DELETE' |
| 165 | + assert_update_before_delete([query['sql'] for query in ctx]) |
155 | 166 |
|
156 | 167 | assert not UserSocialAuth.objects.filter(id=social_auth_id).exists() |
157 | 168 |
|
@@ -184,21 +195,10 @@ def test_retire_user_redacts_each_social_auth_before_bulk_deletion(setup_retirem |
184 | 195 | google_auth_id = google_auth.id |
185 | 196 | saml_auth_id = saml_auth.id |
186 | 197 |
|
187 | | - # Disconnect the safety-net signal so we prove retire_user itself redacts first. |
188 | | - pre_delete.disconnect(redact_social_auth_pii_before_deletion, sender=UserSocialAuth) |
189 | | - try: |
190 | | - with CaptureQueriesContext(connection) as ctx: |
191 | | - call_command('retire_user', username=user.username, user_email=user.email) |
192 | | - finally: |
193 | | - pre_delete.connect(redact_social_auth_pii_before_deletion, sender=UserSocialAuth) |
| 198 | + with disconnected_social_auth_redaction_signal(), CaptureQueriesContext(connection) as ctx: |
| 199 | + call_command('retire_user', username=user.username, user_email=user.email) |
194 | 200 |
|
195 | | - sql_list = [q['sql'] for q in ctx] |
196 | | - table_key = 'SOCIAL_AUTH_USERSOCIALAUTH' |
197 | | - update_indices = [i for i, s in enumerate(sql_list) if 'UPDATE' in s.upper() and table_key in s.upper()] |
198 | | - delete_indices = [i for i, s in enumerate(sql_list) if 'DELETE' in s.upper() and table_key in s.upper()] |
199 | | - assert update_indices, 'Expected at least one UPDATE (redaction) on social_auth_usersocialauth' |
200 | | - assert delete_indices, 'Expected at least one DELETE on social_auth_usersocialauth' |
201 | | - assert update_indices[0] < delete_indices[0], 'Expected UPDATE (redaction) to precede DELETE' |
| 201 | + assert_update_before_delete([query['sql'] for query in ctx]) |
202 | 202 |
|
203 | 203 | assert not UserSocialAuth.objects.filter(id=google_auth_id).exists() |
204 | 204 | assert not UserSocialAuth.objects.filter(id=saml_auth_id).exists() |
0 commit comments