diff options
| author | Brian Rosner <brosner@gmail.com> | 2008-06-26 15:42:33 +0000 |
|---|---|---|
| committer | Brian Rosner <brosner@gmail.com> | 2008-06-26 15:42:33 +0000 |
| commit | c8da0874c78ed4c6e1ad08cc78228799a333f76c (patch) | |
| tree | bef645a8eb2c1a17f013a1031ed34494547dced0 /tests/regressiontests | |
| parent | f15845c573f019fc7f6d7404add122f9b7c52dc4 (diff) | |
newforms-admin: Merged from trunk up to [7766].
git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@7770 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests/regressiontests')
| -rw-r--r-- | tests/regressiontests/datastructures/tests.py | 8 | ||||
| -rw-r--r-- | tests/regressiontests/defaultfilters/tests.py | 6 | ||||
| -rw-r--r-- | tests/regressiontests/model_inheritance_regress/models.py | 22 | ||||
| -rw-r--r-- | tests/regressiontests/queries/models.py | 95 | ||||
| -rw-r--r-- | tests/regressiontests/templates/loaders.py | 26 | ||||
| -rw-r--r-- | tests/regressiontests/templates/tests.py | 79 |
6 files changed, 175 insertions, 61 deletions
diff --git a/tests/regressiontests/datastructures/tests.py b/tests/regressiontests/datastructures/tests.py index b51b4b1233..d6141b09ce 100644 --- a/tests/regressiontests/datastructures/tests.py +++ b/tests/regressiontests/datastructures/tests.py @@ -125,4 +125,12 @@ Init from sequence of tuples >>> d = FileDict({'other-key': 'once upon a time...'}) >>> repr(d) "{'other-key': 'once upon a time...'}" + +### DictWrapper ############################################################# + +>>> f = lambda x: "*%s" % x +>>> d = DictWrapper({'a': 'a'}, f, 'xx_') +>>> "Normal: %(a)s. Modified: %(xx_a)s" % d +'Normal: a. Modified: *a' + """ diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py index 62403935d4..b56c33a652 100644 --- a/tests/regressiontests/defaultfilters/tests.py +++ b/tests/regressiontests/defaultfilters/tests.py @@ -150,7 +150,7 @@ u'fran%C3%A7ois%20%26%20jill' u'<a href="http://short.com/" rel="nofollow">http://short.com/</a>' >>> urlizetrunc(u'http://www.google.co.uk/search?hl=en&q=some+long+url&btnG=Search&meta=', 20) -u'<a href="http://www.google.co.uk/search?hl=en&q=some+long+url&btnG=Search&meta=" rel="nofollow">http://www.google....</a>' +u'<a href="http://www.google.co.uk/search?hl=en&q=some+long+url&btnG=Search&meta=" rel="nofollow">http://www.google...</a>' >>> urlizetrunc('http://www.google.co.uk/search?hl=en&q=some+long+url&btnG=Search&meta=', 20) u'<a href="http://www.google.co.uk/search?hl=en&q=some+long+url&btnG=Search&meta=" rel="nofollow">http://www.google...</a>' @@ -174,10 +174,10 @@ u'<a href="http://google.com" rel="nofollow">http://google.com</a>' u'<a href="http://google.com/" rel="nofollow">http://google.com/</a>' >>> urlize('www.google.com') -u'<a href="http://www.google.com" rel="nofollow">http://www.google.com</a>' +u'<a href="http://www.google.com" rel="nofollow">www.google.com</a>' >>> urlize('djangoproject.org') -u'<a href="http://djangoproject.org" rel="nofollow">http://djangoproject.org</a>' +u'<a href="http://djangoproject.org" rel="nofollow">djangoproject.org</a>' >>> urlize('info@djangoproject.org') u'<a href="mailto:info@djangoproject.org">info@djangoproject.org</a>' diff --git a/tests/regressiontests/model_inheritance_regress/models.py b/tests/regressiontests/model_inheritance_regress/models.py index 8801715a0c..33e2e0e4f6 100644 --- a/tests/regressiontests/model_inheritance_regress/models.py +++ b/tests/regressiontests/model_inheritance_regress/models.py @@ -2,6 +2,8 @@ Regression tests for Model inheritance behaviour. """ +import datetime + from django.db import models class Place(models.Model): @@ -10,7 +12,7 @@ class Place(models.Model): class Meta: ordering = ('name',) - + def __unicode__(self): return u"%s the place" % self.name @@ -35,11 +37,17 @@ class ParkingLot(Place): def __unicode__(self): return u"%s the parking lot" % self.name +class Parent(models.Model): + created = models.DateTimeField(default=datetime.datetime.now) + +class Child(Parent): + name = models.CharField(max_length=10) + __test__ = {'API_TESTS':""" # Regression for #7350, #7202 -# Check that when you create a Parent object with a specific reference to an existent -# child instance, saving the Parent doesn't duplicate the child. -# This behaviour is only activated during a raw save - it is mostly relevant to +# Check that when you create a Parent object with a specific reference to an +# existent child instance, saving the Parent doesn't duplicate the child. This +# behaviour is only activated during a raw save - it is mostly relevant to # deserialization, but any sort of CORBA style 'narrow()' API would require a # similar approach. @@ -117,4 +125,10 @@ __test__ = {'API_TESTS':""" >>> [sorted(d.items()) for d in dicts] [[('name', u"Guido's All New House of Pasta"), ('serves_gnocchi', False), ('serves_hot_dogs', False)]] +# Regressions tests for #7105: dates() queries should be able to use fields +# from the parent model as easily as the child. +>>> obj = Child.objects.create(name='child', created=datetime.datetime(2008, 6, 26, 17, 0, 0)) +>>> Child.objects.dates('created', 'month') +[datetime.datetime(2008, 6, 1, 0, 0)] + """} diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py index aa78d6583a..c02ad73998 100644 --- a/tests/regressiontests/queries/models.py +++ b/tests/regressiontests/queries/models.py @@ -45,6 +45,7 @@ class Author(models.Model): class Item(models.Model): name = models.CharField(max_length=10) created = models.DateTimeField() + modified = models.DateTimeField(blank=True, null=True) tags = models.ManyToManyField(Tag, blank=True, null=True) creator = models.ForeignKey(Author) note = models.ForeignKey(Note) @@ -57,7 +58,7 @@ class Item(models.Model): class Report(models.Model): name = models.CharField(max_length=10) - creator = models.ForeignKey(Author, to_field='num') + creator = models.ForeignKey(Author, to_field='num', null=True) def __unicode__(self): return self.name @@ -89,6 +90,15 @@ class Number(models.Model): def __unicode__(self): return unicode(self.num) +# Symmetrical m2m field with a normal field using the reverse accesor name +# ("valid"). +class Valid(models.Model): + valid = models.CharField(max_length=10) + parent = models.ManyToManyField('self') + + class Meta: + ordering = ['valid'] + # Some funky cross-linked models for testing a couple of infinite recursion # cases. class X(models.Model): @@ -121,12 +131,12 @@ class LoopZ(models.Model): class CustomManager(models.Manager): def get_query_set(self): qs = super(CustomManager, self).get_query_set() - return qs.filter(is_public=True, tag__name='t1') + return qs.filter(public=True, tag__name='t1') class ManagedModel(models.Model): data = models.CharField(max_length=10) tag = models.ForeignKey(Tag) - is_public = models.BooleanField(default=True) + public = models.BooleanField(default=True) objects = CustomManager() normal_manager = models.Manager() @@ -134,6 +144,24 @@ class ManagedModel(models.Model): def __unicode__(self): return self.data +# An inter-related setup with multiple paths from Child to Detail. +class Detail(models.Model): + data = models.CharField(max_length=10) + +class MemberManager(models.Manager): + def get_query_set(self): + return super(MemberManager, self).get_query_set().select_related("details") + +class Member(models.Model): + name = models.CharField(max_length=10) + details = models.OneToOneField(Detail, primary_key=True) + + objects = MemberManager() + +class Child(models.Model): + person = models.OneToOneField(Member, primary_key=True) + parent = models.ForeignKey(Member, related_name="children") + __test__ = {'API_TESTS':""" >>> t1 = Tag(name='t1') @@ -174,7 +202,7 @@ by 'info'. Helps detect some problems later. >>> time2 = datetime.datetime(2007, 12, 19, 21, 0, 0) >>> time3 = datetime.datetime(2007, 12, 20, 22, 25, 0) >>> time4 = datetime.datetime(2007, 12, 20, 21, 0, 0) ->>> i1 = Item(name='one', created=time1, creator=a1, note=n3) +>>> i1 = Item(name='one', created=time1, modified=time1, creator=a1, note=n3) >>> i1.save() >>> i1.tags = [t1, t2] >>> i2 = Item(name='two', created=time2, creator=a2, note=n2) @@ -190,6 +218,8 @@ by 'info'. Helps detect some problems later. >>> r1.save() >>> r2 = Report(name='r2', creator=a3) >>> r2.save() +>>> r3 = Report(name='r3') +>>> r3.save() Ordering by 'rank' gives us rank2, rank1, rank3. Ordering by the Meta.ordering will be rank3, rank2, rank1. @@ -478,7 +508,7 @@ FieldError: Infinite loop caused by ordering. # Ordering by a many-valued attribute (e.g. a many-to-many or reverse # ForeignKey) is legal, but the results might not make sense. That isn't # Django's problem. Garbage in, garbage out. ->>> Item.objects.all().order_by('tags', 'id') +>>> Item.objects.filter(tags__isnull=False).order_by('tags', 'id') [<Item: one>, <Item: two>, <Item: one>, <Item: two>, <Item: four>] # If we replace the default ordering, Django adjusts the required tables @@ -627,6 +657,10 @@ Bug #7087 -- dates with extra select columns >>> Item.objects.dates('created', 'day').extra(select={'a': 1}) [datetime.datetime(2007, 12, 19, 0, 0), datetime.datetime(2007, 12, 20, 0, 0)] +Bug #7155 -- nullable dates +>>> Item.objects.dates('modified', 'day') +[datetime.datetime(2007, 12, 19, 0, 0)] + Test that parallel iterators work. >>> qs = Tag.objects.all() @@ -705,8 +739,57 @@ More twisted cases, involving nested negations. Bug #7095 Updates that are filtered on the model being updated are somewhat tricky to get in MySQL. This exercises that case. ->>> mm = ManagedModel.objects.create(data='mm1', tag=t1, is_public=True) +>>> mm = ManagedModel.objects.create(data='mm1', tag=t1, public=True) >>> ManagedModel.objects.update(data='mm') +A values() or values_list() query across joined models must use outer joins +appropriately. +>>> Report.objects.values_list("creator__extra__info", flat=True).order_by("name") +[u'e1', u'e2', None] + +Similarly for select_related(), joins beyond an initial nullable join must +use outer joins so that all results are included. +>>> Report.objects.select_related("creator", "creator__extra").order_by("name") +[<Report: r1>, <Report: r2>, <Report: r3>] + +When there are multiple paths to a table from another table, we have to be +careful not to accidentally reuse an inappropriate join when using +select_related(). We used to return the parent's Detail record here by mistake. + +>>> d1 = Detail.objects.create(data="d1") +>>> d2 = Detail.objects.create(data="d2") +>>> m1 = Member.objects.create(name="m1", details=d1) +>>> m2 = Member.objects.create(name="m2", details=d2) +>>> c1 = Child.objects.create(person=m2, parent=m1) +>>> obj = m1.children.select_related("person__details")[0] +>>> obj.person.details.data +u'd2' + +Bug #7076 -- excluding shouldn't eliminate NULL entries. +>>> Item.objects.exclude(modified=time1).order_by('name') +[<Item: four>, <Item: three>, <Item: two>] +>>> Tag.objects.exclude(parent__name=t1.name) +[<Tag: t1>, <Tag: t4>, <Tag: t5>] + +Bug #7181 -- ordering by related tables should accomodate nullable fields (this +test is a little tricky, since NULL ordering is database dependent. Instead, we +just count the number of results). +>>> len(Tag.objects.order_by('parent__name')) +5 + +Bug #7107 -- this shouldn't create an infinite loop. +>>> Valid.objects.all() +[] + +Empty querysets can be merged with others. +>>> Note.objects.none() | Note.objects.all() +[<Note: n1>, <Note: n2>, <Note: n3>] +>>> Note.objects.all() | Note.objects.none() +[<Note: n1>, <Note: n2>, <Note: n3>] +>>> Note.objects.none() & Note.objects.all() +[] +>>> Note.objects.all() & Note.objects.none() +[] + """} diff --git a/tests/regressiontests/templates/loaders.py b/tests/regressiontests/templates/loaders.py index 82e3c622d1..db37116b94 100644 --- a/tests/regressiontests/templates/loaders.py +++ b/tests/regressiontests/templates/loaders.py @@ -1,6 +1,7 @@ -# -*- coding: utf-8 -*- """ Test cases for the template loaders + +Note: This test requires setuptools! """ from django.conf import settings @@ -17,7 +18,7 @@ import StringIO from django.template import TemplateDoesNotExist from django.template.loaders.eggs import load_template_source as lts_egg -#Mock classes and objects for pkg_resources functions +# Mock classes and objects for pkg_resources functions. class MockProvider(pkg_resources.NullProvider): def __init__(self, module): pkg_resources.NullProvider.__init__(self, module) @@ -35,25 +36,25 @@ class MockProvider(pkg_resources.NullProvider): def _get(self, path): return self.module._resources[path].read() -class MockLoader(object): pass +class MockLoader(object): + pass def create_egg(name, resources): """ - Creates a mock egg with a list of resources - - name: The name of the module - resources: A dictionary of resources. Keys are the names and values the the data. + Creates a mock egg with a list of resources. + + name: The name of the module. + resources: A dictionary of resources. Keys are the names and values the the data. """ egg = imp.new_module(name) egg.__loader__ = MockLoader() egg._resources = resources sys.modules[name] = egg - class EggLoader(unittest.TestCase): def setUp(self): pkg_resources._provider_factories[MockLoader] = MockProvider - + self.empty_egg = create_egg("egg_empty", {}) self.egg_1 = create_egg("egg_1", { 'templates/y.html' : StringIO.StringIO("y"), @@ -61,7 +62,7 @@ class EggLoader(unittest.TestCase): }) self._old_installed_apps = settings.INSTALLED_APPS settings.INSTALLED_APPS = [] - + def tearDown(self): settings.INSTALLED_APPS = self._old_installed_apps @@ -74,19 +75,18 @@ class EggLoader(unittest.TestCase): "Template loading fails if the template is not in the egg" settings.INSTALLED_APPS = ['egg_1'] self.assertRaises(TemplateDoesNotExist, lts_egg, "not-existing.html") - + def test_existing(self): "A template can be loaded from an egg" settings.INSTALLED_APPS = ['egg_1'] contents, template_name = lts_egg("y.html") self.assertEqual(contents, "y") self.assertEqual(template_name, "egg:egg_1:templates/y.html") - + def test_not_installed(self): "Loading an existent template from an egg not included in INSTALLED_APPS should fail" settings.INSTALLED_APPS = [] self.assertRaises(TemplateDoesNotExist, lts_egg, "y.html") - if __name__ == "__main__": unittest.main() diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 089a6d312d..186b8aacb5 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -20,7 +20,10 @@ from django.utils.tzinfo import LocalTimezone from unicode import unicode_tests from context import context_tests -from loaders import * +try: + from loaders import * +except ImportError: + pass # If setuptools isn't installed, that's fine. Just move on. import filters @@ -132,8 +135,7 @@ class Templates(unittest.TestCase): # Quickly check that we aren't accidentally using a name in both # template and filter tests. - overlapping_names = [name for name in filter_tests if name in - template_tests] + overlapping_names = [name for name in filter_tests if name in template_tests] assert not overlapping_names, 'Duplicate test name(s): %s' % ', '.join(overlapping_names) template_tests.update(filter_tests) @@ -156,7 +158,7 @@ class Templates(unittest.TestCase): # Turn TEMPLATE_DEBUG off, because tests assume that. old_td, settings.TEMPLATE_DEBUG = settings.TEMPLATE_DEBUG, False - # Set TEMPLATE_STRING_IF_INVALID to a known string + # Set TEMPLATE_STRING_IF_INVALID to a known string. old_invalid = settings.TEMPLATE_STRING_IF_INVALID expected_invalid_str = 'INVALID' @@ -539,13 +541,14 @@ class Templates(unittest.TestCase): 'if-tag-error05': ("{% if not foo or %}yes{% else %}no{% endif %}", {'foo': True}, template.TemplateSyntaxError), ### IFCHANGED TAG ######################################################### - 'ifchanged01': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,2,3) }, '123'), - 'ifchanged02': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,1,3) }, '13'), - 'ifchanged03': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,1,1) }, '1'), - 'ifchanged04': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% endfor %}{% endfor %}', { 'num': (1, 2, 3), 'numx': (2, 2, 2)}, '122232'), - 'ifchanged05': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% endfor %}{% endfor %}', { 'num': (1, 1, 1), 'numx': (1, 2, 3)}, '1123123123'), - 'ifchanged06': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% endfor %}{% endfor %}', { 'num': (1, 1, 1), 'numx': (2, 2, 2)}, '1222'), - 'ifchanged07': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% for y in numy %}{% ifchanged %}{{ y }}{% endifchanged %}{% endfor %}{% endfor %}{% endfor %}', { 'num': (1, 1, 1), 'numx': (2, 2, 2), 'numy': (3, 3, 3)}, '1233323332333'), + 'ifchanged01': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', {'num': (1,2,3)}, '123'), + 'ifchanged02': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', {'num': (1,1,3)}, '13'), + 'ifchanged03': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', {'num': (1,1,1)}, '1'), + 'ifchanged04': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% endfor %}{% endfor %}', {'num': (1, 2, 3), 'numx': (2, 2, 2)}, '122232'), + 'ifchanged05': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% endfor %}{% endfor %}', {'num': (1, 1, 1), 'numx': (1, 2, 3)}, '1123123123'), + 'ifchanged06': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% endfor %}{% endfor %}', {'num': (1, 1, 1), 'numx': (2, 2, 2)}, '1222'), + 'ifchanged07': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% for y in numy %}{% ifchanged %}{{ y }}{% endifchanged %}{% endfor %}{% endfor %}{% endfor %}', {'num': (1, 1, 1), 'numx': (2, 2, 2), 'numy': (3, 3, 3)}, '1233323332333'), + 'ifchanged08': ('{% for data in datalist %}{% for c,d in data %}{% if c %}{% ifchanged %}{{ d }}{% endifchanged %}{% endif %}{% endfor %}{% endfor %}', {'datalist': [[(1, 'a'), (1, 'a'), (0, 'b'), (1, 'c')], [(0, 'a'), (1, 'c'), (1, 'd'), (1, 'd'), (0, 'e')]]}, 'accd'), # Test one parameter given to ifchanged. 'ifchanged-param01': ('{% for n in num %}{% ifchanged n %}..{% endifchanged %}{{ n }}{% endfor %}', { 'num': (1,2,3) }, '..1..2..3'), @@ -860,40 +863,46 @@ class Templates(unittest.TestCase): ### NOW TAG ######################################################## # Simple case - 'now01' : ('{% now "j n Y"%}', {}, str(datetime.now().day) + ' ' + str(datetime.now().month) + ' ' + str(datetime.now().year)), + 'now01': ('{% now "j n Y"%}', {}, str(datetime.now().day) + ' ' + str(datetime.now().month) + ' ' + str(datetime.now().year)), # Check parsing of escaped and special characters - 'now02' : ('{% now "j "n" Y"%}', {}, template.TemplateSyntaxError), - # 'now03' : ('{% now "j \"n\" Y"%}', {}, str(datetime.now().day) + '"' + str(datetime.now().month) + '"' + str(datetime.now().year)), - # 'now04' : ('{% now "j \nn\n Y"%}', {}, str(datetime.now().day) + '\n' + str(datetime.now().month) + '\n' + str(datetime.now().year)) + 'now02': ('{% now "j "n" Y"%}', {}, template.TemplateSyntaxError), + # 'now03': ('{% now "j \"n\" Y"%}', {}, str(datetime.now().day) + '"' + str(datetime.now().month) + '"' + str(datetime.now().year)), + # 'now04': ('{% now "j \nn\n Y"%}', {}, str(datetime.now().day) + '\n' + str(datetime.now().month) + '\n' + str(datetime.now().year)) ### URL TAG ######################################################## # Successes - 'url01' : ('{% url regressiontests.templates.views.client client.id %}', {'client': {'id': 1}}, '/url_tag/client/1/'), - 'url02' : ('{% url regressiontests.templates.views.client_action client.id, action="update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'), - 'url03' : ('{% url regressiontests.templates.views.index %}', {}, '/url_tag/'), - 'url04' : ('{% url named.client client.id %}', {'client': {'id': 1}}, '/url_tag/named-client/1/'), - 'url05' : (u'{% url метка_оператора v %}', {'v': u'Ω'}, - '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'), + 'url01': ('{% url regressiontests.templates.views.client client.id %}', {'client': {'id': 1}}, '/url_tag/client/1/'), + 'url02': ('{% url regressiontests.templates.views.client_action client.id, action="update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'), + 'url03': ('{% url regressiontests.templates.views.index %}', {}, '/url_tag/'), + 'url04': ('{% url named.client client.id %}', {'client': {'id': 1}}, '/url_tag/named-client/1/'), + 'url05': (u'{% url метка_оператора v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'), # Failures - 'url-fail01' : ('{% url %}', {}, template.TemplateSyntaxError), - 'url-fail02' : ('{% url no_such_view %}', {}, ''), - 'url-fail03' : ('{% url regressiontests.templates.views.client no_such_param="value" %}', {}, ''), + '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'), + '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 %}cache07{% 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), + # Allow first argument to be a variable. + 'cache08': ('{% load cache %}{% cache time test foo %}cache08{% endcache %}', {'foo': 2, 'time': 2}, 'cache06'), + 'cache09': ('{% load cache %}{% cache time test foo %}cache09{% endcache %}', {'foo': 3, 'time': -1}, 'cache09'), + 'cache10': ('{% load cache %}{% cache time test foo %}cache10{% endcache %}', {'foo': 3, 'time': -1}, 'cache10'), + + # Raise exception if we don't have at least 2 args, first one integer. + 'cache11': ('{% load cache %}{% cache %}{% endcache %}', {}, template.TemplateSyntaxError), + 'cache12': ('{% load cache %}{% cache 1 %}{% endcache %}', {}, template.TemplateSyntaxError), + 'cache13': ('{% load cache %}{% cache foo bar %}{% endcache %}', {}, template.TemplateSyntaxError), + 'cache14': ('{% load cache %}{% cache foo bar %}{% endcache %}', {'foo': 'fail'}, template.TemplateSyntaxError), + 'cache15': ('{% load cache %}{% cache foo bar %}{% endcache %}', {'foo': []}, template.TemplateSyntaxError), ### AUTOESCAPE TAG ############################################## 'autoescape-tag01': ("{% autoescape off %}hello{% endautoescape %}", {}, "hello"), |
