diff options
Diffstat (limited to 'tests/serializers/tests.py')
| -rw-r--r-- | tests/serializers/tests.py | 189 |
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_) + ) |
