Esempio n. 1
0
    def serialize_db_to_string(self):
        """
        Serialize all data in the database into a JSON string.
        Designed only for test runner usage; will not handle large
        amounts of data.
        """
        # Build list of all apps to serialize
        from djmodels.db.migrations.loader import MigrationLoader
        loader = MigrationLoader(self.connection)
        app_list = []
        for app_config in apps.get_app_configs():
            if (
                app_config.models_module is not None and
                app_config.label in loader.migrated_apps and
                app_config.name not in settings.TEST_NON_SERIALIZED_APPS
            ):
                app_list.append((app_config, None))

        # Make a function to iteratively return every object
        def get_objects():
            for model in serializers.sort_dependencies(app_list):
                if (model._meta.can_migrate(self.connection) and
                        router.allow_migrate_model(self.connection.alias, model)):
                    queryset = model._default_manager.using(self.connection.alias).order_by(model._meta.pk.name)
                    yield from queryset.iterator()
        # Serialize to a string
        out = StringIO()
        serializers.serialize("json", get_objects(), indent=None, stream=out)
        return out.getvalue()
Esempio n. 2
0
    def test_geometry_field_option(self):
        """
        When a model has several geometry fields, the 'geometry_field' option
        can be used to specify the field to use as the 'geometry' key.
        """
        MultiFields.objects.create(city=City.objects.first(),
                                   name='Name',
                                   point=Point(5, 23),
                                   poly=Polygon(
                                       LinearRing((0, 0), (0, 5), (5, 5),
                                                  (5, 0), (0, 0))))

        geojson = serializers.serialize('geojson', MultiFields.objects.all())
        geodata = json.loads(geojson)
        self.assertEqual(geodata['features'][0]['geometry']['type'], 'Point')

        geojson = serializers.serialize('geojson',
                                        MultiFields.objects.all(),
                                        geometry_field='poly')
        geodata = json.loads(geojson)
        self.assertEqual(geodata['features'][0]['geometry']['type'], 'Polygon')

        # geometry_field is considered even if not in fields (#26138).
        geojson = serializers.serialize('geojson',
                                        MultiFields.objects.all(),
                                        geometry_field='poly',
                                        fields=('city', ))
        geodata = json.loads(geojson)
        self.assertEqual(geodata['features'][0]['geometry']['type'], 'Polygon')
Esempio n. 3
0
 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.assertTrue(
         fake_stdout.getvalue().endswith('[' + '.' * ProgressBar.progress_width + ']\n')
     )
Esempio n. 4
0
 def test_serialize_proxy_model(self):
     BaseModel.objects.create(parent_data=1)
     base_objects = BaseModel.objects.all()
     proxy_objects = ProxyBaseModel.objects.all()
     proxy_proxy_objects = ProxyProxyBaseModel.objects.all()
     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', ''))
Esempio n. 5
0
    def test_serialize_range_with_null(self):
        instance = RangesModel(ints=NumericRange(None, 10))
        data = serializers.serialize('json', [instance])
        new_instance = list(serializers.deserialize('json', data))[0].object
        self.assertEqual(new_instance.ints, NumericRange(None, 10))

        instance = RangesModel(ints=NumericRange(10, None))
        data = serializers.serialize('json', [instance])
        new_instance = list(serializers.deserialize('json', data))[0].object
        self.assertEqual(new_instance.ints, NumericRange(10, None))
Esempio n. 6
0
    def test_serialize_superfluous_queries(self):
        """Ensure no superfluous queries are made when serializing ForeignKeys

        #17602
        """
        ac = Actor(name='Actor name')
        ac.save()
        mv = Movie(title='Movie title', actor_id=ac.pk)
        mv.save()

        with self.assertNumQueries(0):
            serializers.serialize(self.serializer_name, [mv])
Esempio n. 7
0
 def test_control_char_failure(self):
     """
     Serializing control characters with XML should fail as those characters
     are not supported in the XML 1.0 standard (except HT, LF, CR).
     """
     self.a1.headline = "This contains \u0001 control \u0011 chars"
     msg = "Article.headline (pk:%s) contains unserializable characters" % self.a1.pk
     with self.assertRaisesMessage(ValueError, msg):
         serializers.serialize(self.serializer_name, [self.a1])
     self.a1.headline = "HT \u0009, LF \u000A, and CR \u000D are allowed"
     self.assertIn("HT \t, LF \n, and CR \r are allowed",
                   serializers.serialize(self.serializer_name, [self.a1]))
Esempio n. 8
0
 def test_float_serialization(self):
     """Float values serialize and deserialize intact"""
     sc = Score(score=3.4)
     sc.save()
     serial_str = serializers.serialize(self.serializer_name, [sc])
     deserial_objs = list(serializers.deserialize(self.serializer_name, serial_str))
     self.assertEqual(deserial_objs[0].object.score, Approximate(3.4, places=1))
Esempio n. 9
0
def natural_key_test(self, format):
    book1 = {
        'data': '978-1590597255',
        'title': 'The Definitive Guide to Django: Web Development Done Right',
    }
    book2 = {'data': '978-1590599969', 'title': 'Practical Django Projects'}

    # Create the books.
    adrian = NaturalKeyAnchor.objects.create(**book1)
    james = NaturalKeyAnchor.objects.create(**book2)

    # Serialize the books.
    string_data = serializers.serialize(
        format,
        NaturalKeyAnchor.objects.all(),
        indent=2,
        use_natural_foreign_keys=True,
        use_natural_primary_keys=True,
    )

    # Delete one book (to prove that the natural key generation will only
    # restore the primary keys of books found in the database via the
    # get_natural_key manager method).
    james.delete()

    # Deserialize and test.
    books = list(serializers.deserialize(format, string_data))
    self.assertEqual(len(books), 2)
    self.assertEqual(books[0].object.title, book1['title'])
    self.assertEqual(books[0].object.pk, adrian.pk)
    self.assertEqual(books[1].object.title, book2['title'])
    self.assertIsNone(books[1].object.pk)
Esempio n. 10
0
    def test_serialize_to_stream(self):
        obj = ComplexModel(field1='first', field2='second', field3='third')
        obj.save_base(raw=True)

        # Serialize the test database to a stream
        for stream in (StringIO(), HttpResponse()):
            serializers.serialize(self.serializer_name, [obj], indent=2, stream=stream)

            # Serialize normally for a comparison
            string_data = serializers.serialize(self.serializer_name, [obj], indent=2)

            # The two are the same
            if isinstance(stream, StringIO):
                self.assertEqual(string_data, stream.getvalue())
            else:
                self.assertEqual(string_data, stream.content.decode())
Esempio n. 11
0
def forward_ref_m2m_test(self, format):
    t1 = NaturalKeyThing.objects.create(key='t1')
    t2 = NaturalKeyThing.objects.create(key='t2')
    t3 = NaturalKeyThing.objects.create(key='t3')
    t1.other_things.set([t2, t3])
    string_data = serializers.serialize(
        format,
        [t1, t2, t3],
        use_natural_primary_keys=True,
        use_natural_foreign_keys=True,
    )
    NaturalKeyThing.objects.all().delete()
    objs_with_deferred_fields = []
    for obj in serializers.deserialize(format,
                                       string_data,
                                       handle_forward_references=True):
        obj.save()
        if obj.deferred_fields:
            objs_with_deferred_fields.append(obj)
    for obj in objs_with_deferred_fields:
        obj.save_deferred_fields()
    t1 = NaturalKeyThing.objects.get(key='t1')
    t2 = NaturalKeyThing.objects.get(key='t2')
    t3 = NaturalKeyThing.objects.get(key='t3')
    self.assertCountEqual(t1.other_things.all(), [t2, t3])
Esempio n. 12
0
def natural_key_serializer_test(self, format):
    # Create all the objects defined in the test data
    with connection.constraint_checks_disabled():
        objects = [
            NaturalKeyAnchor.objects.create(id=1100,
                                            data="Natural Key Anghor"),
            FKDataNaturalKey.objects.create(id=1101, data_id=1100),
            FKDataNaturalKey.objects.create(id=1102, data_id=None),
        ]
    # Serialize the test database
    serialized_data = serializers.serialize(format,
                                            objects,
                                            indent=2,
                                            use_natural_foreign_keys=True)

    for obj in serializers.deserialize(format, serialized_data):
        obj.save()

    # Assert that the deserialized data is the same
    # as the original source
    for obj in objects:
        instance = obj.__class__.objects.get(id=obj.pk)
        self.assertEqual(
            obj.data, instance.data,
            "Objects with PK=%d not equal; expected '%s' (%s), got '%s' (%s)" %
            (
                obj.pk,
                obj.data,
                type(obj.data),
                instance,
                type(instance.data),
            ))
Esempio n. 13
0
def serializerTest(self, format):

    # Create all the objects defined in the test data
    objects = []
    instance_count = {}
    for (func, pk, klass, datum) in test_data:
        with connection.constraint_checks_disabled():
            objects.extend(func[0](pk, klass, datum))

    # Get a count of the number of objects created for each class
    for klass in instance_count:
        instance_count[klass] = klass.objects.count()

    # Add the generic tagged objects to the object list
    objects.extend(Tag.objects.all())

    # Serialize the test database
    serialized_data = serializers.serialize(format, objects, indent=2)

    for obj in serializers.deserialize(format, serialized_data):
        obj.save()

    # Assert that the deserialized data is the same
    # as the original source
    for (func, pk, klass, datum) in test_data:
        func[1](self, pk, klass, datum)

    # Assert that the number of objects deserialized is the
    # same as the number that was serialized.
    for klass, count in instance_count.items():
        self.assertEqual(count, klass.objects.count())
Esempio n. 14
0
 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('djmodels.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)
Esempio n. 15
0
def natural_pk_mti_test(self, format):
    """
    If serializing objects in a multi-table inheritance relationship using
    natural primary keys, the natural foreign key for the parent is output in
    the fields of the child so it's possible to relate the child to the parent
    when deserializing.
    """
    child_1 = Child.objects.create(parent_data='1', child_data='1')
    child_2 = Child.objects.create(parent_data='2', child_data='2')
    string_data = serializers.serialize(
        format,
        [child_1.parent_ptr, child_2.parent_ptr, child_2, child_1],
        use_natural_foreign_keys=True,
        use_natural_primary_keys=True,
    )
    child_1.delete()
    child_2.delete()
    for obj in serializers.deserialize(format, string_data):
        obj.save()
    children = Child.objects.all()
    self.assertEqual(len(children), 2)
    for child in children:
        # If it's possible to find the superclass from the subclass and it's
        # the correct superclass, it's working.
        self.assertEqual(child.child_data, child.parent_data)
Esempio n. 16
0
 def test_srid_option(self):
     geojson = serializers.serialize('geojson',
                                     City.objects.all().order_by('name'),
                                     srid=2847)
     geodata = json.loads(geojson)
     self.assertEqual([
         int(c) for c in geodata['features'][0]['geometry']['coordinates']
     ], [1564802, 5613214])
Esempio n. 17
0
    def test_serialize_field_subset(self):
        """Output can be restricted to a subset of fields"""
        valid_fields = ('headline', 'pub_date')
        invalid_fields = ("author", "categories")
        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))

        for field_name in valid_fields:
            self.assertTrue(self._get_field_values(serial_str, field_name))
Esempio n. 18
0
 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],
     })
Esempio n. 19
0
 def test_serialization_base(self):
     geojson = serializers.serialize('geojson',
                                     City.objects.all().order_by('name'))
     geodata = json.loads(geojson)
     self.assertEqual(len(geodata['features']), len(City.objects.all()))
     self.assertEqual(geodata['features'][0]['geometry']['type'], 'Point')
     self.assertEqual(geodata['features'][0]['properties']['name'],
                      'Chicago')
     first_city = City.objects.all().order_by('name').first()
     self.assertEqual(geodata['features'][0]['properties']['pk'],
                      str(first_city.pk))
Esempio n. 20
0
    def test_pre_1000ad_date(self):
        """Year values before 1000AD are properly formatted"""
        # Regression for #12524 -- dates before 1000AD get prefixed
        # 0's on the year
        a = Article.objects.create(
            author=self.jane,
            headline="Nobody remembers the early years",
            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")
Esempio n. 21
0
    def test_one_to_one_as_pk(self):
        """
        If you use your own primary key field (such as a OneToOneField), it
        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'))

        for obj in serializers.deserialize(self.serializer_name, serial_str):
            self.assertEqual(obj.object.pk, self.joe.pk)
Esempio n. 22
0
    def test_serialize_with_null_pk(self):
        """
        Serialized data with no primary key results
        in a model instance with no id
        """
        category = Category(name="Reference")
        serial_str = serializers.serialize(self.serializer_name, [category])
        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
        self.assertIsNone(cat_obj.id)
Esempio n. 23
0
    def test_serialize_specific_fields(self):
        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')
        )
        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')
Esempio n. 24
0
 def test_dumping(self):
     instance = RangesModel(
         ints=NumericRange(0, 10), floats=NumericRange(empty=True),
         timestamps=DateTimeTZRange(self.lower_dt, self.upper_dt),
         dates=DateRange(self.lower_date, self.upper_date),
     )
     data = serializers.serialize('json', [instance])
     dumped = json.loads(data)
     for field in ('ints', 'dates', 'timestamps'):
         dumped[0]['fields'][field] = json.loads(dumped[0]['fields'][field])
     check = json.loads(self.test_data)
     for field in ('ints', 'dates', 'timestamps'):
         check[0]['fields'][field] = json.loads(check[0]['fields'][field])
     self.assertEqual(dumped, check)
Esempio n. 25
0
    def test_custom_field_serialization(self):
        """Custom fields serialize and deserialize intact"""
        team_str = "Spartak Moskva"
        player = Player()
        player.name = "Soslan Djanaev"
        player.rank = 1
        player.team = Team(team_str)
        player.save()
        serial_str = serializers.serialize(self.serializer_name, Player.objects.all())
        team = self._get_field_values(serial_str, "team")
        self.assertTrue(team)
        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())
Esempio n. 26
0
    def test_serialize_unicode(self):
        """Unicode makes the roundtrip intact"""
        actor_name = "Za\u017c\u00f3\u0142\u0107"
        movie_title = 'G\u0119\u015bl\u0105 ja\u017a\u0144'
        ac = Actor(name=actor_name)
        mv = Movie(title=movie_title, actor=ac)
        ac.save()
        mv.save()

        serial_str = serializers.serialize(self.serializer_name, [mv])
        self.assertEqual(self._get_field_values(serial_str, "title")[0], movie_title)
        self.assertEqual(self._get_field_values(serial_str, "actor")[0], actor_name)

        obj_list = list(serializers.deserialize(self.serializer_name, serial_str))
        mv_obj = obj_list[0].object
        self.assertEqual(mv_obj.title, movie_title)
Esempio n. 27
0
 def test_fields_option(self):
     """
     The fields option allows to define a subset of fields to be present in
     the 'properties' of the generated output.
     """
     PennsylvaniaCity.objects.create(name='Mansfield',
                                     county='Tioga',
                                     point='POINT(-77.071445 41.823881)')
     geojson = serializers.serialize(
         'geojson',
         PennsylvaniaCity.objects.all(),
         fields=('county', 'point'),
     )
     geodata = json.loads(geojson)
     self.assertIn('county', geodata['features'][0]['properties'])
     self.assertNotIn('founded', geodata['features'][0]['properties'])
     self.assertNotIn('pk', geodata['features'][0]['properties'])
Esempio n. 28
0
    def test_altering_serialized_output(self):
        """
        The ability to create new objects by modifying serialized content.
        """
        old_headline = "Poker has no place on ESPN"
        new_headline = "Poker has no place on television"
        serial_str = serializers.serialize(self.serializer_name, Article.objects.all())
        serial_str = serial_str.replace(old_headline, new_headline)
        models = list(serializers.deserialize(self.serializer_name, serial_str))

        # Prior to saving, old headline is in place
        self.assertTrue(Article.objects.filter(headline=old_headline))
        self.assertFalse(Article.objects.filter(headline=new_headline))

        for model in models:
            model.save()

        # After saving, new headline is in place
        self.assertTrue(Article.objects.filter(headline=new_headline))
        self.assertFalse(Article.objects.filter(headline=old_headline))
Esempio n. 29
0
def forward_ref_fk_with_error_test(self, format):
    t1 = NaturalKeyThing.objects.create(key='t1')
    t2 = NaturalKeyThing.objects.create(key='t2', other_thing=t1)
    t1.other_thing = t2
    t1.save()
    string_data = serializers.serialize(
        format,
        [t1],
        use_natural_primary_keys=True,
        use_natural_foreign_keys=True,
    )
    NaturalKeyThing.objects.all().delete()
    objs_with_deferred_fields = []
    for obj in serializers.deserialize(format,
                                       string_data,
                                       handle_forward_references=True):
        obj.save()
        if obj.deferred_fields:
            objs_with_deferred_fields.append(obj)
    obj = objs_with_deferred_fields[0]
    msg = 'NaturalKeyThing matching query does not exist'
    with self.assertRaisesMessage(serializers.base.DeserializationError, msg):
        obj.save_deferred_fields()
Esempio n. 30
0
 def test_roundtrip_with_null(self):
     instance = HStoreModel(field={'a': 'b', 'c': None})
     data = serializers.serialize('json', [instance])
     new_instance = list(serializers.deserialize('json', data))[0].object
     self.assertEqual(instance.field, new_instance.field)