summaryrefslogtreecommitdiff
path: root/tests/serializers/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/serializers/tests.py')
-rw-r--r--tests/serializers/tests.py189
1 files changed, 114 insertions, 75 deletions
diff --git a/tests/serializers/tests.py b/tests/serializers/tests.py
index 1b375a4a1e..8778d6f7da 100644
--- a/tests/serializers/tests.py
+++ b/tests/serializers/tests.py
@@ -14,8 +14,19 @@ from django.test.utils import Approximate, ignore_warnings
from django.utils.deprecation import RemovedInDjango50Warning
from .models import (
- Actor, Article, Author, AuthorProfile, BaseModel, Category, Child,
- ComplexModel, Movie, Player, ProxyBaseModel, ProxyProxyBaseModel, Score,
+ Actor,
+ Article,
+ Author,
+ AuthorProfile,
+ BaseModel,
+ Category,
+ Child,
+ ComplexModel,
+ Movie,
+ Player,
+ ProxyBaseModel,
+ ProxyProxyBaseModel,
+ Score,
Team,
)
@@ -35,22 +46,22 @@ class SerializerRegistrationTests(SimpleTestCase):
def test_register(self):
"Registering a new serializer populates the full registry. Refs #14823"
- serializers.register_serializer('json3', 'django.core.serializers.json')
+ serializers.register_serializer("json3", "django.core.serializers.json")
public_formats = serializers.get_public_serializer_formats()
- self.assertIn('json3', public_formats)
- self.assertIn('json2', public_formats)
- self.assertIn('xml', public_formats)
+ self.assertIn("json3", public_formats)
+ self.assertIn("json2", public_formats)
+ self.assertIn("xml", public_formats)
def test_unregister(self):
"Unregistering a serializer doesn't cause the registry to be repopulated. Refs #14823"
- serializers.unregister_serializer('xml')
- serializers.register_serializer('json3', 'django.core.serializers.json')
+ serializers.unregister_serializer("xml")
+ serializers.register_serializer("json3", "django.core.serializers.json")
public_formats = serializers.get_public_serializer_formats()
- self.assertNotIn('xml', public_formats)
- self.assertIn('json3', public_formats)
+ self.assertNotIn("xml", public_formats)
+ self.assertIn("json3", public_formats)
def test_unregister_unknown_serializer(self):
with self.assertRaises(SerializerDoesNotExist):
@@ -61,14 +72,14 @@ class SerializerRegistrationTests(SimpleTestCase):
all_formats = set(serializers.get_serializer_formats())
public_formats = set(serializers.get_public_serializer_formats())
- self.assertIn('xml', all_formats),
- self.assertIn('xml', public_formats)
+ self.assertIn("xml", all_formats),
+ self.assertIn("xml", public_formats)
- self.assertIn('json2', all_formats)
- self.assertIn('json2', public_formats)
+ self.assertIn("json2", all_formats)
+ self.assertIn("json2", public_formats)
- self.assertIn('python', all_formats)
- self.assertNotIn('python', public_formats)
+ self.assertIn("python", all_formats)
+ self.assertNotIn("python", public_formats)
def test_get_unknown_serializer(self):
"""
@@ -81,7 +92,7 @@ class SerializerRegistrationTests(SimpleTestCase):
serializers.get_serializer("nonsense")
# SerializerDoesNotExist is instantiated with the nonexistent format
- with self.assertRaisesMessage(SerializerDoesNotExist, 'nonsense'):
+ with self.assertRaisesMessage(SerializerDoesNotExist, "nonsense"):
serializers.get_serializer("nonsense")
def test_get_unknown_deserializer(self):
@@ -98,13 +109,13 @@ class SerializersTestBase:
music = Category.objects.create(name="Music")
op_ed = Category.objects.create(name="Op-Ed")
- cls.joe = Author.objects.create(name='Joe')
- cls.jane = Author.objects.create(name='Jane')
+ cls.joe = Author.objects.create(name="Joe")
+ cls.jane = Author.objects.create(name="Jane")
cls.a1 = Article(
author=cls.jane,
headline="Poker has no place on ESPN",
- pub_date=datetime(2006, 6, 16, 11, 00)
+ pub_date=datetime(2006, 6, 16, 11, 00),
)
cls.a1.save()
cls.a1.categories.set([sports, op_ed])
@@ -112,7 +123,7 @@ class SerializersTestBase:
cls.a2 = Article(
author=cls.joe,
headline="Time to reform copyright",
- pub_date=datetime(2006, 6, 16, 13, 00, 11, 345)
+ pub_date=datetime(2006, 6, 16, 13, 00, 11, 345),
)
cls.a2.save()
cls.a2.categories.set([music, op_ed])
@@ -129,7 +140,7 @@ class SerializersTestBase:
self.assertEqual(len(models), 2)
def test_serialize_to_stream(self):
- obj = ComplexModel(field1='first', field2='second', field3='third')
+ obj = ComplexModel(field1="first", field2="second", field3="third")
obj.save_base(raw=True)
# Serialize the test database to a stream
@@ -146,19 +157,19 @@ class SerializersTestBase:
self.assertEqual(string_data, stream.content.decode())
def test_serialize_specific_fields(self):
- obj = ComplexModel(field1='first', field2='second', field3='third')
+ obj = ComplexModel(field1="first", field2="second", field3="third")
obj.save_base(raw=True)
# Serialize then deserialize the test database
serialized_data = serializers.serialize(
- self.serializer_name, [obj], indent=2, fields=('field1', 'field3')
+ self.serializer_name, [obj], indent=2, fields=("field1", "field3")
)
result = next(serializers.deserialize(self.serializer_name, serialized_data))
# The deserialized object contains data in only the serialized fields.
- self.assertEqual(result.object.field1, 'first')
- self.assertEqual(result.object.field2, '')
- self.assertEqual(result.object.field3, 'third')
+ self.assertEqual(result.object.field1, "first")
+ self.assertEqual(result.object.field2, "")
+ self.assertEqual(result.object.field3, "third")
def test_altering_serialized_output(self):
"""
@@ -187,18 +198,24 @@ class SerializersTestBase:
doesn't appear in the serialized field list - it replaces the pk
identifier.
"""
- AuthorProfile.objects.create(author=self.joe, date_of_birth=datetime(1970, 1, 1))
- serial_str = serializers.serialize(self.serializer_name, AuthorProfile.objects.all())
- self.assertFalse(self._get_field_values(serial_str, 'author'))
+ AuthorProfile.objects.create(
+ author=self.joe, date_of_birth=datetime(1970, 1, 1)
+ )
+ serial_str = serializers.serialize(
+ self.serializer_name, AuthorProfile.objects.all()
+ )
+ self.assertFalse(self._get_field_values(serial_str, "author"))
for obj in serializers.deserialize(self.serializer_name, serial_str):
self.assertEqual(obj.object.pk, self.joe.pk)
def test_serialize_field_subset(self):
"""Output can be restricted to a subset of fields"""
- valid_fields = ('headline', 'pub_date')
+ valid_fields = ("headline", "pub_date")
invalid_fields = ("author", "categories")
- serial_str = serializers.serialize(self.serializer_name, Article.objects.all(), fields=valid_fields)
+ serial_str = serializers.serialize(
+ self.serializer_name, Article.objects.all(), fields=valid_fields
+ )
for field_name in invalid_fields:
self.assertFalse(self._get_field_values(serial_str, field_name))
@@ -208,7 +225,7 @@ class SerializersTestBase:
def test_serialize_unicode_roundtrip(self):
"""Unicode makes the roundtrip intact"""
actor_name = "Za\u017c\u00f3\u0142\u0107"
- movie_title = 'G\u0119\u015bl\u0105 ja\u017a\u0144'
+ movie_title = "G\u0119\u015bl\u0105 ja\u017a\u0144"
ac = Actor(name=actor_name)
mv = Movie(title=movie_title, actor=ac)
ac.save()
@@ -223,7 +240,7 @@ class SerializersTestBase:
self.assertEqual(mv_obj.title, movie_title)
def test_unicode_serialization(self):
- unicode_name = 'יוניקוד'
+ unicode_name = "יוניקוד"
data = serializers.serialize(self.serializer_name, [Author(name=unicode_name)])
self.assertIn(unicode_name, data)
objs = list(serializers.deserialize(self.serializer_name, data))
@@ -232,11 +249,15 @@ class SerializersTestBase:
def test_serialize_progressbar(self):
fake_stdout = StringIO()
serializers.serialize(
- self.serializer_name, Article.objects.all(),
- progress_output=fake_stdout, object_count=Article.objects.count()
+ self.serializer_name,
+ Article.objects.all(),
+ progress_output=fake_stdout,
+ object_count=Article.objects.count(),
)
self.assertTrue(
- fake_stdout.getvalue().endswith('[' + '.' * ProgressBar.progress_width + ']\n')
+ fake_stdout.getvalue().endswith(
+ "[" + "." * ProgressBar.progress_width + "]\n"
+ )
)
def test_serialize_superfluous_queries(self):
@@ -244,9 +265,9 @@ class SerializersTestBase:
#17602
"""
- ac = Actor(name='Actor name')
+ ac = Actor(name="Actor name")
ac.save()
- mv = Movie(title='Movie title', actor_id=ac.pk)
+ mv = Movie(title="Movie title", actor_id=ac.pk)
mv.save()
with self.assertNumQueries(0):
@@ -258,7 +279,7 @@ class SerializersTestBase:
with self.assertNumQueries(3):
serializers.serialize(
self.serializer_name,
- Article.objects.all().prefetch_related('categories', 'meta_data'),
+ Article.objects.all().prefetch_related("categories", "meta_data"),
)
# One query for the Article table, and two m2m queries for each
# article.
@@ -275,7 +296,9 @@ class SerializersTestBase:
pk_value = self._get_pk_values(serial_str)[0]
self.assertFalse(pk_value)
- cat_obj = list(serializers.deserialize(self.serializer_name, serial_str))[0].object
+ cat_obj = list(serializers.deserialize(self.serializer_name, serial_str))[
+ 0
+ ].object
self.assertIsNone(cat_obj.id)
def test_float_serialization(self):
@@ -287,8 +310,8 @@ class SerializersTestBase:
self.assertEqual(deserial_objs[0].object.score, Approximate(3.4, places=1))
def test_deferred_field_serialization(self):
- author = Author.objects.create(name='Victor Hugo')
- author = Author.objects.defer('name').get(pk=author.pk)
+ author = Author.objects.create(name="Victor Hugo")
+ author = Author.objects.defer("name").get(pk=author.pk)
serial_str = serializers.serialize(self.serializer_name, [author])
deserial_objs = list(serializers.deserialize(self.serializer_name, serial_str))
self.assertIsInstance(deserial_objs[0].object, Author)
@@ -307,7 +330,9 @@ class SerializersTestBase:
self.assertEqual(team[0], team_str)
deserial_objs = list(serializers.deserialize(self.serializer_name, serial_str))
- self.assertEqual(deserial_objs[0].object.team.to_string(), player.team.to_string())
+ self.assertEqual(
+ deserial_objs[0].object.team.to_string(), player.team.to_string()
+ )
def test_pre_1000ad_date(self):
"""Year values before 1000AD are properly formatted"""
@@ -316,17 +341,20 @@ class SerializersTestBase:
a = Article.objects.create(
author=self.jane,
headline="Nobody remembers the early years",
- pub_date=datetime(1, 2, 3, 4, 5, 6))
+ pub_date=datetime(1, 2, 3, 4, 5, 6),
+ )
serial_str = serializers.serialize(self.serializer_name, [a])
date_values = self._get_field_values(serial_str, "pub_date")
- self.assertEqual(date_values[0].replace('T', ' '), "0001-02-03 04:05:06")
+ self.assertEqual(date_values[0].replace("T", " "), "0001-02-03 04:05:06")
def test_pkless_serialized_strings(self):
"""
Serialized strings without PKs can be turned into models
"""
- deserial_objs = list(serializers.deserialize(self.serializer_name, self.pkless_str))
+ deserial_objs = list(
+ serializers.deserialize(self.serializer_name, self.pkless_str)
+ )
for obj in deserial_objs:
self.assertFalse(obj.object.id)
obj.save()
@@ -335,23 +363,31 @@ class SerializersTestBase:
def test_deterministic_mapping_ordering(self):
"""Mapping such as fields should be deterministically ordered. (#24558)"""
output = serializers.serialize(self.serializer_name, [self.a1], indent=2)
- categories = self.a1.categories.values_list('pk', flat=True)
- self.assertEqual(output, self.mapping_ordering_str % {
- 'article_pk': self.a1.pk,
- 'author_pk': self.a1.author_id,
- 'first_category_pk': categories[0],
- 'second_category_pk': categories[1],
- })
+ categories = self.a1.categories.values_list("pk", flat=True)
+ self.assertEqual(
+ output,
+ self.mapping_ordering_str
+ % {
+ "article_pk": self.a1.pk,
+ "author_pk": self.a1.author_id,
+ "first_category_pk": categories[0],
+ "second_category_pk": categories[1],
+ },
+ )
def test_deserialize_force_insert(self):
"""Deserialized content can be saved with force_insert as a parameter."""
serial_str = serializers.serialize(self.serializer_name, [self.a1])
- deserial_obj = list(serializers.deserialize(self.serializer_name, serial_str))[0]
- with mock.patch('django.db.models.Model') as mock_model:
+ deserial_obj = list(serializers.deserialize(self.serializer_name, serial_str))[
+ 0
+ ]
+ with mock.patch("django.db.models.Model") as mock_model:
deserial_obj.save(force_insert=False)
- mock_model.save_base.assert_called_with(deserial_obj.object, raw=True, using=None, force_insert=False)
+ mock_model.save_base.assert_called_with(
+ deserial_obj.object, raw=True, using=None, force_insert=False
+ )
- @skipUnlessDBFeature('can_defer_constraint_checks')
+ @skipUnlessDBFeature("can_defer_constraint_checks")
def test_serialize_proxy_model(self):
BaseModel.objects.create(parent_data=1)
base_objects = BaseModel.objects.all()
@@ -360,20 +396,19 @@ class SerializersTestBase:
base_data = serializers.serialize("json", base_objects)
proxy_data = serializers.serialize("json", proxy_objects)
proxy_proxy_data = serializers.serialize("json", proxy_proxy_objects)
- self.assertEqual(base_data, proxy_data.replace('proxy', ''))
- self.assertEqual(base_data, proxy_proxy_data.replace('proxy', ''))
+ self.assertEqual(base_data, proxy_data.replace("proxy", ""))
+ self.assertEqual(base_data, proxy_proxy_data.replace("proxy", ""))
def test_serialize_inherited_fields(self):
- child_1 = Child.objects.create(parent_data='a', child_data='b')
- child_2 = Child.objects.create(parent_data='c', child_data='d')
+ child_1 = Child.objects.create(parent_data="a", child_data="b")
+ child_2 = Child.objects.create(parent_data="c", child_data="d")
child_1.parent_m2m.add(child_2)
child_data = serializers.serialize(self.serializer_name, [child_1, child_2])
- self.assertEqual(self._get_field_values(child_data, 'parent_m2m'), [])
- self.assertEqual(self._get_field_values(child_data, 'parent_data'), [])
+ self.assertEqual(self._get_field_values(child_data, "parent_m2m"), [])
+ self.assertEqual(self._get_field_values(child_data, "parent_data"), [])
class SerializerAPITests(SimpleTestCase):
-
def test_stream_class(self):
class File:
def __init__(self):
@@ -383,7 +418,7 @@ class SerializerAPITests(SimpleTestCase):
self.lines.append(line)
def getvalue(self):
- return ''.join(self.lines)
+ return "".join(self.lines)
class Serializer(serializers.json.Serializer):
stream_class = File
@@ -392,14 +427,16 @@ class SerializerAPITests(SimpleTestCase):
data = serializer.serialize([Score(id=1, score=3.4)])
self.assertIs(serializer.stream_class, File)
self.assertIsInstance(serializer.stream, File)
- self.assertEqual(data, '[{"model": "serializers.score", "pk": 1, "fields": {"score": 3.4}}]')
+ self.assertEqual(
+ data, '[{"model": "serializers.score", "pk": 1, "fields": {"score": 3.4}}]'
+ )
class SerializersTransactionTestBase:
- available_apps = ['serializers']
+ available_apps = ["serializers"]
- @skipUnlessDBFeature('supports_forward_references')
+ @skipUnlessDBFeature("supports_forward_references")
def test_forward_refs(self):
"""
Objects ids can be referenced before they are
@@ -432,14 +469,14 @@ class PickleSerializerTests(SimpleTestCase):
@ignore_warnings(category=RemovedInDjango50Warning)
def test_serializer_loads_dumps(self):
serializer = PickleSerializer()
- test_data = 'test data'
+ test_data = "test data"
dump = serializer.dumps(test_data)
self.assertEqual(serializer.loads(dump), test_data)
def test_serializer_warning(self):
msg = (
- 'PickleSerializer is deprecated due to its security risk. Use '
- 'JSONSerializer instead.'
+ "PickleSerializer is deprecated due to its security risk. Use "
+ "JSONSerializer instead."
)
with self.assertRaisesMessage(RemovedInDjango50Warning, msg):
PickleSerializer()
@@ -451,10 +488,12 @@ def register_tests(test_class, method_name, test_func, exclude=()):
serializers are automatically tested.
"""
for format_ in serializers.get_serializer_formats():
- if format_ == 'geojson' or format_ in exclude:
+ if format_ == "geojson" or format_ in exclude:
continue
decorated_func = skipIf(
isinstance(serializers.get_serializer(format_), serializers.BadSerializer),
- 'The Python library for the %s serializer is not installed.' % format_,
+ "The Python library for the %s serializer is not installed." % format_,
)(test_func)
- setattr(test_class, method_name % format_, partialmethod(decorated_func, format_))
+ setattr(
+ test_class, method_name % format_, partialmethod(decorated_func, format_)
+ )