diff options
| author | Justin Bronn <jbronn@gmail.com> | 2007-10-26 20:47:20 +0000 |
|---|---|---|
| committer | Justin Bronn <jbronn@gmail.com> | 2007-10-26 20:47:20 +0000 |
| commit | 4ffbddf92d89c3b31cef90043721184a501cd454 (patch) | |
| tree | db8131d40b0a5437270a6b1e8d579113ab3508e8 /tests | |
| parent | f66ee9d0065838a0f6c9c76203a775a78446cdf7 (diff) | |
gis: Merged revisions 6525-6613 via svnmerge from [repos:django/trunk trunk].
git-svn-id: http://code.djangoproject.com/svn/django/branches/gis@6615 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/modeltests/invalid_models/models.py | 6 | ||||
| -rw-r--r-- | tests/regressiontests/auth_backends/tests.py | 30 | ||||
| -rw-r--r-- | tests/regressiontests/cache/tests.py | 6 | ||||
| -rw-r--r-- | tests/regressiontests/datastructures/tests.py | 11 | ||||
| -rw-r--r-- | tests/regressiontests/forms/localflavor/es.py | 343 | ||||
| -rw-r--r-- | tests/regressiontests/forms/localflavor/pl.py | 30 | ||||
| -rw-r--r-- | tests/regressiontests/forms/models.py | 50 | ||||
| -rw-r--r-- | tests/regressiontests/forms/tests.py | 2 | ||||
| -rw-r--r-- | tests/regressiontests/forms/widgets.py | 23 | ||||
| -rw-r--r-- | tests/regressiontests/i18n/misc.py | 57 | ||||
| -rw-r--r-- | tests/regressiontests/i18n/tests.py | 8 | ||||
| -rw-r--r-- | tests/regressiontests/templates/tests.py | 23 | ||||
| -rw-r--r-- | tests/regressiontests/text/tests.py | 4 | ||||
| -rw-r--r-- | tests/regressiontests/utils/tests.py | 28 | ||||
| -rwxr-xr-x | tests/runtests.py | 3 |
15 files changed, 588 insertions, 36 deletions
diff --git a/tests/modeltests/invalid_models/models.py b/tests/modeltests/invalid_models/models.py index 1afe660dd0..b746af6dba 100644 --- a/tests/modeltests/invalid_models/models.py +++ b/tests/modeltests/invalid_models/models.py @@ -14,6 +14,7 @@ class FieldErrors(models.Model): choices = models.CharField(max_length=10, choices='bad') choices2 = models.CharField(max_length=10, choices=[(1,2,3),(1,2,3)]) index = models.CharField(max_length=10, db_index='bad') + field_ = models.CharField(max_length=10) class Target(models.Model): tgt_safe = models.CharField(max_length=10) @@ -47,7 +48,7 @@ class Target2(models.Model): class Clash3(models.Model): src_safe = models.CharField(max_length=10, core=True) - + foreign_1 = models.ForeignKey(Target2, related_name='foreign_tgt') foreign_2 = models.ForeignKey(Target2, related_name='m2m_tgt') @@ -76,7 +77,7 @@ class ValidM2M(models.Model): # on self don't require a related accessor, so many potential # clashes are avoided. validm2m_set = models.ManyToManyField("ValidM2M") - + m2m_1 = models.ManyToManyField("ValidM2M", related_name='id') m2m_2 = models.ManyToManyField("ValidM2M", related_name='src_safe') @@ -116,6 +117,7 @@ invalid_models.fielderrors: "choices": "choices" should be iterable (e.g., a tup invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples. invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples. invalid_models.fielderrors: "index": "db_index" should be either None, True or False. +invalid_models.fielderrors: "field_": Field names cannot end with underscores, because this would lead to ambiguous queryset filters. invalid_models.clash1: Accessor for field 'foreign' clashes with field 'Target.clash1_set'. Add a related_name argument to the definition for 'foreign'. invalid_models.clash1: Accessor for field 'foreign' clashes with related m2m field 'Target.clash1_set'. Add a related_name argument to the definition for 'foreign'. invalid_models.clash1: Reverse query name for field 'foreign' clashes with field 'Target.clash1'. Add a related_name argument to the definition for 'foreign'. diff --git a/tests/regressiontests/auth_backends/tests.py b/tests/regressiontests/auth_backends/tests.py index 71e58442e7..3ec2a059ad 100644 --- a/tests/regressiontests/auth_backends/tests.py +++ b/tests/regressiontests/auth_backends/tests.py @@ -1,4 +1,9 @@ -""" +try: + set +except NameError: + from sets import Set as set # Python 2.3 fallback + +__test__ = {'API_TESTS': """ >>> from django.contrib.auth.models import User, Group, Permission >>> from django.contrib.contenttypes.models import ContentType @@ -28,10 +33,10 @@ False # reloading user to purge the _perm_cache >>> user = User.objects.get(username="test") ->>> user.get_all_permissions() -set([u'auth.test']) ->>> user.get_group_permissions() -set([]) +>>> user.get_all_permissions() == set([u'auth.test']) +True +>>> user.get_group_permissions() == set([]) +True >>> user.has_module_perms("Group") False >>> user.has_module_perms("auth") @@ -43,8 +48,8 @@ True >>> user.user_permissions.add(perm) >>> user.save() >>> user = User.objects.get(username="test") ->>> user.get_all_permissions() -set([u'auth.test2', u'auth.test', u'auth.test3']) +>>> user.get_all_permissions() == set([u'auth.test2', u'auth.test', u'auth.test3']) +True >>> user.has_perm('test') False >>> user.has_perm('auth.test') @@ -57,10 +62,11 @@ True >>> group.save() >>> user.groups.add(group) >>> user = User.objects.get(username="test") ->>> user.get_all_permissions() -set([u'auth.test2', u'auth.test', u'auth.test3', u'auth.test_group']) ->>> user.get_group_permissions() -set([u'auth.test_group']) +>>> exp = set([u'auth.test2', u'auth.test', u'auth.test3', u'auth.test_group']) +>>> user.get_all_permissions() == exp +True +>>> user.get_group_permissions() == set([u'auth.test_group']) +True >>> user.has_perms(['auth.test3', 'auth.test_group']) True -"""
\ No newline at end of file +"""} diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py index 752083bd2f..3879da7703 100644 --- a/tests/regressiontests/cache/tests.py +++ b/tests/regressiontests/cache/tests.py @@ -19,6 +19,12 @@ class Cache(unittest.TestCase): cache.set("key", "value") self.assertEqual(cache.get("key"), "value") + def test_add(self): + # test add (only add if key isn't already in cache) + cache.add("addkey1", "value") + cache.add("addkey1", "newvalue") + self.assertEqual(cache.get("addkey1"), "value") + def test_non_existent(self): # get with non-existent keys self.assertEqual(cache.get("does_not_exist"), None) diff --git a/tests/regressiontests/datastructures/tests.py b/tests/regressiontests/datastructures/tests.py index b58ee79693..d1e21e673c 100644 --- a/tests/regressiontests/datastructures/tests.py +++ b/tests/regressiontests/datastructures/tests.py @@ -54,6 +54,17 @@ True >>> print repr(d) {'one': 'not one', 'two': 'two', 'three': 'three'} +>>> d.pop('one', 'missing') +'not one' +>>> d.pop('one', 'missing') +'missing' + +We don't know which item will be popped in popitem(), so we'll just check that +the number of keys has decreased. +>>> l = len(d) +>>> _ = d.popitem() +>>> l - len(d) +1 Init from sequence of tuples >>> d = SortedDict(( diff --git a/tests/regressiontests/forms/localflavor/es.py b/tests/regressiontests/forms/localflavor/es.py new file mode 100644 index 0000000000..f149aa9cbe --- /dev/null +++ b/tests/regressiontests/forms/localflavor/es.py @@ -0,0 +1,343 @@ +# -*- coding: utf-8 -*- +# Tests for the contrib/localflavor/ ES form fields. + +tests = r""" +# ESPostalCodeField ############################################################## + +ESPostalCodeField validates that data is a five-digit spanish postal code. +>>> from django.contrib.localflavor.es.forms import ESPostalCodeField +>>> f = ESPostalCodeField() +>>> f.clean('08028') +u'08028' +>>> f.clean('28080') +u'28080' +>>> f.clean('53001') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('0801') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('080001') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('00999') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('08 01') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('08A01') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('') +Traceback (most recent call last): +... +ValidationError: [u'This field is required.'] + +>>> f = ESPostalCodeField(required=False) +>>> f.clean('08028') +u'08028' +>>> f.clean('28080') +u'28080' +>>> f.clean('53001') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('0801') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('080001') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('00999') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('08 01') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('08A01') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] +>>> f.clean('') +u'' + +# ESPhoneNumberField ############################################################## + +ESPhoneNumberField validates that data is a nine-digit spanish phone number. +>>> from django.contrib.localflavor.es.forms import ESPhoneNumberField +>>> f = ESPhoneNumberField() +>>> f.clean('650010101') +u'650010101' +>>> f.clean('931234567') +u'931234567' +>>> f.clean('800123123') +u'800123123' +>>> f.clean('555555555') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX.'] +>>> f.clean('789789789') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX.'] +>>> f.clean('99123123') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX.'] +>>> f.clean('9999123123') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX.'] +>>> f.clean('') +Traceback (most recent call last): +... +ValidationError: [u'This field is required.'] + +>>> f = ESPhoneNumberField(required=False) +>>> f.clean('650010101') +u'650010101' +>>> f.clean('931234567') +u'931234567' +>>> f.clean('800123123') +u'800123123' +>>> f.clean('555555555') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX.'] +>>> f.clean('789789789') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX.'] +>>> f.clean('99123123') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX.'] +>>> f.clean('9999123123') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX.'] +>>> f.clean('') +u'' + +# ESIdentityCardNumberField ############################################################## + +ESIdentityCardNumberField validates that data is a identification spanish code for companies or individuals (CIF, NIF or NIE). +>>> from django.contrib.localflavor.es.forms import ESIdentityCardNumberField +>>> f = ESIdentityCardNumberField() +>>> f.clean('78699688J') +'78699688J' +>>> f.clean('78699688-J') +'78699688J' +>>> f.clean('78699688 J') +'78699688J' +>>> f.clean('78699688 j') +'78699688J' +>>> f.clean('78699688T') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for NIF.'] +>>> f.clean('X0901797J') +'X0901797J' +>>> f.clean('X-6124387-Q') +'X6124387Q' +>>> f.clean('X 0012953 G') +'X0012953G' +>>> f.clean('x-3287690-r') +'X3287690R' +>>> f.clean('t-03287690r') +'T03287690R' +>>> f.clean('X-03287690') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid NIF, NIE, or CIF.'] +>>> f.clean('X-03287690-T') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for NIE.'] +>>> f.clean('B38790911') +'B38790911' +>>> f.clean('B-3879091A') +'B3879091A' +>>> f.clean('B 38790917') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for CIF.'] +>>> f.clean('B 38790911') +'B38790911' +>>> f.clean('P-3900800-H') +'P3900800H' +>>> f.clean('P 39008008') +'P39008008' +>>> f.clean('C-28795565') +'C28795565' +>>> f.clean('C 2879556E') +'C2879556E' +>>> f.clean('C28795567') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for CIF.'] +>>> f.clean('I38790911') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid NIF, NIE, or CIF.'] +>>> f.clean('78699688-2') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid NIF, NIE, or CIF.'] +>>> f.clean('') +Traceback (most recent call last): +... +ValidationError: [u'This field is required.'] + +>>> f = ESIdentityCardNumberField(required=False) +>>> f.clean('78699688J') +'78699688J' +>>> f.clean('78699688-J') +'78699688J' +>>> f.clean('78699688 J') +'78699688J' +>>> f.clean('78699688 j') +'78699688J' +>>> f.clean('78699688T') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for NIF.'] +>>> f.clean('X0901797J') +'X0901797J' +>>> f.clean('X-6124387-Q') +'X6124387Q' +>>> f.clean('X 0012953 G') +'X0012953G' +>>> f.clean('x-3287690-r') +'X3287690R' +>>> f.clean('t-03287690r') +'T03287690R' +>>> f.clean('X-03287690') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid NIF, NIE, or CIF.'] +>>> f.clean('X-03287690-T') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for NIE.'] +>>> f.clean('B38790911') +'B38790911' +>>> f.clean('B-3879091A') +'B3879091A' +>>> f.clean('B 38790917') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for CIF.'] +>>> f.clean('B 38790911') +'B38790911' +>>> f.clean('P-3900800-H') +'P3900800H' +>>> f.clean('P 39008008') +'P39008008' +>>> f.clean('C-28795565') +'C28795565' +>>> f.clean('C 2879556E') +'C2879556E' +>>> f.clean('C28795567') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for CIF.'] +>>> f.clean('I38790911') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid NIF, NIE, or CIF.'] +>>> f.clean('78699688-2') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid NIF, NIE, or CIF.'] +>>> f.clean('') +u'' + +# ESCCCField ############################################################## + +ESCCCField validates that data is a spanish bank account number (codigo cuenta cliente). + +>>> from django.contrib.localflavor.es.forms import ESCCCField +>>> f = ESCCCField() +>>> f.clean('20770338793100254321') +'20770338793100254321' +>>> f.clean('2077 0338 79 3100254321') +'2077 0338 79 3100254321' +>>> f.clean('2077-0338-79-3100254321') +'2077-0338-79-3100254321' +>>> f.clean('2077.0338.79.3100254321') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX.'] +>>> f.clean('2077-0338-78-3100254321') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for bank account number.'] +>>> f.clean('2077-0338-89-3100254321') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for bank account number.'] +>>> f.clean('2077-03-3879-3100254321') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX.'] +>>> f.clean('') +Traceback (most recent call last): +... +ValidationError: [u'This field is required.'] + +>>> f = ESCCCField(required=False) +>>> f.clean('20770338793100254321') +'20770338793100254321' +>>> f.clean('2077 0338 79 3100254321') +'2077 0338 79 3100254321' +>>> f.clean('2077-0338-79-3100254321') +'2077-0338-79-3100254321' +>>> f.clean('2077.0338.79.3100254321') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX.'] +>>> f.clean('2077-0338-78-3100254321') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for bank account number.'] +>>> f.clean('2077-0338-89-3100254321') +Traceback (most recent call last): +... +ValidationError: [u'Invalid checksum for bank account number.'] +>>> f.clean('2077-03-3879-3100254321') +Traceback (most recent call last): +... +ValidationError: [u'Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX.'] +>>> f.clean('') +u'' + +# ESRegionSelect ############################################################## + +ESRegionSelect is a Select widget that uses a list of Spain regions as its choices. +>>> from django.contrib.localflavor.es.forms import ESRegionSelect +>>> w = ESRegionSelect() +>>> w.render('regions', 'CT') +u'<select name="regions">\n<option value="AN">Andalusia</option>\n<option value="AR">Aragon</option>\n<option value="O">Principality of Asturias</option>\n<option value="IB">Balearic Islands</option>\n<option value="PV">Basque Country</option>\n<option value="CN">Canary Islands</option>\n<option value="S">Cantabria</option>\n<option value="CM">Castile-La Mancha</option>\n<option value="CL">Castile and Leon</option>\n<option value="CT" selected="selected">Catalonia</option>\n<option value="EX">Extremadura</option>\n<option value="GA">Galicia</option>\n<option value="LO">La Rioja</option>\n<option value="M">Madrid</option>\n<option value="MU">Region of Murcia</option>\n<option value="NA">Foral Community of Navarre</option>\n<option value="VC">Valencian Community</option>\n</select>' + +# ESProvincenSelect ############################################################## + +ESProvinceSelect is a Select widget that uses a list of Spain provinces as its choices. +>>> from django.contrib.localflavor.es.forms import ESProvinceSelect +>>> w = ESProvinceSelect() +>>> w.render('provinces', '08') +u'<select name="provinces">\n<option value="01">Arava</option>\n<option value="02">Albacete</option>\n<option value="03">Alacant</option>\n<option value="04">Almeria</option>\n<option value="05">Avila</option>\n<option value="06">Badajoz</option>\n<option value="07">Illes Balears</option>\n<option value="08" selected="selected">Barcelona</option>\n<option value="09">Burgos</option>\n<option value="10">Caceres</option>\n<option value="11">Cadiz</option>\n<option value="12">Castello</option>\n<option value="13">Ciudad Real</option>\n<option value="14">Cordoba</option>\n<option value="15">A Coruna</option>\n<option value="16">Cuenca</option>\n<option value="17">Girona</option>\n<option value="18">Granada</option>\n<option value="19">Guadalajara</option>\n<option value="20">Guipuzkoa</option>\n<option value="21">Huelva</option>\n<option value="22">Huesca</option>\n<option value="23">Jaen</option>\n<option value="24">Leon</option>\n<option value="25">Lleida</option>\n<option value="26">La Rioja</option>\n<option value="27">Lugo</option>\n<option value="28">Madrid</option>\n<option value="29">Malaga</option>\n<option value="30">Murcia</option>\n<option value="31">Navarre</option>\n<option value="32">Ourense</option>\n<option value="33">Asturias</option>\n<option value="34">Palencia</option>\n<option value="35">Las Palmas</option>\n<option value="36">Pontevedra</option>\n<option value="37">Salamanca</option>\n<option value="38">Santa Cruz de Tenerife</option>\n<option value="39">Cantabria</option>\n<option value="40">Segovia</option>\n<option value="41">Seville</option>\n<option value="42">Soria</option>\n<option value="43">Tarragona</option>\n<option value="44">Teruel</option>\n<option value="45">Toledo</option>\n<option value="46">Valencia</option>\n<option value="47">Valladolid</option>\n<option value="48">Bizkaia</option>\n<option value="49">Zamora</option>\n<option value="50">Zaragoza</option>\n<option value="51">Ceuta</option>\n<option value="52">Melilla</option>\n</select>' + +""" + diff --git a/tests/regressiontests/forms/localflavor/pl.py b/tests/regressiontests/forms/localflavor/pl.py index be8437208b..becdda8a1d 100644 --- a/tests/regressiontests/forms/localflavor/pl.py +++ b/tests/regressiontests/forms/localflavor/pl.py @@ -35,11 +35,15 @@ u'41-403' Traceback (most recent call last): ... ValidationError: [u'Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX.'] ->>> f.clean('43-34-234-323') -u'43-34-234-323' ->>> f.clean('433-344-24-23') -u'433-344-24-23' - +>>> f.clean('64-62-414-124') +u'6462414124' +>>> f.clean('646-241-41-24') +u'6462414124' +>>> f.clean('646-241-41-23') +Traceback (most recent call last): +... +ValidationError: [u'Wrong checksum for the Tax Number (NIP).'] + # PLNationalIdentificationNumberField ############################################ >>> from django.contrib.localflavor.pl.forms import PLNationalIdentificationNumberField @@ -58,4 +62,20 @@ ValidationError: [u'National Identification Number consists of 11 digits.'] Traceback (most recent call last): ... ValidationError: [u'National Identification Number consists of 11 digits.'] + +# PLNationalBusinessRegisterField ################################################ + +>>> from django.contrib.localflavor.pl.forms import PLNationalBusinessRegisterField +>>> f = PLNationalBusinessRegisterField() +>>> f.clean('590096454') +u'590096454' +>>> f.clean('590096453') +Traceback (most recent call last): +... +ValidationError: [u'Wrong checksum for the National Business Register Number (REGON).'] +>>> f.clean('590096') +Traceback (most recent call last): +... +ValidationError: [u'National Business Register Number (REGON) consists of 7 or 9 digits.'] + """ diff --git a/tests/regressiontests/forms/models.py b/tests/regressiontests/forms/models.py index f4f8607193..1a6f566b6b 100644 --- a/tests/regressiontests/forms/models.py +++ b/tests/regressiontests/forms/models.py @@ -1,21 +1,49 @@ +import datetime + from django.db import models -class BoundaryModel(models.Model): +class BoundaryModel(models.Model): positive_integer = models.PositiveIntegerField(null=True, blank=True) - + +class Defaults(models.Model): + name = models.CharField(max_length=256, default='class default value') + def_date = models.DateField(default = datetime.date(1980, 1, 1)) + value = models.IntegerField(default=42) + __test__ = {'API_TESTS': """ ->>> from django.newforms import form_for_model +>>> from django.newforms import form_for_model, form_for_instance # Boundary conditions on a PostitiveIntegerField ######################### ->>> BoundaryForm = form_for_model(BoundaryModel) ->>> f = BoundaryForm({'positive_integer':100}) ->>> f.is_valid() +>>> BoundaryForm = form_for_model(BoundaryModel) +>>> f = BoundaryForm({'positive_integer':100}) +>>> f.is_valid() True ->>> f = BoundaryForm({'positive_integer':0}) ->>> f.is_valid() +>>> f = BoundaryForm({'positive_integer':0}) +>>> f.is_valid() True ->>> f = BoundaryForm({'positive_integer':-100}) ->>> f.is_valid() +>>> f = BoundaryForm({'positive_integer':-100}) +>>> f.is_valid() False -"""}
\ No newline at end of file +# Formfield initial values ######## +If the model has default values for some fields, they are used as the formfield +initial values. +>>> DefaultsForm = form_for_model(Defaults) +>>> DefaultsForm().fields['name'].initial +u'class default value' +>>> DefaultsForm().fields['def_date'].initial +datetime.date(1980, 1, 1) +>>> DefaultsForm().fields['value'].initial +42 + +In form_for_instance(), the initial values come from the instance's values, not +the model's defaults. +>>> foo_instance = Defaults(name=u'instance value', def_date = datetime.date(1969, 4, 4), value = 12) +>>> InstanceForm = form_for_instance(foo_instance) +>>> InstanceForm().fields['name'].initial +u'instance value' +>>> InstanceForm().fields['def_date'].initial +datetime.date(1969, 4, 4) +>>> InstanceForm().fields['value'].initial +12 +"""} diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py index a732f9fdb0..aa33386d09 100644 --- a/tests/regressiontests/forms/tests.py +++ b/tests/regressiontests/forms/tests.py @@ -9,6 +9,7 @@ from localflavor.ca import tests as localflavor_ca_tests from localflavor.ch import tests as localflavor_ch_tests from localflavor.cl import tests as localflavor_cl_tests from localflavor.de import tests as localflavor_de_tests +from localflavor.es import tests as localflavor_es_tests from localflavor.fi import tests as localflavor_fi_tests from localflavor.fr import tests as localflavor_fr_tests from localflavor.generic import tests as localflavor_generic_tests @@ -35,6 +36,7 @@ __test__ = { 'localflavor_ch_tests': localflavor_ch_tests, 'localflavor_cl_tests': localflavor_cl_tests, 'localflavor_de_tests': localflavor_de_tests, + 'localflavor_es_tests': localflavor_es_tests, 'localflavor_fi_tests': localflavor_fi_tests, 'localflavor_fr_tests': localflavor_fr_tests, 'localflavor_generic_tests': localflavor_generic_tests, diff --git a/tests/regressiontests/forms/widgets.py b/tests/regressiontests/forms/widgets.py index 1c3e873963..cb1d084631 100644 --- a/tests/regressiontests/forms/widgets.py +++ b/tests/regressiontests/forms/widgets.py @@ -276,6 +276,12 @@ u'<input type="checkbox" name="greeting" />' >>> w.render('greeting', None) u'<input type="checkbox" name="greeting" />' +The CheckboxInput widget will return False if the key is not found in the data +dictionary (because HTML form submission doesn't send any result for unchecked +checkboxes). +>>> w.value_from_datadict({}, {}, 'testing') +False + # Select Widget ############################################################### >>> w = Select() @@ -845,4 +851,21 @@ included on both widgets. >>> w = SplitDateTimeWidget(attrs={'class': 'pretty'}) >>> w.render('date', datetime.datetime(2006, 1, 10, 7, 30)) u'<input type="text" class="pretty" value="2006-01-10" name="date_0" /><input type="text" class="pretty" value="07:30:00" name="date_1" />' + +# DateTimeInput ############################################################### + +>>> w = DateTimeInput() +>>> w.render('date', None) +u'<input type="text" name="date" />' +>>> d = datetime.datetime(2007, 9, 17, 12, 51, 34, 482548) +>>> print d +2007-09-17 12:51:34.482548 + +The microseconds are trimmed on display, by default. +>>> w.render('date', d) +u'<input type="text" name="date" value="2007-09-17 12:51:34" />' +>>> w.render('date', datetime.datetime(2007, 9, 17, 12, 51, 34)) +u'<input type="text" name="date" value="2007-09-17 12:51:34" />' +>>> w.render('date', datetime.datetime(2007, 9, 17, 12, 51)) +u'<input type="text" name="date" value="2007-09-17 12:51:00" />' """ diff --git a/tests/regressiontests/i18n/misc.py b/tests/regressiontests/i18n/misc.py new file mode 100644 index 0000000000..fa22fd05d3 --- /dev/null +++ b/tests/regressiontests/i18n/misc.py @@ -0,0 +1,57 @@ +tests = """ +>>> from django.utils.translation.trans_real import parse_accept_lang_header +>>> p = parse_accept_lang_header + +Good headers. +>>> p('de') +[('de', 1.0)] +>>> p('en-AU') +[('en-AU', 1.0)] +>>> p('*;q=1.00') +[('*', 1.0)] +>>> p('en-AU;q=0.123') +[('en-AU', 0.123)] +>>> p('en-au;q=0.1') +[('en-au', 0.10000000000000001)] +>>> p('en-au;q=1.0') +[('en-au', 1.0)] +>>> p('da, en-gb;q=0.25, en;q=0.5') +[('da', 1.0), ('en', 0.5), ('en-gb', 0.25)] +>>> p('en-au-xx') +[('en-au-xx', 1.0)] +>>> p('de,en-au;q=0.75,en-us;q=0.5,en;q=0.25,es;q=0.125,fa;q=0.125') +[('de', 1.0), ('en-au', 0.75), ('en-us', 0.5), ('en', 0.25), ('es', 0.125), ('fa', 0.125)] +>>> p('*') +[('*', 1.0)] +>>> p('de;q=0.') +[('de', 1.0)] +>>> p('') +[] + +Bad headers; should always return []. +>>> p('en-gb;q=1.0000') +[] +>>> p('en;q=0.1234') +[] +>>> p('en;q=.2') +[] +>>> p('abcdefghi-au') +[] +>>> p('**') +[] +>>> p('en,,gb') +[] +>>> p('en-au;q=0.1.0') +[] +>>> p('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZ,en') +[] +>>> p('da, en-gb;q=0.8, en;q=0.7,#') +[] +>>> p('de;q=2.0') +[] +>>> p('de;q=0.a') +[] +>>> p('') +[] + +""" diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py index 99204451e4..0a18e8bea5 100644 --- a/tests/regressiontests/i18n/tests.py +++ b/tests/regressiontests/i18n/tests.py @@ -1,6 +1,7 @@ # coding: utf-8 +import misc -ur""" +regressions = ur""" Format string interpolation should work with *_lazy objects. >>> from django.utils.translation import ugettext_lazy, activate, deactivate, gettext_lazy @@ -39,3 +40,8 @@ unicode(string_concat(...)) should not raise a TypeError - #4796 >>> unicode(django.utils.translation.string_concat("dja", "ngo")) u'django' """ + +__test__ = { + 'regressions': regressions, + 'misc': misc.tests, +} diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 0c851d5f78..60f7d54145 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -13,7 +13,7 @@ from datetime import datetime, timedelta from django import template from django.template import loader from django.template.loaders import app_directories, filesystem -from django.utils.translation import activate, deactivate, install, ugettext as _ +from django.utils.translation import activate, deactivate, ugettext as _ from django.utils.tzinfo import LocalTimezone from unicode import unicode_tests @@ -341,7 +341,10 @@ class Templates(unittest.TestCase): 'firstof03': ('{% firstof a b c %}', {'a':0,'b':2,'c':0}, '2'), 'firstof04': ('{% firstof a b c %}', {'a':0,'b':0,'c':3}, '3'), 'firstof05': ('{% firstof a b c %}', {'a':1,'b':2,'c':3}, '1'), - 'firstof06': ('{% firstof %}', {}, template.TemplateSyntaxError), + 'firstof06': ('{% firstof a b c %}', {'b':0,'c':3}, '3'), + 'firstof07': ('{% firstof a b "c" %}', {'a':0}, 'c'), + 'firstof08': ('{% firstof a b "c and d" %}', {'a':0,'b':0}, 'c and d'), + 'firstof09': ('{% firstof %}', {}, template.TemplateSyntaxError), ### FOR TAG ############################################################### 'for-tag01': ("{% for val in values %}{{ val }}{% endfor %}", {"values": [1, 2, 3]}, "123"), @@ -802,6 +805,20 @@ class Templates(unittest.TestCase): 'url-fail01' : ('{% url %}', {}, template.TemplateSyntaxError), 'url-fail02' : ('{% url no_such_view %}', {}, ''), 'url-fail03' : ('{% url regressiontests.templates.views.client no_such_param="value" %}', {}, ''), + + ### CACHE TAG ###################################################### + 'cache01' : ('{% load cache %}{% cache -1 test %}cache01{% endcache %}', {}, 'cache01'), + 'cache02' : ('{% load cache %}{% cache -1 test %}cache02{% endcache %}', {}, 'cache02'), + 'cache03' : ('{% load cache %}{% cache 2 test %}cache03{% endcache %}', {}, 'cache03'), + 'cache04' : ('{% load cache %}{% cache 2 test %}cache04{% endcache %}', {}, 'cache03'), + 'cache05' : ('{% load cache %}{% cache 2 test foo %}cache05{% endcache %}', {'foo': 1}, 'cache05'), + 'cache06' : ('{% load cache %}{% cache 2 test foo %}cache06{% endcache %}', {'foo': 2}, 'cache06'), + 'cache07' : ('{% load cache %}{% cache 2 test foo %}cache06{% endcache %}', {'foo': 1}, 'cache05'), + + # Raise exception if we dont have at least 2 args, first one integer. + 'cache08' : ('{% load cache %}{% cache %}{% endcache %}', {}, template.TemplateSyntaxError), + 'cache09' : ('{% load cache %}{% cache 1 %}{% endcache %}', {}, template.TemplateSyntaxError), + 'cache10' : ('{% load cache %}{% cache foo bar %}{% endcache %}', {}, template.TemplateSyntaxError), } # Register our custom template loader. @@ -827,8 +844,6 @@ class Templates(unittest.TestCase): expected_invalid_str = 'INVALID' for name, vals in tests: - install() - if isinstance(vals[2], tuple): normal_string_result = vals[2][0] invalid_string_result = vals[2][1] diff --git a/tests/regressiontests/text/tests.py b/tests/regressiontests/text/tests.py index 0fd22b58b0..962a30ef19 100644 --- a/tests/regressiontests/text/tests.py +++ b/tests/regressiontests/text/tests.py @@ -20,8 +20,12 @@ friends' >>> from django.utils.http import urlquote, urlquote_plus >>> urlquote(u'Paris & Orl\xe9ans') u'Paris%20%26%20Orl%C3%A9ans' +>>> urlquote(u'Paris & Orl\xe9ans', safe="&") +u'Paris%20&%20Orl%C3%A9ans' >>> urlquote_plus(u'Paris & Orl\xe9ans') u'Paris+%26+Orl%C3%A9ans' +>>> urlquote_plus(u'Paris & Orl\xe9ans', safe="&") +u'Paris+&+Orl%C3%A9ans' ### iri_to_uri ########################################################### >>> from django.utils.encoding import iri_to_uri diff --git a/tests/regressiontests/utils/tests.py b/tests/regressiontests/utils/tests.py index fe0b226adc..eb3a722888 100644 --- a/tests/regressiontests/utils/tests.py +++ b/tests/regressiontests/utils/tests.py @@ -4,7 +4,7 @@ Tests for django.utils. from unittest import TestCase -from django.utils import html +from django.utils import html, checksums from timesince import timesince_tests @@ -116,6 +116,32 @@ class TestUtilsHtml(TestCase): for value, output in items: self.check_output(f, value, output) +class TestUtilsChecksums(TestCase): + + def check_output(self, function, value, output=None): + """ + Check that function(value) equals output. If output is None, + check that function(value) equals value. + """ + if output is None: + output = value + self.assertEqual(function(value), output) + + def test_luhn(self): + f = checksums.luhn + items = ( + (4111111111111111, True), ('4111111111111111', True), + (4222222222222, True), (378734493671000, True), + (5424000000000015, True), (5555555555554444, True), + (1008, True), ('0000001008', True), ('000000001008', True), + (4012888888881881, True), (1234567890123456789012345678909, True), + (4111111111211111, False), (42222222222224, False), + (100, False), ('100', False), ('0000100', False), + ('abc', False), (None, False), (object(), False), + ) + for value, output in items: + self.check_output(f, value, output) + __test__ = { 'timesince_tests': timesince_tests, } diff --git a/tests/runtests.py b/tests/runtests.py index 736a9a61b3..843850074b 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -93,6 +93,7 @@ def django_tests(verbosity, interactive, test_labels): old_root_urlconf = settings.ROOT_URLCONF old_template_dirs = settings.TEMPLATE_DIRS old_use_i18n = settings.USE_I18N + old_language_code = settings.LANGUAGE_CODE old_middleware_classes = settings.MIDDLEWARE_CLASSES # Redirect some settings for the duration of these tests. @@ -100,6 +101,7 @@ def django_tests(verbosity, interactive, test_labels): settings.ROOT_URLCONF = 'urls' settings.TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__), TEST_TEMPLATE_DIR),) settings.USE_I18N = True + settings.LANGUAGE_CODE = 'en' settings.MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -151,6 +153,7 @@ def django_tests(verbosity, interactive, test_labels): settings.ROOT_URLCONF = old_root_urlconf settings.TEMPLATE_DIRS = old_template_dirs settings.USE_I18N = old_use_i18n + settings.LANGUAGE_CODE = old_language_code settings.MIDDLEWARE_CLASSES = old_middleware_classes if __name__ == "__main__": |
