1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
from decimal import Decimal
import django
from django.core.exceptions import ValidationError
from django.test import TestCase
from django.utils import six
from django.utils import translation
from django.utils.translation import ugettext_lazy as _
from django.utils.unittest import expectedFailure, skipIf
import floppyforms.__future__ as forms
from .models import Registration
class RegistrationForm(forms.Form):
honeypot = forms.CharField(required=False, widget=forms.HiddenInput)
firstname = forms.CharField(label=_(u'Your first name?'))
lastname = forms.CharField(label=_(u'Your last name:'))
username = forms.CharField(max_length=30)
password = forms.CharField(
widget=forms.PasswordInput,
help_text=_(u'Make sure to use a secure password.'),
)
password2 = forms.CharField(label=_(u'Retype password'), widget=forms.PasswordInput)
age = forms.IntegerField(required=False)
height = forms.DecimalField(localize=True, required=False)
agree_to_terms = forms.BooleanField()
def clean_honeypot(self):
if self.cleaned_data.get('honeypot'):
raise ValidationError(u'Haha, you trapped into the honeypot.')
return self.cleaned_data['honeypot']
def clean(self):
if self.errors:
raise ValidationError(u'Please correct the errors below.')
class RegistrationModelForm(forms.ModelForm):
class Meta:
model = Registration
fields = (
'firstname',
'lastname',
'username',
'age',
)
class FormRenderAsMethodsTests(TestCase):
def test_default_rendering(self):
form = RegistrationForm()
with self.assertTemplateUsed('floppyforms/layouts/default.html'):
with self.assertTemplateUsed('floppyforms/layouts/table.html'):
rendered = six.text_type(form)
self.assertTrue(' name="firstname"' in rendered)
form = RegistrationModelForm()
with self.assertTemplateUsed('floppyforms/layouts/default.html'):
with self.assertTemplateUsed('floppyforms/layouts/table.html'):
rendered = six.text_type(form)
self.assertTrue(' name="firstname"' in rendered)
def test_as_p(self):
form = RegistrationForm()
with self.assertTemplateUsed('floppyforms/layouts/p.html'):
rendered = form.as_p()
self.assertTrue(' name="firstname"' in rendered)
form = RegistrationModelForm()
with self.assertTemplateUsed('floppyforms/layouts/p.html'):
rendered = form.as_p()
self.assertTrue(' name="firstname"' in rendered)
def test_as_table(self):
form = RegistrationForm()
with self.assertTemplateUsed('floppyforms/layouts/table.html'):
rendered = form.as_table()
self.assertTrue(' name="firstname"' in rendered)
form = RegistrationModelForm()
with self.assertTemplateUsed('floppyforms/layouts/table.html'):
rendered = form.as_table()
self.assertTrue(' name="firstname"' in rendered)
def test_as_ul(self):
form = RegistrationForm()
with self.assertTemplateUsed('floppyforms/layouts/ul.html'):
rendered = form.as_ul()
self.assertTrue(' name="firstname"' in rendered)
form = RegistrationModelForm()
with self.assertTemplateUsed('floppyforms/layouts/ul.html'):
rendered = form.as_ul()
self.assertTrue(' name="firstname"' in rendered)
class FormHasChangedTests(TestCase):
def test_basic_has_changed(self):
form = RegistrationForm()
self.assertFalse(form.has_changed())
form = RegistrationForm({'height': '1.89'})
self.assertTrue(form.has_changed())
form = RegistrationForm({'height': '1.89'},
initial={'height': Decimal('1.89')})
self.assertFalse(form.has_changed())
def test_custom_has_changed_logic_for_checkbox_input(self):
form = RegistrationForm({'agree_to_terms': True})
self.assertTrue(form.has_changed())
form = RegistrationForm({'agree_to_terms': False},
initial={'agree_to_terms': False})
self.assertFalse(form.has_changed())
form = RegistrationForm({'agree_to_terms': False},
initial={'agree_to_terms': 'False'})
self.assertFalse(form.has_changed())
@skipIf(django.VERSION < (1, 6), 'Only applies to Django >= 1.6')
def test_widgets_do_not_have_has_changed_method(self):
self.assertFalse(hasattr(forms.CheckboxInput, '_has_changed'))
self.assertFalse(hasattr(forms.NullBooleanSelect, '_has_changed'))
self.assertFalse(hasattr(forms.SelectMultiple, '_has_changed'))
self.assertFalse(hasattr(forms.FileInput, '_has_changed'))
self.assertFalse(hasattr(forms.DateInput, '_has_changed'))
self.assertFalse(hasattr(forms.DateTimeInput, '_has_changed'))
self.assertFalse(hasattr(forms.TimeInput, '_has_changed'))
def test_has_changed_logic_with_localized_values(self):
'''
See: https://code.djangoproject.com/ticket/16612
'''
with translation.override('de-de'):
form = RegistrationForm({'height': '1,89'},
initial={'height': Decimal('1.89')})
self.assertFalse(form.has_changed())
if django.VERSION < (1, 6):
test_has_changed_logic_with_localized_values = expectedFailure(
test_has_changed_logic_with_localized_values)
|