From ca33d307dee3cf68cc9cd2ccfae00c7ff23ea890 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Sat, 15 Sep 2007 21:57:25 +0000 Subject: queryset-refactor: Merged to [6300] git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@6340 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/modeltests/fixtures/models.py | 2 +- tests/modeltests/serializers/models.py | 52 ++++++++++++++++-- tests/modeltests/signals/__init__.py | 0 tests/modeltests/signals/models.py | 85 ++++++++++++++++++++++++++++++ tests/regressiontests/forms/models.py | 21 ++++++++ tests/regressiontests/forms/regressions.py | 6 +++ tests/regressiontests/forms/tests.py | 33 ++++++++++++ 7 files changed, 194 insertions(+), 5 deletions(-) create mode 100644 tests/modeltests/signals/__init__.py create mode 100644 tests/modeltests/signals/models.py (limited to 'tests') diff --git a/tests/modeltests/fixtures/models.py b/tests/modeltests/fixtures/models.py index b59c388bbd..a1e2446e56 100644 --- a/tests/modeltests/fixtures/models.py +++ b/tests/modeltests/fixtures/models.py @@ -74,7 +74,7 @@ Multiple fixtures named 'fixture2' in '...fixtures'. Aborting. # Dump the current contents of the database as a JSON fixture >>> management.call_command('dumpdata', 'fixtures', format='json') -[{"pk": "3", "model": "fixtures.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": "2", "model": "fixtures.article", "fields": {"headline": "Poker has no place on ESPN", "pub_date": "2006-06-16 12:00:00"}}, {"pk": "1", "model": "fixtures.article", "fields": {"headline": "Python program becomes self aware", "pub_date": "2006-06-16 11:00:00"}}] +[{"pk": 3, "model": "fixtures.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": 2, "model": "fixtures.article", "fields": {"headline": "Poker has no place on ESPN", "pub_date": "2006-06-16 12:00:00"}}, {"pk": 1, "model": "fixtures.article", "fields": {"headline": "Python program becomes self aware", "pub_date": "2006-06-16 11:00:00"}}] """} from django.test import TestCase diff --git a/tests/modeltests/serializers/models.py b/tests/modeltests/serializers/models.py index 2ee6cfce67..a0a68d4bcc 100644 --- a/tests/modeltests/serializers/models.py +++ b/tests/modeltests/serializers/models.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ 41. Serialization @@ -43,6 +44,25 @@ class AuthorProfile(models.Model): def __unicode__(self): return u"Profile of %s" % self.author + +class Actor(models.Model): + name = models.CharField(max_length=20, primary_key=True) + + class Meta: + ordering = ('name',) + + def __unicode__(self): + return self.name + +class Movie(models.Model): + actor = models.ForeignKey(Actor) + title = models.CharField(max_length=50) + + class Meta: + ordering = ('title',) + + def __unicode__(self): + return self.title __test__ = {'API_TESTS':""" # Create some data: @@ -101,7 +121,7 @@ __test__ = {'API_TESTS':""" # Django also ships with a built-in JSON serializers >>> json = serializers.serialize("json", Category.objects.filter(pk=2)) >>> json -'[{"pk": "2", "model": "serializers.category", "fields": {"name": "Music"}}]' +'[{"pk": 2, "model": "serializers.category", "fields": {"name": "Music"}}]' # You can easily create new objects by deserializing data with an empty PK # (It's easier to demo this with JSON...) @@ -133,7 +153,7 @@ __test__ = {'API_TESTS':""" >>> json = serializers.serialize("json", AuthorProfile.objects.all()) >>> json -'[{"pk": "1", "model": "serializers.authorprofile", "fields": {"date_of_birth": "1970-01-01"}}]' +'[{"pk": 1, "model": "serializers.authorprofile", "fields": {"date_of_birth": "1970-01-01"}}]' >>> for obj in serializers.deserialize("json", json): ... print obj @@ -141,7 +161,7 @@ __test__ = {'API_TESTS':""" # Objects ids can be referenced before they are defined in the serialization data # However, the deserialization process will need to be contained within a transaction ->>> json = '[{"pk": "3", "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00", "categories": [4, 1], "author": 4}}, {"pk": "4", "model": "serializers.category", "fields": {"name": "Reference"}}, {"pk": "4", "model": "serializers.author", "fields": {"name": "Agnes"}}]' +>>> json = '[{"pk": 3, "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00", "categories": [4, 1], "author": 4}}, {"pk": 4, "model": "serializers.category", "fields": {"name": "Reference"}}, {"pk": 4, "model": "serializers.author", "fields": {"name": "Agnes"}}]' >>> from django.db import transaction >>> transaction.enter_transaction_management() >>> transaction.managed(True) @@ -161,6 +181,30 @@ __test__ = {'API_TESTS':""" # Serializer output can be restricted to a subset of fields >>> print serializers.serialize("json", Article.objects.all(), fields=('headline','pub_date')) -[{"pk": "1", "model": "serializers.article", "fields": {"headline": "Just kidding; I love TV poker", "pub_date": "2006-06-16 11:00:00"}}, {"pk": "2", "model": "serializers.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": "3", "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00"}}] +[{"pk": 1, "model": "serializers.article", "fields": {"headline": "Just kidding; I love TV poker", "pub_date": "2006-06-16 11:00:00"}}, {"pk": 2, "model": "serializers.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": 3, "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00"}}] + +# Every string is serialized as a unicode object, also primary key +# which is 'varchar' +>>> ac = Actor(name="Zażółć") +>>> mv = Movie(title="Gęślą jaźń", actor=ac) +>>> ac.save(); mv.save() + +# Let's serialize our movie +>>> print serializers.serialize("json", [mv]) +[{"pk": 1, "model": "serializers.movie", "fields": {"actor": "Za\u017c\u00f3\u0142\u0107", "title": "G\u0119\u015bl\u0105 ja\u017a\u0144"}}] + +# Deserialization of movie +>>> list(serializers.deserialize('json', serializers.serialize('json', [mv])))[0].object.title +u'G\u0119\u015bl\u0105 ja\u017a\u0144' + +# None is null after serialization to json +# Primary key is None in case of not saved model +>>> mv2 = Movie(title="Movie 2", actor=ac) +>>> print serializers.serialize("json", [mv2]) +[{"pk": null, "model": "serializers.movie", "fields": {"actor": "Za\u017c\u00f3\u0142\u0107", "title": "Movie 2"}}] + +# Deserialization of null returns None for pk +>>> print list(serializers.deserialize('json', serializers.serialize('json', [mv2])))[0].object.id +None """} diff --git a/tests/modeltests/signals/__init__.py b/tests/modeltests/signals/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/modeltests/signals/models.py b/tests/modeltests/signals/models.py new file mode 100644 index 0000000000..d41142135e --- /dev/null +++ b/tests/modeltests/signals/models.py @@ -0,0 +1,85 @@ +""" +Testing signals before/after saving and deleting. +""" + +from django.db import models +from django.dispatch import dispatcher + +class Person(models.Model): + first_name = models.CharField(max_length=20) + last_name = models.CharField(max_length=20) + + def __unicode__(self): + return u"%s %s" % (self.first_name, self.last_name) + + +def pre_save_test(sender, instance, **kwargs): + print 'pre_save signal,', instance + +def post_save_test(sender, instance, **kwargs): + print 'post_save signal,', instance + if 'created' in kwargs: + if kwargs['created']: + print 'Is created' + else: + print 'Is updated' + +def pre_delete_test(sender, instance, **kwargs): + print 'pre_delete signal,', instance + print 'instance.id is not None: %s' % (instance.id != None) + +def post_delete_test(sender, instance, **kwargs): + print 'post_delete signal,', instance + print 'instance.id is None: %s' % (instance.id == None) + +__test__ = {'API_TESTS':""" +>>> dispatcher.connect(pre_save_test, signal=models.signals.pre_save) +>>> dispatcher.connect(post_save_test, signal=models.signals.post_save) +>>> dispatcher.connect(pre_delete_test, signal=models.signals.pre_delete) +>>> dispatcher.connect(post_delete_test, signal=models.signals.post_delete) + +>>> p1 = Person(first_name='John', last_name='Smith') +>>> p1.save() +pre_save signal, John Smith +post_save signal, John Smith +Is created + +>>> p1.first_name = 'Tom' +>>> p1.save() +pre_save signal, Tom Smith +post_save signal, Tom Smith +Is updated + +>>> p1.delete() +pre_delete signal, Tom Smith +instance.id is not None: True +post_delete signal, Tom Smith +instance.id is None: True + +>>> p2 = Person(first_name='James', last_name='Jones') +>>> p2.id = 99999 +>>> p2.save() +pre_save signal, James Jones +post_save signal, James Jones +Is created + +>>> p2.id = 99998 +>>> p2.save() +pre_save signal, James Jones +post_save signal, James Jones +Is created + +>>> p2.delete() +pre_delete signal, James Jones +instance.id is not None: True +post_delete signal, James Jones +instance.id is None: True + +>>> Person.objects.all() +[] + +>>> dispatcher.disconnect(post_delete_test, signal=models.signals.post_delete) +>>> dispatcher.disconnect(pre_delete_test, signal=models.signals.pre_delete) +>>> dispatcher.disconnect(post_save_test, signal=models.signals.post_save) +>>> dispatcher.disconnect(pre_save_test, signal=models.signals.pre_save) +"""} diff --git a/tests/regressiontests/forms/models.py b/tests/regressiontests/forms/models.py index e69de29bb2..f4f8607193 100644 --- a/tests/regressiontests/forms/models.py +++ b/tests/regressiontests/forms/models.py @@ -0,0 +1,21 @@ +from django.db import models + +class BoundaryModel(models.Model): + positive_integer = models.PositiveIntegerField(null=True, blank=True) + +__test__ = {'API_TESTS': """ +>>> from django.newforms import form_for_model + +# Boundary conditions on a PostitiveIntegerField ######################### +>>> BoundaryForm = form_for_model(BoundaryModel) +>>> f = BoundaryForm({'positive_integer':100}) +>>> f.is_valid() +True +>>> f = BoundaryForm({'positive_integer':0}) +>>> f.is_valid() +True +>>> f = BoundaryForm({'positive_integer':-100}) +>>> f.is_valid() +False + +"""} \ No newline at end of file diff --git a/tests/regressiontests/forms/regressions.py b/tests/regressiontests/forms/regressions.py index df2ef578a1..3212e20170 100644 --- a/tests/regressiontests/forms/regressions.py +++ b/tests/regressiontests/forms/regressions.py @@ -60,6 +60,12 @@ Translated error messages used to be buggy. u'\n

' >>> deactivate() +Deep copying translated text shouldn't raise an error +>>> from django.utils.translation import gettext_lazy +>>> class CopyForm(Form): +... degree = IntegerField(widget=Select(choices=((1, gettext_lazy('test')),))) +>>> f = CopyForm() + ####################### # Miscellaneous Tests # ####################### diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py index fef8361a14..72033a4e60 100644 --- a/tests/regressiontests/forms/tests.py +++ b/tests/regressiontests/forms/tests.py @@ -961,6 +961,12 @@ True Traceback (most recent call last): ... ValidationError: [u'Enter a whole number.'] +>>> f.clean(42) +42 +>>> f.clean(3.14) +Traceback (most recent call last): +... +ValidationError: [u'Enter a whole number.'] >>> f.clean('1 ') 1 >>> f.clean(' 1') @@ -1084,6 +1090,10 @@ True 23.0 >>> f.clean('3.14') 3.1400000000000001 +>>> f.clean(3.14) +3.1400000000000001 +>>> f.clean(42) +42.0 >>> f.clean('a') Traceback (most recent call last): ... @@ -1142,6 +1152,10 @@ True Decimal("23") >>> f.clean('3.14') Decimal("3.14") +>>> f.clean(3.14) +Decimal("3.14") +>>> f.clean(Decimal('3.14')) +Decimal("3.14") >>> f.clean('a') Traceback (most recent call last): ... @@ -3856,6 +3870,25 @@ u'sirrobin'
This field is required.

Comment:

+################################# +# Test multipart-encoded form # +################################# + +>>> class FormWithoutFile(Form): +... username = CharField() +>>> class FormWithFile(Form): +... username = CharField() +... file = FileField() +>>> class FormWithImage(Form): +... image = ImageField() + +>>> FormWithoutFile().is_multipart() +False +>>> FormWithFile().is_multipart() +True +>>> FormWithImage().is_multipart() +True + """ __test__ = { -- cgit v1.3