diff options
author | Simon Charette <charette.s@gmail.com> | 2021-12-15 19:36:08 -0500 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-12-17 07:46:58 +0100 |
commit | 43289707809c814a70f0db38ca4f82f35f43dbfd (patch) | |
tree | 84fe47804effc97a2fa02c7a71cb8af72f13f8a4 /tests/field_deconstruction | |
parent | 40165eecc40f9e223702a41a0cb0958515bb1f82 (diff) | |
download | django-43289707809c814a70f0db38ca4f82f35f43dbfd.tar.gz |
Fixed #33366 -- Fixed case handling with swappable setting detection in migrations autodetector.
The migration framework uniquely identifies models by case insensitive
labels composed of their app label and model names and so does the app
registry in most of its methods (e.g. AppConfig.get_model) but it
wasn't the case for get_swappable_settings_name() until this change.
This likely slipped under the radar for so long and only regressed in
b9df2b74b98b4d63933e8061d3cfc1f6f39eb747 because prior to the changes
related to the usage of model states instead of rendered models in the
auto-detector the exact value settings value was never going through a
case folding hoop.
Thanks Andrew Chen Wang for the report and Keryn Knight for the
investigation.
Diffstat (limited to 'tests/field_deconstruction')
-rw-r--r-- | tests/field_deconstruction/tests.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/tests/field_deconstruction/tests.py b/tests/field_deconstruction/tests.py index b2fb097100..70846f23d3 100644 --- a/tests/field_deconstruction/tests.py +++ b/tests/field_deconstruction/tests.py @@ -211,6 +211,13 @@ class FieldDeconstructionTests(SimpleTestCase): self.assertEqual(args, []) self.assertEqual(kwargs, {"to": "auth.user", "on_delete": models.CASCADE}) self.assertEqual(kwargs['to'].setting_name, "AUTH_USER_MODEL") + # Swap detection for lowercase swappable model. + field = models.ForeignKey('auth.user', models.CASCADE) + name, path, args, kwargs = field.deconstruct() + self.assertEqual(path, 'django.db.models.ForeignKey') + self.assertEqual(args, []) + self.assertEqual(kwargs, {'to': 'auth.user', 'on_delete': models.CASCADE}) + self.assertEqual(kwargs['to'].setting_name, 'AUTH_USER_MODEL') # Test nonexistent (for now) model field = models.ForeignKey("something.Else", models.CASCADE) name, path, args, kwargs = field.deconstruct() @@ -273,6 +280,19 @@ class FieldDeconstructionTests(SimpleTestCase): self.assertEqual(kwargs, {"to": "auth.permission", "on_delete": models.CASCADE}) self.assertEqual(kwargs['to'].setting_name, "AUTH_USER_MODEL") + # Model names are case-insensitive. + with isolate_lru_cache(apps.get_swappable_settings_name): + # It doesn't matter that we swapped out user for permission; + # there's no validation. We just want to check the setting stuff + # works. + field = models.ForeignKey('auth.permission', models.CASCADE) + name, path, args, kwargs = field.deconstruct() + + self.assertEqual(path, 'django.db.models.ForeignKey') + self.assertEqual(args, []) + self.assertEqual(kwargs, {'to': 'auth.permission', 'on_delete': models.CASCADE}) + self.assertEqual(kwargs['to'].setting_name, 'AUTH_USER_MODEL') + def test_one_to_one(self): # Test basic pointing from django.contrib.auth.models import Permission |