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'- \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.
\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'
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