[1.8.x] Moved ifchanged tests into syntax_tests/test_if_changed.py.
Backport of 3d8fee6051
from master
This commit is contained in:
parent
f3a49c628e
commit
e15292daa0
|
@ -1,3 +1,4 @@
|
||||||
|
from django.template import Context, Template
|
||||||
from django.test import SimpleTestCase
|
from django.test import SimpleTestCase
|
||||||
|
|
||||||
from ..utils import setup
|
from ..utils import setup
|
||||||
|
@ -152,3 +153,37 @@ class IfChangedTagTests(SimpleTestCase):
|
||||||
"""
|
"""
|
||||||
output = self.engine.render_to_string('ifchanged-filter-ws', {'num': (1, 2, 3)})
|
output = self.engine.render_to_string('ifchanged-filter-ws', {'num': (1, 2, 3)})
|
||||||
self.assertEqual(output, '..1..2..3')
|
self.assertEqual(output, '..1..2..3')
|
||||||
|
|
||||||
|
|
||||||
|
class IfChangedTests(SimpleTestCase):
|
||||||
|
|
||||||
|
def test_ifchanged_concurrency(self):
|
||||||
|
"""
|
||||||
|
#15849 -- ifchanged should be thread-safe.
|
||||||
|
"""
|
||||||
|
template = Template('[0{% for x in foo %},{% with var=get_value %}{% ifchanged %}{{ var }}{% endifchanged %}{% endwith %}{% endfor %}]')
|
||||||
|
|
||||||
|
# Using generator to mimic concurrency.
|
||||||
|
# The generator is not passed to the 'for' loop, because it does a list(values)
|
||||||
|
# instead, call gen.next() in the template to control the generator.
|
||||||
|
def gen():
|
||||||
|
yield 1
|
||||||
|
yield 2
|
||||||
|
# Simulate that another thread is now rendering.
|
||||||
|
# When the IfChangeNode stores state at 'self' it stays at '3' and skip the last yielded value below.
|
||||||
|
iter2 = iter([1, 2, 3])
|
||||||
|
output2 = template.render(Context({'foo': range(3), 'get_value': lambda: next(iter2)}))
|
||||||
|
self.assertEqual(output2, '[0,1,2,3]', 'Expected [0,1,2,3] in second parallel template, got {}'.format(output2))
|
||||||
|
yield 3
|
||||||
|
|
||||||
|
gen1 = gen()
|
||||||
|
output1 = template.render(Context({'foo': range(3), 'get_value': lambda: next(gen1)}))
|
||||||
|
self.assertEqual(output1, '[0,1,2,3]', 'Expected [0,1,2,3] in first template, got {}'.format(output1))
|
||||||
|
|
||||||
|
def test_ifchanged_render_once(self):
|
||||||
|
"""
|
||||||
|
#19890. The content of ifchanged template tag was rendered twice.
|
||||||
|
"""
|
||||||
|
template = Template('{% ifchanged %}{% cycle "1st time" "2nd time" %}{% endifchanged %}')
|
||||||
|
output = template.render(Context({}))
|
||||||
|
self.assertEqual(output, '1st time')
|
||||||
|
|
|
@ -82,34 +82,6 @@ class TemplateRegressionTests(SimpleTestCase):
|
||||||
except TemplateSyntaxError as e:
|
except TemplateSyntaxError as e:
|
||||||
self.assertEqual(e.args[0], "Invalid block tag: 'endblock', expected 'elif', 'else' or 'endif'")
|
self.assertEqual(e.args[0], "Invalid block tag: 'endblock', expected 'elif', 'else' or 'endif'")
|
||||||
|
|
||||||
def test_ifchanged_concurrency(self):
|
|
||||||
# Tests for #15849
|
|
||||||
template = Template('[0{% for x in foo %},{% with var=get_value %}{% ifchanged %}{{ var }}{% endifchanged %}{% endwith %}{% endfor %}]')
|
|
||||||
|
|
||||||
# Using generator to mimic concurrency.
|
|
||||||
# The generator is not passed to the 'for' loop, because it does a list(values)
|
|
||||||
# instead, call gen.next() in the template to control the generator.
|
|
||||||
def gen():
|
|
||||||
yield 1
|
|
||||||
yield 2
|
|
||||||
# Simulate that another thread is now rendering.
|
|
||||||
# When the IfChangeNode stores state at 'self' it stays at '3' and skip the last yielded value below.
|
|
||||||
iter2 = iter([1, 2, 3])
|
|
||||||
output2 = template.render(Context({'foo': range(3), 'get_value': lambda: next(iter2)}))
|
|
||||||
self.assertEqual(output2, '[0,1,2,3]', 'Expected [0,1,2,3] in second parallel template, got {}'.format(output2))
|
|
||||||
yield 3
|
|
||||||
|
|
||||||
gen1 = gen()
|
|
||||||
output1 = template.render(Context({'foo': range(3), 'get_value': lambda: next(gen1)}))
|
|
||||||
self.assertEqual(output1, '[0,1,2,3]', 'Expected [0,1,2,3] in first template, got {}'.format(output1))
|
|
||||||
|
|
||||||
def test_ifchanged_render_once(self):
|
|
||||||
""" Test for ticket #19890. The content of ifchanged template tag was
|
|
||||||
rendered twice."""
|
|
||||||
template = Template('{% ifchanged %}{% cycle "1st time" "2nd time" %}{% endifchanged %}')
|
|
||||||
output = template.render(Context({}))
|
|
||||||
self.assertEqual(output, '1st time')
|
|
||||||
|
|
||||||
def test_super_errors(self):
|
def test_super_errors(self):
|
||||||
"""
|
"""
|
||||||
Test behavior of the raise errors into included blocks.
|
Test behavior of the raise errors into included blocks.
|
||||||
|
|
Loading…
Reference in New Issue