[4.0.x] Refs #31026 -- Fixed forms_tests if Jinja2 is not installed.
Backport of 881a479911
from main
This commit is contained in:
parent
9511a05074
commit
bc1fa8ebcd
|
@ -1,30 +1,16 @@
|
|||
import inspect
|
||||
from unittest import skipIf
|
||||
|
||||
from django.test.utils import override_settings
|
||||
|
||||
TEST_SETTINGS = [
|
||||
{
|
||||
'FORM_RENDERER': 'django.forms.renderers.DjangoTemplates',
|
||||
'TEMPLATES': {'BACKEND': 'django.template.backends.django.DjangoTemplates'},
|
||||
},
|
||||
{
|
||||
'FORM_RENDERER': 'django.forms.renderers.Jinja2',
|
||||
'TEMPLATES': {'BACKEND': 'django.template.backends.jinja2.Jinja2'},
|
||||
},
|
||||
]
|
||||
try:
|
||||
import jinja2
|
||||
except ImportError:
|
||||
jinja2 = None
|
||||
|
||||
|
||||
def test_all_form_renderers():
|
||||
def wrapper(func):
|
||||
def inner(*args, **kwargs):
|
||||
for settings in TEST_SETTINGS:
|
||||
with override_settings(**settings):
|
||||
func(*args, **kwargs)
|
||||
return inner
|
||||
|
||||
def decorator(cls):
|
||||
for name, func in inspect.getmembers(cls, inspect.isfunction):
|
||||
if name.startswith('test_'):
|
||||
setattr(cls, name, wrapper(func))
|
||||
return cls
|
||||
return decorator
|
||||
def jinja2_tests(test_func):
|
||||
test_func = skipIf(jinja2 is None, 'this test requires jinja2')(test_func)
|
||||
return override_settings(
|
||||
FORM_RENDERER='django.forms.renderers.Jinja2',
|
||||
TEMPLATES={'BACKEND': 'django.template.backends.jinja2.Jinja2'},
|
||||
)(test_func)
|
||||
|
|
|
@ -23,7 +23,7 @@ from django.test import SimpleTestCase
|
|||
from django.test.utils import override_settings
|
||||
from django.utils.datastructures import MultiValueDict
|
||||
from django.utils.safestring import mark_safe
|
||||
from tests.forms_tests.tests import test_all_form_renderers
|
||||
from tests.forms_tests.tests import jinja2_tests
|
||||
|
||||
|
||||
class FrameworkForm(Form):
|
||||
|
@ -56,7 +56,6 @@ class MultiValueDictLike(dict):
|
|||
return [self[key]]
|
||||
|
||||
|
||||
@test_all_form_renderers()
|
||||
class FormsTestCase(SimpleTestCase):
|
||||
# A Form is a collection of Fields. It knows how to validate a set of data and it
|
||||
# knows how to render itself in a couple of default ways (e.g., an HTML table).
|
||||
|
@ -3541,6 +3540,11 @@ Password: <input type="password" name="password" required>
|
|||
)
|
||||
|
||||
|
||||
@jinja2_tests
|
||||
class Jinja2FormsTestCase(FormsTestCase):
|
||||
pass
|
||||
|
||||
|
||||
class CustomRenderer(DjangoTemplates):
|
||||
pass
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ from django.forms.formsets import BaseFormSet, all_valid, formset_factory
|
|||
from django.forms.utils import ErrorList
|
||||
from django.forms.widgets import HiddenInput
|
||||
from django.test import SimpleTestCase
|
||||
from tests.forms_tests.tests import test_all_form_renderers
|
||||
from tests.forms_tests.tests import jinja2_tests
|
||||
|
||||
|
||||
class Choice(Form):
|
||||
|
@ -48,7 +48,6 @@ class CustomKwargForm(Form):
|
|||
super().__init__(*args, **kwargs)
|
||||
|
||||
|
||||
@test_all_form_renderers()
|
||||
class FormsFormsetTestCase(SimpleTestCase):
|
||||
|
||||
def make_choiceformset(
|
||||
|
@ -1315,7 +1314,11 @@ class FormsFormsetTestCase(SimpleTestCase):
|
|||
self.assertEqual(formset.empty_form.renderer, renderer)
|
||||
|
||||
|
||||
@test_all_form_renderers()
|
||||
@jinja2_tests
|
||||
class Jinja2FormsFormsetTestCase(FormsFormsetTestCase):
|
||||
pass
|
||||
|
||||
|
||||
class FormsetAsTagTests(SimpleTestCase):
|
||||
def setUp(self):
|
||||
data = {
|
||||
|
@ -1364,6 +1367,11 @@ class FormsetAsTagTests(SimpleTestCase):
|
|||
)
|
||||
|
||||
|
||||
@jinja2_tests
|
||||
class Jinja2FormsetAsTagTests(FormsetAsTagTests):
|
||||
pass
|
||||
|
||||
|
||||
class ArticleForm(Form):
|
||||
title = CharField()
|
||||
pub_date = DateField()
|
||||
|
@ -1372,7 +1380,6 @@ class ArticleForm(Form):
|
|||
ArticleFormSet = formset_factory(ArticleForm)
|
||||
|
||||
|
||||
@test_all_form_renderers()
|
||||
class TestIsBoundBehavior(SimpleTestCase):
|
||||
def test_no_data_error(self):
|
||||
formset = ArticleFormSet({})
|
||||
|
@ -1485,6 +1492,11 @@ class TestIsBoundBehavior(SimpleTestCase):
|
|||
self.assertHTMLEqual(empty_forms[0].as_p(), empty_forms[1].as_p())
|
||||
|
||||
|
||||
@jinja2_tests
|
||||
class TestIsBoundBehavior(TestIsBoundBehavior):
|
||||
pass
|
||||
|
||||
|
||||
class TestEmptyFormSet(SimpleTestCase):
|
||||
def test_empty_formset_is_valid(self):
|
||||
"""An empty formset still calls clean()"""
|
||||
|
|
|
@ -4,10 +4,9 @@ from django.forms import (
|
|||
from django.test import SimpleTestCase
|
||||
from django.utils import translation
|
||||
from django.utils.translation import gettext_lazy
|
||||
from tests.forms_tests.tests import test_all_form_renderers
|
||||
from tests.forms_tests.tests import jinja2_tests
|
||||
|
||||
|
||||
@test_all_form_renderers()
|
||||
class FormsI18nTests(SimpleTestCase):
|
||||
def test_lazy_labels(self):
|
||||
class SomeForm(Form):
|
||||
|
@ -95,3 +94,8 @@ class FormsI18nTests(SimpleTestCase):
|
|||
degree = IntegerField(widget=Select(choices=((1, gettext_lazy('test')),)))
|
||||
|
||||
CopyForm()
|
||||
|
||||
|
||||
@jinja2_tests
|
||||
class Jinja2FormsI18nTests(FormsI18nTests):
|
||||
pass
|
||||
|
|
|
@ -5,7 +5,7 @@ from django.db import models
|
|||
from django.forms import CharField, FileField, Form, ModelForm
|
||||
from django.forms.models import ModelFormMetaclass
|
||||
from django.test import SimpleTestCase, TestCase
|
||||
from tests.forms_tests.tests import test_all_form_renderers
|
||||
from tests.forms_tests.tests import jinja2_tests
|
||||
|
||||
from ..models import (
|
||||
BoundaryModel, ChoiceFieldModel, ChoiceModel, ChoiceOptionModel, Defaults,
|
||||
|
@ -284,7 +284,6 @@ class ManyToManyExclusionTestCase(TestCase):
|
|||
self.assertEqual([obj.pk for obj in form.instance.multi_choice_int.all()], data['multi_choice_int'])
|
||||
|
||||
|
||||
@test_all_form_renderers()
|
||||
class EmptyLabelTestCase(TestCase):
|
||||
def test_empty_field_char(self):
|
||||
f = EmptyCharLabelChoiceForm()
|
||||
|
@ -374,3 +373,8 @@ class EmptyLabelTestCase(TestCase):
|
|||
<option value="2">Bar</option>
|
||||
</select></p>"""
|
||||
)
|
||||
|
||||
|
||||
@jinja2_tests
|
||||
class Jinja2EmptyLabelTestCase(EmptyLabelTestCase):
|
||||
pass
|
||||
|
|
Loading…
Reference in New Issue