summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJoseph Kocherhans <joseph@jkocherhans.com>2007-11-06 22:25:59 +0000
committerJoseph Kocherhans <joseph@jkocherhans.com>2007-11-06 22:25:59 +0000
commite29358827d1a384bac2f4590e113fc681796080a (patch)
tree69f4f64c02066e87f6e8a2e594d0faa3a14ddc4a /tests
parent6f15904669f884de75dbd4cc2b2e03880d81a9a8 (diff)
newforms-admin: Merged to [6652]
git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@6656 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/modeltests/field_subclassing/__init__.py0
-rw-r--r--tests/modeltests/field_subclassing/models.py106
-rw-r--r--tests/regressiontests/defaultfilters/tests.py4
-rw-r--r--tests/regressiontests/forms/error_messages.py315
-rw-r--r--tests/regressiontests/forms/extra.py3
-rw-r--r--tests/regressiontests/forms/regressions.py1
-rw-r--r--tests/regressiontests/forms/tests.py2
-rw-r--r--tests/regressiontests/forms/util.py7
-rw-r--r--tests/regressiontests/templates/urls.py2
-rw-r--r--tests/regressiontests/text/tests.py8
10 files changed, 445 insertions, 3 deletions
diff --git a/tests/modeltests/field_subclassing/__init__.py b/tests/modeltests/field_subclassing/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/modeltests/field_subclassing/__init__.py
diff --git a/tests/modeltests/field_subclassing/models.py b/tests/modeltests/field_subclassing/models.py
new file mode 100644
index 0000000000..6182266c22
--- /dev/null
+++ b/tests/modeltests/field_subclassing/models.py
@@ -0,0 +1,106 @@
+"""
+Tests for field subclassing.
+"""
+
+from django.db import models
+from django.utils.encoding import force_unicode
+from django.core import serializers
+
+class Small(object):
+ """
+ A simple class to show that non-trivial Python objects can be used as
+ attributes.
+ """
+ def __init__(self, first, second):
+ self.first, self.second = first, second
+
+ def __unicode__(self):
+ return u'%s%s' % (force_unicode(self.first), force_unicode(self.second))
+
+ def __str__(self):
+ return unicode(self).encode('utf-8')
+
+class SmallField(models.Field):
+ """
+ Turns the "Small" class into a Django field. Because of the similarities
+ with normal character fields and the fact that Small.__unicode__ does
+ something sensible, we don't need to implement a lot here.
+ """
+ __metaclass__ = models.SubfieldBase
+
+ def __init__(self, *args, **kwargs):
+ kwargs['max_length'] = 2
+ super(SmallField, self).__init__(*args, **kwargs)
+
+ def get_internal_type(self):
+ return 'CharField'
+
+ def to_python(self, value):
+ if isinstance(value, Small):
+ return value
+ return Small(value[0], value[1])
+
+ def get_db_prep_save(self, value):
+ return unicode(value)
+
+ def get_db_prep_lookup(self, lookup_type, value):
+ if lookup_type == 'exact':
+ return force_unicode(value)
+ if lookup_type == 'in':
+ return [force_unicode(v) for v in value]
+ if lookup_type == 'isnull':
+ return []
+ raise TypeError('Invalid lookup type: %r' % lookup_type)
+
+ def flatten_data(self, follow, obj=None):
+ return {self.attname: force_unicode(self._get_val_from_obj(obj))}
+
+class MyModel(models.Model):
+ name = models.CharField(max_length=10)
+ data = SmallField('small field')
+
+ def __unicode__(self):
+ return force_unicode(self.name)
+
+__test__ = {'API_TESTS': ur"""
+# Creating a model with custom fields is done as per normal.
+>>> s = Small(1, 2)
+>>> print s
+12
+>>> m = MyModel(name='m', data=s)
+>>> m.save()
+
+# Custom fields still have normal field's attributes.
+>>> m._meta.get_field('data').verbose_name
+'small field'
+
+# The m.data attribute has been initialised correctly. It's a Small object.
+>>> m.data.first, m.data.second
+(1, 2)
+
+# The data loads back from the database correctly and 'data' has the right type.
+>>> m1 = MyModel.objects.get(pk=m.pk)
+>>> isinstance(m1.data, Small)
+True
+>>> print m1.data
+12
+
+# We can do normal filtering on the custom field (and will get an error when we
+# use a lookup type that does not make sense).
+>>> s1 = Small(1, 3)
+>>> s2 = Small('a', 'b')
+>>> MyModel.objects.filter(data__in=[s, s1, s2])
+[<MyModel: m>]
+>>> MyModel.objects.filter(data__lt=s)
+Traceback (most recent call last):
+...
+TypeError: Invalid lookup type: 'lt'
+
+# Serialization works, too.
+>>> stream = serializers.serialize("json", MyModel.objects.all())
+>>> stream
+'[{"pk": 1, "model": "field_subclassing.mymodel", "fields": {"data": "12", "name": "m"}}]'
+>>> obj = list(serializers.deserialize("json", stream))[0]
+>>> obj.object == m
+True
+"""}
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index 9482f1cc9f..270642d4a0 100644
--- a/tests/regressiontests/defaultfilters/tests.py
+++ b/tests/regressiontests/defaultfilters/tests.py
@@ -17,6 +17,10 @@ u'0'
u'7.700'
>>> floatformat(6.000000,3)
u'6.000'
+>>> floatformat(6.200000, 3)
+u'6.200'
+>>> floatformat(6.200000, -3)
+u'6.200'
>>> floatformat(13.1031,-3)
u'13.103'
>>> floatformat(11.1197, -2)
diff --git a/tests/regressiontests/forms/error_messages.py b/tests/regressiontests/forms/error_messages.py
new file mode 100644
index 0000000000..ff7e110f6f
--- /dev/null
+++ b/tests/regressiontests/forms/error_messages.py
@@ -0,0 +1,315 @@
+# -*- coding: utf-8 -*-
+tests = r"""
+>>> from django.newforms import *
+
+# CharField ###################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['min_length'] = 'LENGTH %(length)s, MIN LENGTH %(min)s'
+>>> e['max_length'] = 'LENGTH %(length)s, MAX LENGTH %(max)s'
+>>> f = CharField(min_length=5, max_length=10, error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('1234')
+Traceback (most recent call last):
+...
+ValidationError: [u'LENGTH 4, MIN LENGTH 5']
+>>> f.clean('12345678901')
+Traceback (most recent call last):
+...
+ValidationError: [u'LENGTH 11, MAX LENGTH 10']
+
+# IntegerField ################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> e['min_value'] = 'MIN VALUE IS %s'
+>>> e['max_value'] = 'MAX VALUE IS %s'
+>>> f = IntegerField(min_value=5, max_value=10, error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abc')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+>>> f.clean('4')
+Traceback (most recent call last):
+...
+ValidationError: [u'MIN VALUE IS 5']
+>>> f.clean('11')
+Traceback (most recent call last):
+...
+ValidationError: [u'MAX VALUE IS 10']
+
+# FloatField ##################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> e['min_value'] = 'MIN VALUE IS %s'
+>>> e['max_value'] = 'MAX VALUE IS %s'
+>>> f = FloatField(min_value=5, max_value=10, error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abc')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+>>> f.clean('4')
+Traceback (most recent call last):
+...
+ValidationError: [u'MIN VALUE IS 5']
+>>> f.clean('11')
+Traceback (most recent call last):
+...
+ValidationError: [u'MAX VALUE IS 10']
+
+# DecimalField ################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> e['min_value'] = 'MIN VALUE IS %s'
+>>> e['max_value'] = 'MAX VALUE IS %s'
+>>> e['max_digits'] = 'MAX DIGITS IS %s'
+>>> e['max_decimal_places'] = 'MAX DP IS %s'
+>>> e['max_whole_digits'] = 'MAX DIGITS BEFORE DP IS %s'
+>>> f = DecimalField(min_value=5, max_value=10, error_messages=e)
+>>> f2 = DecimalField(max_digits=4, decimal_places=2, error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abc')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+>>> f.clean('4')
+Traceback (most recent call last):
+...
+ValidationError: [u'MIN VALUE IS 5']
+>>> f.clean('11')
+Traceback (most recent call last):
+...
+ValidationError: [u'MAX VALUE IS 10']
+>>> f2.clean('123.45')
+Traceback (most recent call last):
+...
+ValidationError: [u'MAX DIGITS IS 4']
+>>> f2.clean('1.234')
+Traceback (most recent call last):
+...
+ValidationError: [u'MAX DP IS 2']
+>>> f2.clean('123.4')
+Traceback (most recent call last):
+...
+ValidationError: [u'MAX DIGITS BEFORE DP IS 2']
+
+# DateField ###################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> f = DateField(error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abc')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+
+# TimeField ###################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> f = TimeField(error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abc')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+
+# DateTimeField ###############################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> f = DateTimeField(error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abc')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+
+# RegexField ##################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> e['min_length'] = 'LENGTH %(length)s, MIN LENGTH %(min)s'
+>>> e['max_length'] = 'LENGTH %(length)s, MAX LENGTH %(max)s'
+>>> f = RegexField(r'^\d+$', min_length=5, max_length=10, error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abcde')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+>>> f.clean('1234')
+Traceback (most recent call last):
+...
+ValidationError: [u'LENGTH 4, MIN LENGTH 5']
+>>> f.clean('12345678901')
+Traceback (most recent call last):
+...
+ValidationError: [u'LENGTH 11, MAX LENGTH 10']
+
+# EmailField ##################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> e['min_length'] = 'LENGTH %(length)s, MIN LENGTH %(min)s'
+>>> e['max_length'] = 'LENGTH %(length)s, MAX LENGTH %(max)s'
+>>> f = EmailField(min_length=8, max_length=10, error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abcdefgh')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+>>> f.clean('a@b.com')
+Traceback (most recent call last):
+...
+ValidationError: [u'LENGTH 7, MIN LENGTH 8']
+>>> f.clean('aye@bee.com')
+Traceback (most recent call last):
+...
+ValidationError: [u'LENGTH 11, MAX LENGTH 10']
+
+# FileField ##################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> e['missing'] = 'MISSING'
+>>> e['empty'] = 'EMPTY FILE'
+>>> f = FileField(error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abc')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+>>> f.clean({})
+Traceback (most recent call last):
+...
+ValidationError: [u'MISSING']
+>>> f.clean({'filename': 'name', 'content':''})
+Traceback (most recent call last):
+...
+ValidationError: [u'EMPTY FILE']
+
+# URLField ##################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID'
+>>> e['invalid_link'] = 'INVALID LINK'
+>>> f = URLField(verify_exists=True, error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('abc.c')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID']
+>>> f.clean('http://www.jfoiwjfoi23jfoijoaijfoiwjofiwjefewl.com')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID LINK']
+
+# BooleanField ################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> f = BooleanField(error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+
+# ChoiceField #################################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid_choice'] = '%(value)s IS INVALID CHOICE'
+>>> f = ChoiceField(choices=[('a', 'aye')], error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('b')
+Traceback (most recent call last):
+...
+ValidationError: [u'b IS INVALID CHOICE']
+
+# MultipleChoiceField #########################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid_choice'] = '%(value)s IS INVALID CHOICE'
+>>> e['invalid_list'] = 'NOT A LIST'
+>>> f = MultipleChoiceField(choices=[('a', 'aye')], error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('b')
+Traceback (most recent call last):
+...
+ValidationError: [u'NOT A LIST']
+>>> f.clean(['b'])
+Traceback (most recent call last):
+...
+ValidationError: [u'b IS INVALID CHOICE']
+
+# SplitDateTimeField ##########################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid_date'] = 'INVALID DATE'
+>>> e['invalid_time'] = 'INVALID TIME'
+>>> f = SplitDateTimeField(error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean(['a', 'b'])
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID DATE', u'INVALID TIME']
+
+# IPAddressField ##############################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid'] = 'INVALID IP ADDRESS'
+>>> f = IPAddressField(error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('127.0.0')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID IP ADDRESS']
+"""
diff --git a/tests/regressiontests/forms/extra.py b/tests/regressiontests/forms/extra.py
index 7f6175f649..9dff4071f1 100644
--- a/tests/regressiontests/forms/extra.py
+++ b/tests/regressiontests/forms/extra.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
tests = r"""
>>> from django.newforms import *
+>>> from django.utils.encoding import force_unicode
>>> import datetime
>>> import time
>>> import re
@@ -362,7 +363,7 @@ u'sirrobin'
... return self.as_divs()
... def as_divs(self):
... if not self: return u''
-... return u'<div class="errorlist">%s</div>' % ''.join([u'<div class="error">%s</div>' % e for e in self])
+... return u'<div class="errorlist">%s</div>' % ''.join([u'<div class="error">%s</div>' % force_unicode(e) for e in self])
>>> class CommentForm(Form):
... name = CharField(max_length=50, required=False)
... email = EmailField()
diff --git a/tests/regressiontests/forms/regressions.py b/tests/regressiontests/forms/regressions.py
index 1bfb425188..1bb6f6e7e5 100644
--- a/tests/regressiontests/forms/regressions.py
+++ b/tests/regressiontests/forms/regressions.py
@@ -26,7 +26,6 @@ There were some problems with form translations in #3600
Translations are done at rendering time, so multi-lingual apps can define forms
early and still send back the right translation.
-# XFAIL
>>> activate('de')
>>> print f.as_p()
<p><label for="id_username">Benutzername:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>
diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py
index e90d6d2510..333b928700 100644
--- a/tests/regressiontests/forms/tests.py
+++ b/tests/regressiontests/forms/tests.py
@@ -2,6 +2,7 @@
from extra import tests as extra_tests
from fields import tests as fields_tests
from forms import tests as form_tests
+from error_messages import tests as custom_error_message_tests
from localflavor.ar import tests as localflavor_ar_tests
from localflavor.au import tests as localflavor_au_tests
from localflavor.br import tests as localflavor_br_tests
@@ -31,6 +32,7 @@ __test__ = {
'extra_tests': extra_tests,
'fields_tests': fields_tests,
'form_tests': form_tests,
+ 'custom_error_message_tests': custom_error_message_tests,
'localflavor_ar_tests': localflavor_ar_tests,
'localflavor_au_tests': localflavor_au_tests,
'localflavor_br_tests': localflavor_br_tests,
diff --git a/tests/regressiontests/forms/util.py b/tests/regressiontests/forms/util.py
index 4f81709082..bfaf73f6bc 100644
--- a/tests/regressiontests/forms/util.py
+++ b/tests/regressiontests/forms/util.py
@@ -42,4 +42,11 @@ u''
# Can take a mixture in a list.
>>> print ValidationError(["First error.", u"Not \u03C0.", ugettext_lazy("Error.")]).messages
<ul class="errorlist"><li>First error.</li><li>Not π.</li><li>Error.</li></ul>
+
+>>> class VeryBadError:
+... def __unicode__(self): return u"A very bad error."
+
+# Can take a non-string.
+>>> print ValidationError(VeryBadError()).messages
+<ul class="errorlist"><li>A very bad error.</li></ul>
"""
diff --git a/tests/regressiontests/templates/urls.py b/tests/regressiontests/templates/urls.py
index d79f38e0a7..3b28e70d0b 100644
--- a/tests/regressiontests/templates/urls.py
+++ b/tests/regressiontests/templates/urls.py
@@ -7,7 +7,7 @@ urlpatterns = patterns('',
# Test urls for testing reverse lookups
(r'^$', views.index),
(r'^client/(\d+)/$', views.client),
- (r'^client/(\d+)/(?P<action>[^/]+)/$', views.client_action),
+ (r'^client/(?P<id>\d+)/(?P<action>[^/]+)/$', views.client_action),
url(r'^named-client/(\d+)/$', views.client, name="named.client"),
# Unicode strings are permitted everywhere.
diff --git a/tests/regressiontests/text/tests.py b/tests/regressiontests/text/tests.py
index 962a30ef19..7cfe44517a 100644
--- a/tests/regressiontests/text/tests.py
+++ b/tests/regressiontests/text/tests.py
@@ -27,6 +27,14 @@ u'Paris+%26+Orl%C3%A9ans'
>>> urlquote_plus(u'Paris & Orl\xe9ans', safe="&")
u'Paris+&+Orl%C3%A9ans'
+### cookie_date, http_date ###############################################
+>>> from django.utils.http import cookie_date, http_date
+>>> t = 1167616461.0
+>>> cookie_date(t)
+'Mon, 01-Jan-2007 01:54:21 GMT'
+>>> http_date(t)
+'Mon, 01 Jan 2007 01:54:21 GMT'
+
### iri_to_uri ###########################################################
>>> from django.utils.encoding import iri_to_uri
>>> iri_to_uri(u'red%09ros\xe9#red')