summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJeremy Dunck <jdunck@gmail.com>2007-03-23 16:35:57 +0000
committerJeremy Dunck <jdunck@gmail.com>2007-03-23 16:35:57 +0000
commitfa3ed6e1341f7c8b468e2267b3fafddeb58cdac2 (patch)
tree6d8bf65854f8431355e2d91cbc61a37ab6f23d9a /tests
parent8b279b63bef5c1348cc27c50633fc2d5ef09d7c1 (diff)
gis: Merged revisions 4669-4785 via svnmerge from trunk.
git-svn-id: http://code.djangoproject.com/svn/django/branches/gis@4786 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/modeltests/fixtures/models.py4
-rw-r--r--tests/modeltests/get_object_or_404/models.py6
-rw-r--r--tests/modeltests/test_client/models.py38
-rw-r--r--tests/modeltests/test_client/urls.py1
-rw-r--r--tests/modeltests/test_client/views.py34
-rw-r--r--tests/regressiontests/datastructures/tests.py33
-rw-r--r--tests/regressiontests/defaultfilters/tests.py6
-rw-r--r--tests/regressiontests/many_to_one_regress/models.py29
-rw-r--r--tests/regressiontests/serializers_regress/__init__.py0
-rw-r--r--tests/regressiontests/serializers_regress/models.py187
-rw-r--r--tests/regressiontests/serializers_regress/tests.py263
-rw-r--r--tests/regressiontests/templates/tests.py14
12 files changed, 604 insertions, 11 deletions
diff --git a/tests/modeltests/fixtures/models.py b/tests/modeltests/fixtures/models.py
index d82886a6c4..afef6a7389 100644
--- a/tests/modeltests/fixtures/models.py
+++ b/tests/modeltests/fixtures/models.py
@@ -67,13 +67,13 @@ __test__ = {'API_TESTS': """
# Try to load fixture 2 using format discovery; this will fail
# because there are two fixture2's in the fixtures directory
>>> management.load_data(['fixture2'], verbosity=0) # doctest: +ELLIPSIS
-Multiple fixtures named 'fixture2' in '.../fixtures'. Aborting.
+Multiple fixtures named 'fixture2' in '...fixtures'. Aborting.
>>> Article.objects.all()
[<Article: Time to reform copyright>, <Article: Poker has no place on ESPN>, <Article: Python program becomes self aware>]
# Dump the current contents of the database as a JSON fixture
->>> management.dump_data(['fixtures'], format='json')
+>>> print management.dump_data(['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"}}]
"""}
diff --git a/tests/modeltests/get_object_or_404/models.py b/tests/modeltests/get_object_or_404/models.py
index 79bcc6f52c..0aefd40fdf 100644
--- a/tests/modeltests/get_object_or_404/models.py
+++ b/tests/modeltests/get_object_or_404/models.py
@@ -44,7 +44,7 @@ __test__ = {'API_TESTS':"""
>>> get_object_or_404(Article, title="Foo")
Traceback (most recent call last):
...
-Http404
+Http404: No Article matches the given query.
# Create an Article.
>>> article = Article.objects.create(title="Run away!")
@@ -63,7 +63,7 @@ Http404
>>> get_object_or_404(a.article_set, title__contains="Camelot")
Traceback (most recent call last):
...
-Http404
+Http404: No Article matches the given query.
# Custom managers can be used too.
>>> get_object_or_404(Article.by_a_sir, title="Run away!")
@@ -77,7 +77,7 @@ Http404
>>> get_list_or_404(a.article_set, title__icontains='Shrubbery')
Traceback (most recent call last):
...
-Http404
+Http404: No Article matches the given query.
# Custom managers can be used too.
>>> get_list_or_404(Article.by_a_sir, title__icontains="Run")
diff --git a/tests/modeltests/test_client/models.py b/tests/modeltests/test_client/models.py
index a3a9749162..75f3c49908 100644
--- a/tests/modeltests/test_client/models.py
+++ b/tests/modeltests/test_client/models.py
@@ -81,7 +81,43 @@ class ClientTest(TestCase):
# Check that the response was a 302 (redirect)
self.assertEqual(response.status_code, 302)
-
+
+ def test_valid_form(self):
+ "POST valid data to a form"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'foo@example.com',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.template.name, "Valid POST Template")
+
+ def test_incomplete_data_form(self):
+ "POST incomplete data to a form"
+ post_data = {
+ 'text': 'Hello World',
+ 'value': 37
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.template.name, "Invalid POST Template")
+
+ def test_form_error(self):
+ "POST erroneous data to a form"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'not an email address',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.template.name, "Invalid POST Template")
+
def test_unknown_page(self):
"GET an invalid URL"
response = self.client.get('/test_client/unknown_view/')
diff --git a/tests/modeltests/test_client/urls.py b/tests/modeltests/test_client/urls.py
index 0bef1e9b71..707ecc186d 100644
--- a/tests/modeltests/test_client/urls.py
+++ b/tests/modeltests/test_client/urls.py
@@ -6,6 +6,7 @@ urlpatterns = patterns('',
(r'^post_view/$', views.post_view),
(r'^raw_post_view/$', views.raw_post_view),
(r'^redirect_view/$', views.redirect_view),
+ (r'^form_view/$', views.form_view),
(r'^login_protected_view/$', views.login_protected_view),
(r'^session_view/$', views.session_view),
(r'^broken_view/$', views.broken_view)
diff --git a/tests/modeltests/test_client/views.py b/tests/modeltests/test_client/views.py
index 653e9a10e9..36ec144cf6 100644
--- a/tests/modeltests/test_client/views.py
+++ b/tests/modeltests/test_client/views.py
@@ -2,6 +2,8 @@ from xml.dom.minidom import parseString
from django.template import Context, Template
from django.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth.decorators import login_required
+from django.newforms.forms import Form
+from django.newforms import fields
def get_view(request):
"A simple view that expects a GET request, and returns a rendered template"
@@ -45,7 +47,39 @@ def raw_post_view(request):
def redirect_view(request):
"A view that redirects all requests to the GET view"
return HttpResponseRedirect('/test_client/get_view/')
+
+TestChoices = (
+ ('a', 'First Choice'),
+ ('b', 'Second Choice'),
+ ('c', 'Third Choice'),
+ ('d', 'Fourth Choice'),
+ ('e', 'Fifth Choice')
+)
+
+class TestForm(Form):
+ text = fields.CharField()
+ email = fields.EmailField()
+ value = fields.IntegerField()
+ single = fields.ChoiceField(choices=TestChoices)
+ multi = fields.MultipleChoiceField(choices=TestChoices)
+
+def form_view(request):
+ "A view that tests a simple form"
+ if request.method == 'POST':
+ form = TestForm(request.POST)
+ if form.is_valid():
+ t = Template('Valid POST data.', name='Valid POST Template')
+ c = Context()
+ else:
+ t = Template('Invalid POST data. {{ form.errors }}', name='Invalid POST Template')
+ c = Context({'form': form})
+ else:
+ form = TestForm()
+ t = Template('Viewing base form. {{ form }}.', name='Form GET Template')
+ c = Context({'form': form})
+ return HttpResponse(t.render(c))
+
def login_protected_view(request):
"A simple view that is login protected."
t = Template('This is a login protected test. Username is {{ user.username }}.', name='Login Template')
diff --git a/tests/regressiontests/datastructures/tests.py b/tests/regressiontests/datastructures/tests.py
index 624e7a50bf..e008c255f1 100644
--- a/tests/regressiontests/datastructures/tests.py
+++ b/tests/regressiontests/datastructures/tests.py
@@ -31,4 +31,35 @@
'nonexistent'
>>> d.setlist('lastname', ['Holovaty', 'Willison'])
-""" \ No newline at end of file
+### SortedDict #################################################################
+
+>>> d = SortedDict()
+>>> d['one'] = 'one'
+>>> d['two'] = 'two'
+>>> d['three'] = 'three'
+>>> d['one']
+'one'
+>>> d['two']
+'two'
+>>> d['three']
+'three'
+>>> d.keys()
+['one', 'two', 'three']
+>>> d.values()
+['one', 'two', 'three']
+>>> d['one'] = 'not one'
+>>> d['one']
+'not one'
+>>> d.keys() == d.copy().keys()
+True
+
+### DotExpandedDict ############################################################
+
+>>> d = DotExpandedDict({'person.1.firstname': ['Simon'], 'person.1.lastname': ['Willison'], 'person.2.firstname': ['Adrian'], 'person.2.lastname': ['Holovaty']})
+>>> d['person']['1']['lastname']
+['Willison']
+>>> d['person']['2']['lastname']
+['Holovaty']
+>>> d['person']['2']['firstname']
+['Adrian']
+"""
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index c850806052..db3f7fab2a 100644
--- a/tests/regressiontests/defaultfilters/tests.py
+++ b/tests/regressiontests/defaultfilters/tests.py
@@ -133,6 +133,12 @@ u'\xcb'
>>> wordwrap('this is a long paragraph of text that really needs to be wrapped I\'m afraid', 14)
"this is a long\nparagraph of\ntext that\nreally needs\nto be wrapped\nI'm afraid"
+>>> wordwrap('this is a short paragraph of text.\n But this line should be indented',14)
+'this is a\nshort\nparagraph of\ntext.\n But this\nline should be\nindented'
+
+>>> wordwrap('this is a short paragraph of text.\n But this line should be indented',15)
+'this is a short\nparagraph of\ntext.\n But this line\nshould be\nindented'
+
>>> ljust('test', 10)
'test '
diff --git a/tests/regressiontests/many_to_one_regress/models.py b/tests/regressiontests/many_to_one_regress/models.py
index 6c067446b1..8ddec98da4 100644
--- a/tests/regressiontests/many_to_one_regress/models.py
+++ b/tests/regressiontests/many_to_one_regress/models.py
@@ -1,13 +1,34 @@
from django.db import models
+# If ticket #1578 ever slips back in, these models will not be able to be
+# created (the field names being lower-cased versions of their opposite
+# classes is important here).
+
class First(models.Model):
second = models.IntegerField()
class Second(models.Model):
first = models.ForeignKey(First, related_name = 'the_first')
-# If ticket #1578 ever slips back in, these models will not be able to be
-# created (the field names being lower-cased versions of their opposite
-# classes is important here).
+# Protect against repetition of #1839, #2415 and #2536.
+class Third(models.Model):
+ name = models.CharField(maxlength=20)
+ third = models.ForeignKey('self', null=True, related_name='child_set')
+
+class Parent(models.Model):
+ name = models.CharField(maxlength=20)
+ bestchild = models.ForeignKey('Child', null=True, related_name='favored_by')
+
+class Child(models.Model):
+ name = models.CharField(maxlength=20)
+ parent = models.ForeignKey(Parent)
+
-__test__ = {'API_TESTS':""}
+__test__ = {'API_TESTS':"""
+>>> Third.AddManipulator().save(dict(id='3', name='An example', another=None))
+<Third: Third object>
+>>> parent = Parent(name = 'fred')
+>>> parent.save()
+>>> Child.AddManipulator().save(dict(name='bam-bam', parent=parent.id))
+<Child: Child object>
+"""}
diff --git a/tests/regressiontests/serializers_regress/__init__.py b/tests/regressiontests/serializers_regress/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/serializers_regress/__init__.py
diff --git a/tests/regressiontests/serializers_regress/models.py b/tests/regressiontests/serializers_regress/models.py
new file mode 100644
index 0000000000..d3415ac1b9
--- /dev/null
+++ b/tests/regressiontests/serializers_regress/models.py
@@ -0,0 +1,187 @@
+"""
+A test spanning all the capabilities of all the serializers.
+
+This class sets up a model for each model field type
+(except for image types, because of the PIL dependency).
+"""
+
+from django.db import models
+from django.contrib.contenttypes.models import ContentType
+
+# The following classes are for testing basic data
+# marshalling, including NULL values.
+
+class BooleanData(models.Model):
+ data = models.BooleanField(null=True)
+
+class CharData(models.Model):
+ data = models.CharField(maxlength=30, null=True)
+
+class DateData(models.Model):
+ data = models.DateField(null=True)
+
+class DateTimeData(models.Model):
+ data = models.DateTimeField(null=True)
+
+class EmailData(models.Model):
+ data = models.EmailField(null=True)
+
+class FileData(models.Model):
+ data = models.FileField(null=True, upload_to='/foo/bar')
+
+class FilePathData(models.Model):
+ data = models.FilePathField(null=True)
+
+class FloatData(models.Model):
+ data = models.FloatField(null=True, decimal_places=3, max_digits=5)
+
+class IntegerData(models.Model):
+ data = models.IntegerField(null=True)
+
+# class ImageData(models.Model):
+# data = models.ImageField(null=True)
+
+class IPAddressData(models.Model):
+ data = models.IPAddressField(null=True)
+
+class NullBooleanData(models.Model):
+ data = models.NullBooleanField(null=True)
+
+class PhoneData(models.Model):
+ data = models.PhoneNumberField(null=True)
+
+class PositiveIntegerData(models.Model):
+ data = models.PositiveIntegerField(null=True)
+
+class PositiveSmallIntegerData(models.Model):
+ data = models.PositiveSmallIntegerField(null=True)
+
+class SlugData(models.Model):
+ data = models.SlugField(null=True)
+
+class SmallData(models.Model):
+ data = models.SmallIntegerField(null=True)
+
+class TextData(models.Model):
+ data = models.TextField(null=True)
+
+class TimeData(models.Model):
+ data = models.TimeField(null=True)
+
+class USStateData(models.Model):
+ data = models.USStateField(null=True)
+
+class XMLData(models.Model):
+ data = models.XMLField(null=True)
+
+class Tag(models.Model):
+ """A tag on an item."""
+ data = models.SlugField()
+ content_type = models.ForeignKey(ContentType)
+ object_id = models.PositiveIntegerField()
+
+ content_object = models.GenericForeignKey()
+
+ class Meta:
+ ordering = ["data"]
+
+class GenericData(models.Model):
+ data = models.CharField(maxlength=30)
+
+ tags = models.GenericRelation(Tag)
+
+# The following test classes are all for validation
+# of related objects; in particular, forward, backward,
+# and self references.
+
+class Anchor(models.Model):
+ """This is a model that can be used as
+ something for other models to point at"""
+
+ data = models.CharField(maxlength=30)
+
+class FKData(models.Model):
+ data = models.ForeignKey(Anchor, null=True)
+
+class M2MData(models.Model):
+ data = models.ManyToManyField(Anchor, null=True)
+
+class O2OData(models.Model):
+ data = models.OneToOneField(Anchor, null=True)
+
+class FKSelfData(models.Model):
+ data = models.ForeignKey('self', null=True)
+
+class M2MSelfData(models.Model):
+ data = models.ManyToManyField('self', null=True, symmetrical=False)
+
+# The following test classes are for validating the
+# deserialization of objects that use a user-defined
+# field as the primary key.
+# Some of these data types have been commented out
+# because they can't be used as a primary key on one
+# or all database backends.
+
+class BooleanPKData(models.Model):
+ data = models.BooleanField(primary_key=True)
+
+class CharPKData(models.Model):
+ data = models.CharField(maxlength=30, primary_key=True)
+
+# class DatePKData(models.Model):
+# data = models.DateField(primary_key=True)
+
+# class DateTimePKData(models.Model):
+# data = models.DateTimeField(primary_key=True)
+
+class EmailPKData(models.Model):
+ data = models.EmailField(primary_key=True)
+
+class FilePKData(models.Model):
+ data = models.FileField(primary_key=True, upload_to='/foo/bar')
+
+class FilePathPKData(models.Model):
+ data = models.FilePathField(primary_key=True)
+
+class FloatPKData(models.Model):
+ data = models.FloatField(primary_key=True, decimal_places=3, max_digits=5)
+
+class IntegerPKData(models.Model):
+ data = models.IntegerField(primary_key=True)
+
+# class ImagePKData(models.Model):
+# data = models.ImageField(primary_key=True)
+
+class IPAddressPKData(models.Model):
+ data = models.IPAddressField(primary_key=True)
+
+class NullBooleanPKData(models.Model):
+ data = models.NullBooleanField(primary_key=True)
+
+class PhonePKData(models.Model):
+ data = models.PhoneNumberField(primary_key=True)
+
+class PositiveIntegerPKData(models.Model):
+ data = models.PositiveIntegerField(primary_key=True)
+
+class PositiveSmallIntegerPKData(models.Model):
+ data = models.PositiveSmallIntegerField(primary_key=True)
+
+class SlugPKData(models.Model):
+ data = models.SlugField(primary_key=True)
+
+class SmallPKData(models.Model):
+ data = models.SmallIntegerField(primary_key=True)
+
+# class TextPKData(models.Model):
+# data = models.TextField(primary_key=True)
+
+# class TimePKData(models.Model):
+# data = models.TimeField(primary_key=True)
+
+class USStatePKData(models.Model):
+ data = models.USStateField(primary_key=True)
+
+# class XMLPKData(models.Model):
+# data = models.XMLField(primary_key=True)
+
diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py
new file mode 100644
index 0000000000..97b3fbacbe
--- /dev/null
+++ b/tests/regressiontests/serializers_regress/tests.py
@@ -0,0 +1,263 @@
+"""
+A test spanning all the capabilities of all the serializers.
+
+This class defines sample data and a dynamically generated
+test case that is capable of testing the capabilities of
+the serializers. This includes all valid data values, plus
+forward, backwards and self references.
+"""
+
+
+import unittest, datetime
+
+from django.utils.functional import curry
+from django.core import serializers
+from django.db import transaction
+from django.core import management
+
+from models import *
+
+# A set of functions that can be used to recreate
+# test data objects of various kinds
+def data_create(pk, klass, data):
+ instance = klass(id=pk)
+ instance.data = data
+ instance.save()
+ return instance
+
+def generic_create(pk, klass, data):
+ instance = klass(id=pk)
+ instance.data = data[0]
+ instance.save()
+ for tag in data[1:]:
+ instance.tags.create(data=tag)
+ return instance
+
+def fk_create(pk, klass, data):
+ instance = klass(id=pk)
+ setattr(instance, 'data_id', data)
+ instance.save()
+ return instance
+
+def m2m_create(pk, klass, data):
+ instance = klass(id=pk)
+ instance.save()
+ instance.data = data
+ return instance
+
+def o2o_create(pk, klass, data):
+ instance = klass()
+ instance.data_id = data
+ instance.save()
+ return instance
+
+def pk_create(pk, klass, data):
+ instance = klass()
+ instance.data = data
+ instance.save()
+ return instance
+
+# A set of functions that can be used to compare
+# test data objects of various kinds
+def data_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(id=pk)
+ testcase.assertEqual(data, instance.data,
+ "Objects with PK=%d not equal; expected '%s' (%s), got '%s' (%s)" % (pk,data, type(data), instance.data, type(instance.data)))
+
+def generic_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(id=pk)
+ testcase.assertEqual(data[0], instance.data)
+ testcase.assertEqual(data[1:], [t.data for t in instance.tags.all()])
+
+def fk_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(id=pk)
+ testcase.assertEqual(data, instance.data_id)
+
+def m2m_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(id=pk)
+ testcase.assertEqual(data, [obj.id for obj in instance.data.all()])
+
+def o2o_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(data=data)
+ testcase.assertEqual(data, instance.data_id)
+
+def pk_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(data=data)
+ testcase.assertEqual(data, instance.data)
+
+# Define some data types. Each data type is
+# actually a pair of functions; one to create
+# and one to compare objects of that type
+data_obj = (data_create, data_compare)
+generic_obj = (generic_create, generic_compare)
+fk_obj = (fk_create, fk_compare)
+m2m_obj = (m2m_create, m2m_compare)
+o2o_obj = (o2o_create, o2o_compare)
+pk_obj = (pk_create, pk_compare)
+
+test_data = [
+ # Format: (data type, PK value, Model Class, data)
+ (data_obj, 1, BooleanData, True),
+ (data_obj, 2, BooleanData, False),
+ (data_obj, 10, CharData, "Test Char Data"),
+ (data_obj, 11, CharData, ""),
+ (data_obj, 12, CharData, "None"),
+ (data_obj, 13, CharData, "null"),
+ (data_obj, 14, CharData, "NULL"),
+ (data_obj, 15, CharData, None),
+ (data_obj, 20, DateData, datetime.date(2006,6,16)),
+ (data_obj, 21, DateData, None),
+ (data_obj, 30, DateTimeData, datetime.datetime(2006,6,16,10,42,37)),
+ (data_obj, 31, DateTimeData, None),
+ (data_obj, 40, EmailData, "hovercraft@example.com"),
+ (data_obj, 41, EmailData, None),
+ (data_obj, 50, FileData, 'file:///foo/bar/whiz.txt'),
+ (data_obj, 51, FileData, None),
+ (data_obj, 60, FilePathData, "/foo/bar/whiz.txt"),
+ (data_obj, 61, FilePathData, None),
+ (data_obj, 70, FloatData, 12.345),
+ (data_obj, 71, FloatData, -12.345),
+ (data_obj, 72, FloatData, 0.0),
+ (data_obj, 73, FloatData, None),
+ (data_obj, 80, IntegerData, 123456789),
+ (data_obj, 81, IntegerData, -123456789),
+ (data_obj, 82, IntegerData, 0),
+ (data_obj, 83, IntegerData, None),
+ #(XX, ImageData
+ (data_obj, 90, IPAddressData, "127.0.0.1"),
+ (data_obj, 91, IPAddressData, None),
+ (data_obj, 100, NullBooleanData, True),
+ (data_obj, 101, NullBooleanData, False),
+ (data_obj, 102, NullBooleanData, None),
+ (data_obj, 110, PhoneData, "212-634-5789"),
+ (data_obj, 111, PhoneData, None),
+ (data_obj, 120, PositiveIntegerData, 123456789),
+ (data_obj, 121, PositiveIntegerData, None),
+ (data_obj, 130, PositiveSmallIntegerData, 12),
+ (data_obj, 131, PositiveSmallIntegerData, None),
+ (data_obj, 140, SlugData, "this-is-a-slug"),
+ (data_obj, 141, SlugData, None),
+ (data_obj, 150, SmallData, 12),
+ (data_obj, 151, SmallData, -12),
+ (data_obj, 152, SmallData, 0),
+ (data_obj, 153, SmallData, None),
+ (data_obj, 160, TextData, """This is a long piece of text.
+It contains line breaks.
+Several of them.
+The end."""),
+ (data_obj, 161, TextData, ""),
+ (data_obj, 162, TextData, None),
+ (data_obj, 170, TimeData, datetime.time(10,42,37)),
+ (data_obj, 171, TimeData, None),
+ (data_obj, 180, USStateData, "MA"),
+ (data_obj, 181, USStateData, None),
+ (data_obj, 190, XMLData, "<foo></foo>"),
+ (data_obj, 191, XMLData, None),
+
+ (generic_obj, 200, GenericData, ['Generic Object 1', 'tag1', 'tag2']),
+ (generic_obj, 201, GenericData, ['Generic Object 2', 'tag2', 'tag3']),
+
+ (data_obj, 300, Anchor, "Anchor 1"),
+ (data_obj, 301, Anchor, "Anchor 2"),
+
+ (fk_obj, 400, FKData, 300), # Post reference
+ (fk_obj, 401, FKData, 500), # Pre reference
+ (fk_obj, 402, FKData, None), # Empty reference
+
+ (m2m_obj, 410, M2MData, []), # Empty set
+ (m2m_obj, 411, M2MData, [300,301]), # Post reference
+ (m2m_obj, 412, M2MData, [500,501]), # Pre reference
+ (m2m_obj, 413, M2MData, [300,301,500,501]), # Pre and Post reference
+
+ (o2o_obj, None, O2OData, 300), # Post reference
+ (o2o_obj, None, O2OData, 500), # Pre reference
+
+ (fk_obj, 430, FKSelfData, 431), # Pre reference
+ (fk_obj, 431, FKSelfData, 430), # Post reference
+ (fk_obj, 432, FKSelfData, None), # Empty reference
+
+ (m2m_obj, 440, M2MSelfData, []),
+ (m2m_obj, 441, M2MSelfData, []),
+ (m2m_obj, 442, M2MSelfData, [440, 441]),
+ (m2m_obj, 443, M2MSelfData, [445, 446]),
+ (m2m_obj, 444, M2MSelfData, [440, 441, 445, 446]),
+ (m2m_obj, 445, M2MSelfData, []),
+ (m2m_obj, 446, M2MSelfData, []),
+
+ (data_obj, 500, Anchor, "Anchor 3"),
+ (data_obj, 501, Anchor, "Anchor 4"),
+
+ (pk_obj, 601, BooleanPKData, True),
+ (pk_obj, 602, BooleanPKData, False),
+ (pk_obj, 610, CharPKData, "Test Char PKData"),
+# (pk_obj, 620, DatePKData, datetime.date(2006,6,16)),
+# (pk_obj, 630, DateTimePKData, datetime.datetime(2006,6,16,10,42,37)),
+ (pk_obj, 640, EmailPKData, "hovercraft@example.com"),
+ (pk_obj, 650, FilePKData, 'file:///foo/bar/whiz.txt'),
+ (pk_obj, 660, FilePathPKData, "/foo/bar/whiz.txt"),
+ (pk_obj, 670, FloatPKData, 12.345),
+ (pk_obj, 671, FloatPKData, -12.345),
+ (pk_obj, 672, FloatPKData, 0.0),
+ (pk_obj, 680, IntegerPKData, 123456789),
+ (pk_obj, 681, IntegerPKData, -123456789),
+ (pk_obj, 682, IntegerPKData, 0),
+# (XX, ImagePKData
+ (pk_obj, 690, IPAddressPKData, "127.0.0.1"),
+ (pk_obj, 700, NullBooleanPKData, True),
+ (pk_obj, 701, NullBooleanPKData, False),
+ (pk_obj, 710, PhonePKData, "212-634-5789"),
+ (pk_obj, 720, PositiveIntegerPKData, 123456789),
+ (pk_obj, 730, PositiveSmallIntegerPKData, 12),
+ (pk_obj, 740, SlugPKData, "this-is-a-slug"),
+ (pk_obj, 750, SmallPKData, 12),
+ (pk_obj, 751, SmallPKData, -12),
+ (pk_obj, 752, SmallPKData, 0),
+# (pk_obj, 760, TextPKData, """This is a long piece of text.
+# It contains line breaks.
+# Several of them.
+# The end."""),
+# (pk_obj, 770, TimePKData, datetime.time(10,42,37)),
+ (pk_obj, 780, USStatePKData, "MA"),
+# (pk_obj, 790, XMLPKData, "<foo></foo>"),
+]
+
+# Dynamically create serializer tests to ensure that all
+# registered serializers are automatically tested.
+class SerializerTests(unittest.TestCase):
+ pass
+
+def serializerTest(format, self):
+ # Clear the database first
+ management.flush(verbosity=0, interactive=False)
+
+ # Create all the objects defined in the test data
+ objects = []
+ transaction.enter_transaction_management()
+ transaction.managed(True)
+ for (func, pk, klass, datum) in test_data:
+ objects.append(func[0](pk, klass, datum))
+ transaction.commit()
+ transaction.leave_transaction_management()
+
+ # 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)
+
+ # Flush the database and recreate from the serialized data
+ management.flush(verbosity=0, interactive=False)
+ transaction.enter_transaction_management()
+ transaction.managed(True)
+ for obj in serializers.deserialize(format, serialized_data):
+ obj.save()
+ transaction.commit()
+ transaction.leave_transaction_management()
+
+ # 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)
+
+for format in serializers.get_serializer_formats():
+ setattr(SerializerTests, 'test_'+format+'_serializer', curry(serializerTest, format))
diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py
index 0165824951..375fd36196 100644
--- a/tests/regressiontests/templates/tests.py
+++ b/tests/regressiontests/templates/tests.py
@@ -401,6 +401,20 @@ class Templates(unittest.TestCase):
'ifequal-split09': (r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}", {'a': r"slash\man"}, "yes"),
'ifequal-split10': (r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}", {'a': r"slashman"}, "no"),
+ # NUMERIC RESOLUTION
+ 'ifequal-numeric01': ('{% ifequal x 5 %}yes{% endifequal %}', {'x': '5'}, ''),
+ 'ifequal-numeric02': ('{% ifequal x 5 %}yes{% endifequal %}', {'x': 5}, 'yes'),
+ 'ifequal-numeric03': ('{% ifequal x 5.2 %}yes{% endifequal %}', {'x': 5}, ''),
+ 'ifequal-numeric04': ('{% ifequal x 5.2 %}yes{% endifequal %}', {'x': 5.2}, 'yes'),
+ 'ifequal-numeric05': ('{% ifequal x 0.2 %}yes{% endifequal %}', {'x': .2}, 'yes'),
+ 'ifequal-numeric06': ('{% ifequal x .2 %}yes{% endifequal %}', {'x': .2}, 'yes'),
+ 'ifequal-numeric07': ('{% ifequal x 2. %}yes{% endifequal %}', {'x': 2}, ''),
+ 'ifequal-numeric08': ('{% ifequal x "5" %}yes{% endifequal %}', {'x': 5}, ''),
+ 'ifequal-numeric09': ('{% ifequal x "5" %}yes{% endifequal %}', {'x': '5'}, 'yes'),
+ 'ifequal-numeric10': ('{% ifequal x -5 %}yes{% endifequal %}', {'x': -5}, 'yes'),
+ 'ifequal-numeric11': ('{% ifequal x -5.2 %}yes{% endifequal %}', {'x': -5.2}, 'yes'),
+ 'ifequal-numeric12': ('{% ifequal x +5 %}yes{% endifequal %}', {'x': 5}, 'yes'),
+
### IFNOTEQUAL TAG ########################################################
'ifnotequal01': ("{% ifnotequal a b %}yes{% endifnotequal %}", {"a": 1, "b": 2}, "yes"),
'ifnotequal02': ("{% ifnotequal a b %}yes{% endifnotequal %}", {"a": 1, "b": 1}, ""),