1
0
mirror of https://github.com/django/django.git synced 2025-10-24 06:06:09 +00:00

Refs #35060 -- Removed passing positional arguments to Model.save()/asave() per deprecation timeline.

This commit is contained in:
Sarah Boyce
2024-12-13 09:16:03 +01:00
parent 8d695bf510
commit d5fec03dad
6 changed files with 8 additions and 243 deletions

View File

@@ -20,9 +20,8 @@ from django.test import (
TransactionTestCase,
skipUnlessDBFeature,
)
from django.test.utils import CaptureQueriesContext, ignore_warnings
from django.test.utils import CaptureQueriesContext
from django.utils.connection import ConnectionDoesNotExist
from django.utils.deprecation import RemovedInDjango60Warning
from django.utils.translation import gettext_lazy
from .models import (
@@ -213,144 +212,6 @@ class ModelInstanceCreationTests(TestCase):
with self.assertNumQueries(1):
PrimaryKeyWithFalseyDbDefault().save()
def test_save_deprecation(self):
a = Article(headline="original", pub_date=datetime(2014, 5, 16))
msg = "Passing positional arguments to save() is deprecated"
with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
a.save(False, False, None, None)
self.assertEqual(Article.objects.count(), 1)
self.assertEqual(ctx.filename, __file__)
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)
def test_save_conflicting_positional_and_named_arguments(self):
a = Article()
cases = [
("force_insert", True, [42]),
("force_update", None, [42, 41]),
("using", "some-db", [42, 41, 40]),
("update_fields", ["foo"], [42, 41, 40, 39]),
]
for param_name, param_value, args in cases:
with self.subTest(param_name=param_name):
msg = f"Model.save() got multiple values for argument '{param_name}'"
with (
self.assertWarns(RemovedInDjango60Warning),
self.assertRaisesMessage(TypeError, msg),
):
a.save(*args, **{param_name: param_value})
async def test_asave_deprecation(self):
a = Article(headline="original", pub_date=datetime(2014, 5, 16))
msg = "Passing positional arguments to asave() is deprecated"
with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
await a.asave(False, False, None, None)
self.assertEqual(await Article.objects.acount(), 1)
self.assertEqual(ctx.filename, __file__)
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)
async def test_asave_conflicting_positional_and_named_arguments(self):
a = Article()
cases = [
("force_insert", True, [42]),
("force_update", None, [42, 41]),
("using", "some-db", [42, 41, 40]),
("update_fields", ["foo"], [42, 41, 40, 39]),
]
for param_name, param_value, args in cases:
with self.subTest(param_name=param_name):
msg = f"Model.asave() got multiple values for argument '{param_name}'"
with (
self.assertWarns(RemovedInDjango60Warning),
self.assertRaisesMessage(TypeError, msg),
):
await a.asave(*args, **{param_name: param_value})
@ignore_warnings(category=RemovedInDjango60Warning)
def test_save_positional_arguments(self):
a = Article.objects.create(headline="original", pub_date=datetime(2014, 5, 16))
a.headline = "changed"
a.save(False, False, None, ["pub_date"])
a.refresh_from_db()
self.assertEqual(a.headline, "original")
a.headline = "changed"
a.save(False, False, None, ["pub_date", "headline"])
a.refresh_from_db()
self.assertEqual(a.headline, "changed")
@ignore_warnings(category=RemovedInDjango60Warning)
async def test_asave_positional_arguments(self):
a = await Article.objects.acreate(
headline="original", pub_date=datetime(2014, 5, 16)
)
a.headline = "changed"
await a.asave(False, False, None, ["pub_date"])
await a.arefresh_from_db()
self.assertEqual(a.headline, "original")
a.headline = "changed"
await a.asave(False, False, None, ["pub_date", "headline"])
await a.arefresh_from_db()
self.assertEqual(a.headline, "changed")
class ModelTest(TestCase):
def test_objects_attribute_is_only_available_on_the_class_itself(self):