parts/django/tests/modeltests/validation/tests.py
changeset 307 c6bca38c1cbf
equal deleted inserted replaced
306:5ff1fc726848 307:c6bca38c1cbf
       
     1 from django import forms
       
     2 from django.test import TestCase
       
     3 from django.core.exceptions import NON_FIELD_ERRORS
       
     4 from modeltests.validation import ValidationTestCase
       
     5 from modeltests.validation.models import Author, Article, ModelToValidate
       
     6 
       
     7 # Import other tests for this package.
       
     8 from modeltests.validation.validators import TestModelsWithValidators
       
     9 from modeltests.validation.test_unique import GetUniqueCheckTests, PerformUniqueChecksTest
       
    10 from modeltests.validation.test_custom_messages import CustomMessagesTest
       
    11 
       
    12 
       
    13 class BaseModelValidationTests(ValidationTestCase):
       
    14 
       
    15     def test_missing_required_field_raises_error(self):
       
    16         mtv = ModelToValidate(f_with_custom_validator=42)
       
    17         self.assertFailsValidation(mtv.full_clean, ['name', 'number'])
       
    18 
       
    19     def test_with_correct_value_model_validates(self):
       
    20         mtv = ModelToValidate(number=10, name='Some Name')
       
    21         self.assertEqual(None, mtv.full_clean())
       
    22 
       
    23     def test_custom_validate_method(self):
       
    24         mtv = ModelToValidate(number=11)
       
    25         self.assertFailsValidation(mtv.full_clean, [NON_FIELD_ERRORS, 'name'])
       
    26 
       
    27     def test_wrong_FK_value_raises_error(self):
       
    28         mtv=ModelToValidate(number=10, name='Some Name', parent_id=3)
       
    29         self.assertFailsValidation(mtv.full_clean, ['parent'])
       
    30 
       
    31     def test_correct_FK_value_validates(self):
       
    32         parent = ModelToValidate.objects.create(number=10, name='Some Name')
       
    33         mtv = ModelToValidate(number=10, name='Some Name', parent_id=parent.pk)
       
    34         self.assertEqual(None, mtv.full_clean())
       
    35 
       
    36     def test_limitted_FK_raises_error(self):
       
    37         # The limit_choices_to on the parent field says that a parent object's
       
    38         # number attribute must be 10, so this should fail validation.
       
    39         parent = ModelToValidate.objects.create(number=11, name='Other Name')
       
    40         mtv = ModelToValidate(number=10, name='Some Name', parent_id=parent.pk)
       
    41         self.assertFailsValidation(mtv.full_clean, ['parent'])
       
    42 
       
    43     def test_wrong_email_value_raises_error(self):
       
    44         mtv = ModelToValidate(number=10, name='Some Name', email='not-an-email')
       
    45         self.assertFailsValidation(mtv.full_clean, ['email'])
       
    46 
       
    47     def test_correct_email_value_passes(self):
       
    48         mtv = ModelToValidate(number=10, name='Some Name', email='valid@email.com')
       
    49         self.assertEqual(None, mtv.full_clean())
       
    50 
       
    51     def test_wrong_url_value_raises_error(self):
       
    52         mtv = ModelToValidate(number=10, name='Some Name', url='not a url')
       
    53         self.assertFieldFailsValidationWithMessage(mtv.full_clean, 'url', [u'Enter a valid value.'])
       
    54 
       
    55     def test_correct_url_but_nonexisting_gives_404(self):
       
    56         mtv = ModelToValidate(number=10, name='Some Name', url='http://google.com/we-love-microsoft.html')
       
    57         self.assertFieldFailsValidationWithMessage(mtv.full_clean, 'url', [u'This URL appears to be a broken link.'])
       
    58 
       
    59     def test_correct_url_value_passes(self):
       
    60         mtv = ModelToValidate(number=10, name='Some Name', url='http://www.djangoproject.com/')
       
    61         self.assertEqual(None, mtv.full_clean()) # This will fail if there's no Internet connection
       
    62 
       
    63     def test_text_greater_that_charfields_max_length_eaises_erros(self):
       
    64         mtv = ModelToValidate(number=10, name='Some Name'*100)
       
    65         self.assertFailsValidation(mtv.full_clean, ['name',])
       
    66 
       
    67 class ArticleForm(forms.ModelForm):
       
    68     class Meta:
       
    69         model = Article
       
    70         exclude = ['author']
       
    71 
       
    72 class ModelFormsTests(TestCase):
       
    73     def setUp(self):
       
    74         self.author = Author.objects.create(name='Joseph Kocherhans')
       
    75 
       
    76     def test_partial_validation(self):
       
    77         # Make sure the "commit=False and set field values later" idiom still
       
    78         # works with model validation.
       
    79         data = {
       
    80             'title': 'The state of model validation',
       
    81             'pub_date': '2010-1-10 14:49:00'
       
    82         }
       
    83         form = ArticleForm(data)
       
    84         self.assertEqual(form.errors.keys(), [])
       
    85         article = form.save(commit=False)
       
    86         article.author = self.author
       
    87         article.save()
       
    88 
       
    89     def test_validation_with_empty_blank_field(self):
       
    90         # Since a value for pub_date wasn't provided and the field is
       
    91         # blank=True, model-validation should pass.
       
    92         # Also, Article.clean() should be run, so pub_date will be filled after
       
    93         # validation, so the form should save cleanly even though pub_date is
       
    94         # not allowed to be null.
       
    95         data = {
       
    96             'title': 'The state of model validation',
       
    97         }
       
    98         article = Article(author_id=self.author.id)
       
    99         form = ArticleForm(data, instance=article)
       
   100         self.assertEqual(form.errors.keys(), [])
       
   101         self.assertNotEqual(form.instance.pub_date, None)
       
   102         article = form.save()
       
   103 
       
   104     def test_validation_with_invalid_blank_field(self):
       
   105         # Even though pub_date is set to blank=True, an invalid value was
       
   106         # provided, so it should fail validation.
       
   107         data = {
       
   108             'title': 'The state of model validation',
       
   109             'pub_date': 'never'
       
   110         }
       
   111         article = Article(author_id=self.author.id)
       
   112         form = ArticleForm(data, instance=article)
       
   113         self.assertEqual(form.errors.keys(), ['pub_date'])
       
   114