diff options
| author | Adam Johnson <me@adamj.eu> | 2024-06-25 17:12:10 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-25 13:12:10 -0300 |
| commit | 28522c3c8d5eb581347aececc3ac61c134528114 (patch) | |
| tree | 90293cc1fe2d278aee8783a2ab4f287e4cbe3eeb /tests/basic | |
| parent | bcc327aa326093a39f01a9bc98198807444900f3 (diff) | |
Fixed #35554, Refs #35060 -- Corrected deprecated *args parsing in Model.save()/asave().
The transitional logic added to deprecate the usage of *args for
Model.save()/asave() introduced two issues that this branch fixes:
* Passing extra positional arguments no longer raised TypeError.
* Passing a positional but empty update_fields would save all fields.
Co-authored-by: Natalia <124304+nessita@users.noreply.github.com>
Diffstat (limited to 'tests/basic')
| -rw-r--r-- | tests/basic/tests.py | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/tests/basic/tests.py b/tests/basic/tests.py index 38fb9ca200..4e89febed2 100644 --- a/tests/basic/tests.py +++ b/tests/basic/tests.py @@ -210,6 +210,35 @@ class ModelInstanceCreationTests(TestCase): a.save(False, False, None, None) self.assertEqual(Article.objects.count(), 1) + def test_save_deprecation_positional_arguments_used(self): + a = Article() + fields = ["headline"] + with ( + self.assertWarns(RemovedInDjango60Warning), + mock.patch.object(a, "save_base") as mock_save_base, + ): + a.save(None, 1, 2, fields) + self.assertEqual( + mock_save_base.mock_calls, + [ + mock.call( + using=2, + force_insert=None, + force_update=1, + update_fields=frozenset(fields), + ) + ], + ) + + def test_save_too_many_positional_arguments(self): + a = Article() + msg = "Model.save() takes from 1 to 5 positional arguments but 6 were given" + with ( + self.assertWarns(RemovedInDjango60Warning), + self.assertRaisesMessage(TypeError, msg), + ): + a.save(False, False, None, None, None) + async def test_asave_deprecation(self): a = Article(headline="original", pub_date=datetime(2014, 5, 16)) msg = "Passing positional arguments to asave() is deprecated" @@ -217,6 +246,35 @@ class ModelInstanceCreationTests(TestCase): await a.asave(False, False, None, None) self.assertEqual(await Article.objects.acount(), 1) + async def test_asave_deprecation_positional_arguments_used(self): + a = Article() + fields = ["headline"] + with ( + self.assertWarns(RemovedInDjango60Warning), + mock.patch.object(a, "save_base") as mock_save_base, + ): + await a.asave(None, 1, 2, fields) + self.assertEqual( + mock_save_base.mock_calls, + [ + mock.call( + using=2, + force_insert=None, + force_update=1, + update_fields=frozenset(fields), + ) + ], + ) + + async def test_asave_too_many_positional_arguments(self): + a = Article() + msg = "Model.asave() takes from 1 to 5 positional arguments but 6 were given" + with ( + self.assertWarns(RemovedInDjango60Warning), + self.assertRaisesMessage(TypeError, msg), + ): + await a.asave(False, False, None, None, None) + @ignore_warnings(category=RemovedInDjango60Warning) def test_save_positional_arguments(self): a = Article.objects.create(headline="original", pub_date=datetime(2014, 5, 16)) |
