|
1 | 1 | import csv |
| 2 | +import re |
2 | 3 | from io import StringIO |
3 | 4 | from unittest.mock import patch |
4 | 5 |
|
@@ -226,8 +227,10 @@ def _broken_command_error_callable(user): |
226 | 227 | { |
227 | 228 | "fields": [ |
228 | 229 | "id", |
229 | | - # single related object with subfields |
| 230 | + # single related object with single subfield |
230 | 231 | {"name": "auth_token", "fields": ["key"]}, |
| 232 | + # single related object with multiple subfields |
| 233 | + {"name": "auth_token", "fields": ["key", "created"]}, |
231 | 234 | # nullable field |
232 | 235 | {"name": "birth_date", "fields": ["year"]}, |
233 | 236 | # manager with single subfield |
@@ -264,18 +267,34 @@ def test_subfields_dict_field(self): |
264 | 267 | self.assertEqual(len(csv_data), 3) |
265 | 268 | # user1: token present, birth_date None, one org membership |
266 | 269 | self.assertEqual(csv_data[1][0], str(user1.id)) |
267 | | - self.assertEqual(csv_data[1][1], str(token.key)) # subfields, single obj |
268 | | - self.assertEqual(csv_data[1][2], "") # birth_date is None |
269 | | - self.assertEqual(csv_data[1][3], str(org.id)) # single-subfield manager |
270 | | - self.assertEqual(csv_data[1][4], f"(({org.id},True))") # multi-subfield manager |
271 | | - self.assertEqual(csv_data[1][5], str(org.id)) # dot-notation manager |
| 270 | + # subfields, single obj |
| 271 | + self.assertEqual(csv_data[1][1], str(token.key)) |
| 272 | + # single-obj multi-subfield: wrapped shape ((key,created)) |
| 273 | + self.assertRegex( |
| 274 | + csv_data[1][2], |
| 275 | + rf"^\({re.escape(token.key)},", |
| 276 | + ) |
| 277 | + # birth_date is None |
| 278 | + self.assertEqual(csv_data[1][3], "") |
| 279 | + # single-subfield manager |
| 280 | + self.assertEqual(csv_data[1][4], str(org.id)) |
| 281 | + # multi-subfield manager |
| 282 | + self.assertEqual(csv_data[1][5], f"({org.id},True)") |
| 283 | + # dot-notation manager |
| 284 | + self.assertEqual(csv_data[1][6], str(org.id)) |
272 | 285 | # user2: no token, no org membership |
273 | 286 | self.assertEqual(csv_data[2][0], str(user2.id)) |
274 | | - self.assertEqual(csv_data[2][1], "") # ObjectDoesNotExist auth_token |
275 | | - self.assertEqual(csv_data[2][2], "") # birth_date is None |
276 | | - self.assertEqual(csv_data[2][3], "") # empty manager |
277 | | - self.assertEqual(csv_data[2][4], "") # empty manager |
278 | | - self.assertEqual(csv_data[2][5], "") # empty dot-notation manager |
| 287 | + # ObjectDoesNotExist auth_token |
| 288 | + self.assertEqual(csv_data[2][1], "") |
| 289 | + # ObjectDoesNotExist auth_token multi-subfield |
| 290 | + self.assertEqual(csv_data[2][2], "") |
| 291 | + # birth_date is None |
| 292 | + self.assertEqual(csv_data[2][3], "") |
| 293 | + # empty manager |
| 294 | + self.assertEqual(csv_data[2][4], "") |
| 295 | + self.assertEqual(csv_data[2][5], "") |
| 296 | + # empty dot-notation manager |
| 297 | + self.assertEqual(csv_data[2][6], "") |
279 | 298 |
|
280 | 299 | def test_dot_notation_objectdoesnotexist_on_sub_attr(self): |
281 | 300 | """Returns empty string when sub-attribute access raises ObjectDoesNotExist.""" |
|
0 commit comments