diff options
| author | Preston Timmons <prestontimmons@gmail.com> | 2015-02-21 13:19:08 -0600 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-02-24 09:22:05 -0500 |
| commit | e15292daa04110f59dcb7515221e22d576437bb2 (patch) | |
| tree | 6daa00c3700dfcae47b0d71a3616e98b47cfbf16 /tests/template_tests/syntax_tests | |
| parent | f3a49c628eb8dc945c059f18cd7dbd2fa765f364 (diff) | |
[1.8.x] Moved ifchanged tests into syntax_tests/test_if_changed.py.
Backport of 3d8fee605184d8ffa47a32546298b52b52d7a087 from master
Diffstat (limited to 'tests/template_tests/syntax_tests')
| -rw-r--r-- | tests/template_tests/syntax_tests/test_if_changed.py | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/tests/template_tests/syntax_tests/test_if_changed.py b/tests/template_tests/syntax_tests/test_if_changed.py index 0d94365733..33e66880dd 100644 --- a/tests/template_tests/syntax_tests/test_if_changed.py +++ b/tests/template_tests/syntax_tests/test_if_changed.py @@ -1,3 +1,4 @@ +from django.template import Context, Template from django.test import SimpleTestCase from ..utils import setup @@ -152,3 +153,37 @@ class IfChangedTagTests(SimpleTestCase): """ output = self.engine.render_to_string('ifchanged-filter-ws', {'num': (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') |
