def test_generic_ipaddress_as_generic(self): # The edge cases of the IPv6 validation code are not deeply tested # here, they are covered in the tests for django.utils.ipv6 f = GenericIPAddressField() self.assertFormErrors(['This field is required.'], f.clean, '') self.assertFormErrors(['This field is required.'], f.clean, None) self.assertEqual(f.clean(' 127.0.0.1 '), '127.0.0.1') self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, 'foo') self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '127.0.0.') self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '1.2.3.4.5') self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '256.125.1.5') self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a') self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '12345:2:3:4') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3::4') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, 'foo::223:6cff:fe8a:2e8a') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3:4:5:6:7:8') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1:2')
def test_generic_ipaddress_as_ipv6_only(self): f = GenericIPAddressField(protocol="IPv6") self.assertFormErrors(['This field is required.'], f.clean, '') self.assertFormErrors(['This field is required.'], f.clean, None) self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, '127.0.0.1') self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, 'foo') self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, '127.0.0.') self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, '1.2.3.4.5') self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, '256.125.1.5') self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a') self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '12345:2:3:4') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3::4') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, 'foo::223:6cff:fe8a:2e8a') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3:4:5:6:7:8') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1:2')
def test_generic_ipaddress_as_ipv4_only(self): f = GenericIPAddressField(protocol="IPv4") self.assertFormErrors(["This field is required."], f.clean, "") self.assertFormErrors(["This field is required."], f.clean, None) self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1") self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "foo") self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "127.0.0.") self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "1.2.3.4.5") self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "256.125.1.5") self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "fe80::223:6cff:fe8a:2e8a") self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "2a02::223:6cff:fe8a:2e8a")
def test_generic_ipaddress_as_ipv4_only(self): f = GenericIPAddressField(protocol="IPv4") self.assertFormErrors(['This field is required.'], f.clean, '') self.assertFormErrors(['This field is required.'], f.clean, None) self.assertEqual(f.clean(' 127.0.0.1 '), '127.0.0.1') self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, 'foo') self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '127.0.0.') self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '1.2.3.4.5') self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '256.125.1.5') self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, 'fe80::223:6cff:fe8a:2e8a') self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '2a02::223:6cff:fe8a:2e8a')
def test_generic_ipaddress_normalization(self): # Test the normalizing code f = GenericIPAddressField() self.assertEqual(f.clean(' ::ffff:0a0a:0a0a '), '::ffff:10.10.10.10') self.assertEqual(f.clean(' ::ffff:10.10.10.10 '), '::ffff:10.10.10.10') self.assertEqual(f.clean(' 2001:000:a:0000:0:fe:fe:beef '), '2001:0:a::fe:fe:beef') self.assertEqual(f.clean(' 2001::a:0000:0:fe:fe:beef '), '2001:0:a::fe:fe:beef') f = GenericIPAddressField(unpack_ipv4=True) self.assertEqual(f.clean(' ::ffff:0a0a:0a0a'), '10.10.10.10')
def test_generic_ipaddress_as_generic_not_required(self): f = GenericIPAddressField(required=False) self.assertEqual(f.clean(''), '') self.assertEqual(f.clean(None), '') self.assertEqual(f.clean('127.0.0.1'), '127.0.0.1') self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, 'foo') self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '127.0.0.') self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '1.2.3.4.5') self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '256.125.1.5') self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a') self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '12345:2:3:4') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3::4') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, 'foo::223:6cff:fe8a:2e8a') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3:4:5:6:7:8') self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1:2')
class ApiKeyForm(ModelForm): """ Generate a random API key if one isn't provided. """ class Meta: model = ApiKey fields = ('key', 'logged_ip', 'last_used', 'dataset') key = CharField( max_length=KEY_SIZE, required=False, help_text=u'If not provided, a random key will be generated.') logged_ip = GenericIPAddressField(required=False) def clean(self): apikey = self.cleaned_data.get('key') or '' if not apikey: # 'key' is required, but we want to allow generating it # server-side. so we remove its errors if it's not # provided. Note that we can't just define # self.clean_key() because that's never called if the key # isn't provided. self._errors.pop('key', None) apikey = generate_unique_api_key() self.cleaned_data['key'] = apikey if hasattr(self, 'clean_key'): # NOW we can call this... self.cleaned_data['key'] = self.clean_key() # For logged IP, convert blank to NULL self.cleaned_data['logged_ip'] = self.cleaned_data.get( 'logged_ip') or None return self.cleaned_data
def test_generic_ipaddress_as_generic_not_required(self): f = GenericIPAddressField(required=False) self.assertEqual(f.clean(""), "") self.assertEqual(f.clean(None), "") self.assertEqual(f.clean("127.0.0.1"), "127.0.0.1") self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "foo") self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "127.0.0.") self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "1.2.3.4.5") self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "256.125.1.5") self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a") self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "12345:2:3:4") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1::2:3::4") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "foo::223:6cff:fe8a:2e8a") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1::2:3:4:5:6:7:8") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1:2")
def test_generic_ipaddressfield(self): e = { "required": "REQUIRED", "invalid": "INVALID IP ADDRESS", } f = GenericIPAddressField(error_messages=e) self.assertFormErrors(["REQUIRED"], f.clean, "") self.assertFormErrors(["INVALID IP ADDRESS"], f.clean, "127.0.0")
def test_generic_ipaddressfield(self): e = { 'required': 'REQUIRED', 'invalid': 'INVALID IP ADDRESS', } f = GenericIPAddressField(error_messages=e) self.assertFormErrors(['REQUIRED'], f.clean, '') self.assertFormErrors(['INVALID IP ADDRESS'], f.clean, '127.0.0')
def test_generic_ipaddress_as_generic(self): # The edge cases of the IPv6 validation code are not deeply tested # here, they are covered in the tests for django.utils.ipv6 f = GenericIPAddressField() self.assertFormErrors(["This field is required."], f.clean, "") self.assertFormErrors(["This field is required."], f.clean, None) self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1") self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "foo") self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "127.0.0.") self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "1.2.3.4.5") self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "256.125.1.5") self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a") self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "12345:2:3:4") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1::2:3::4") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "foo::223:6cff:fe8a:2e8a") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1::2:3:4:5:6:7:8") self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1:2")
def test_generic_ipaddress_normalization(self): # Test the normalising code f = GenericIPAddressField() self.assertEqual(f.clean(' ::ffff:0a0a:0a0a '), '::ffff:10.10.10.10') self.assertEqual(f.clean(' ::ffff:10.10.10.10 '), '::ffff:10.10.10.10') self.assertEqual(f.clean(' 2001:000:a:0000:0:fe:fe:beef '), '2001:0:a::fe:fe:beef') self.assertEqual(f.clean(' 2001::a:0000:0:fe:fe:beef '), '2001:0:a::fe:fe:beef') f = GenericIPAddressField(unpack_ipv4=True) self.assertEqual(f.clean(' ::ffff:0a0a:0a0a'), '10.10.10.10')
def test_generic_ipaddress_normalization(self): # Test the normalizing code f = GenericIPAddressField() self.assertEqual(f.clean(" ::ffff:0a0a:0a0a "), "::ffff:10.10.10.10") self.assertEqual(f.clean(" ::ffff:10.10.10.10 "), "::ffff:10.10.10.10") self.assertEqual(f.clean(" 2001:000:a:0000:0:fe:fe:beef "), "2001:0:a::fe:fe:beef") self.assertEqual(f.clean(" 2001::a:0000:0:fe:fe:beef "), "2001:0:a::fe:fe:beef") f = GenericIPAddressField(unpack_ipv4=True) self.assertEqual(f.clean(" ::ffff:0a0a:0a0a"), "10.10.10.10")
class AllFieldTypesForm(Form): char = CharField() int_ = IntegerField() date = DateField() time = TimeField() datetime_ = DateTimeField() regex = RegexField(regex='^[a-f]{3}$') email = EmailField() file = FileField() # image = ImageField() url = URLField() bool = BooleanField() nullbool = NullBooleanField() choice = ChoiceField(choices=(('test choice', 'yay test choice'), )) multichoice = MultipleChoiceField(choices=( ('test choice', 'yay test choice'), ('test choice 2', 'yay another choice'), ('test choice 3', 'yay test choice'), )) float = FloatField() decimal = DecimalField() ip = IPAddressField() generic_ip = GenericIPAddressField() filepath = FilePathField(path=tempfile.gettempdir(), allow_files=True, allow_folders=True) slug = SlugField() typed_choice = TypedChoiceField(choices=( (1, 'test'), (2, 'test 2'), (3, 'bah'), ), coerce=int) typed_multichoice = TypedMultipleChoiceField(choices=( (1, 'test'), (2, 'test 2'), (3, 'bah'), ), coerce=int) model_choice = ModelChoiceField(queryset=get_user_model().objects.all()) model_multichoice = ModelMultipleChoiceField( queryset=get_user_model().objects.all())
def test_generic_ipaddress_as_ipv4_only(self): f = GenericIPAddressField(protocol="IPv4") with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean("") with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean(None) self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"): f.clean("foo") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"): f.clean("127.0.0.") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"): f.clean("1.2.3.4.5") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"): f.clean("256.125.1.5") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"): f.clean("fe80::223:6cff:fe8a:2e8a") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"): f.clean("2a02::223:6cff:fe8a:2e8a")
def test_generic_ipaddress_as_generic_not_required(self): f = GenericIPAddressField(required=False) self.assertEqual(f.clean(""), "") self.assertEqual(f.clean(None), "") self.assertEqual(f.clean("127.0.0.1"), "127.0.0.1") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"): f.clean("foo") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"): f.clean("127.0.0.") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"): f.clean("1.2.3.4.5") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"): f.clean("256.125.1.5") self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a") self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("12345:2:3:4") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("1::2:3::4") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("foo::223:6cff:fe8a:2e8a") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("1::2:3:4:5:6:7:8") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("1:2")
def test_generic_ipaddress_as_ipv6_only(self): f = GenericIPAddressField(protocol="IPv6") with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean('') with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean(None) with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean('127.0.0.1') with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean('foo') with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean('127.0.0.') with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean('1.2.3.4.5') with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean('256.125.1.5') self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a') self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a') with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean('12345:2:3:4') with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean('1::2:3::4') with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean('foo::223:6cff:fe8a:2e8a') with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean('1::2:3:4:5:6:7:8') with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean('1:2')
def test_generic_ipaddress_invalid_arguments(self): with self.assertRaises(ValueError): GenericIPAddressField(protocol='hamster') with self.assertRaises(ValueError): GenericIPAddressField(protocol='ipv4', unpack_ipv4=True)
def __init__(self, *args, **kwargs): """Custom model form constructor to account for custom related objects, i.e. instances of (subclasses of) `FilterSetFilterField`. """ super(FilterSetForm, self).__init__(*args, **kwargs) # Define all filter set filter fields for which we want form fields # The "choice" field contains the list of available options. # Multiselect form fields that load their choices asynchronously define # a "load" value, used to identify the DMARC aggregate report field # from which the options should be loaded. # See `views.choices_async` and `widgets.MultiSelectWidget` # The "label" value is used as text for the corresponding HTML label # element, "class" identifies the corresponding model class (subclass # of `FilterSetFilterField`), and "type" defines the allowed type of # the form value, used for Django's auto sanitization/type coercion. self.multiselect_filter_fields = { "report_sender": { "load": "reporter", "label": "Reporter(s)", "class": ReportSender, "type": str }, "report_receiver_domain": { "load": "reportee", "label": "Reportee(s)", "class": ReportReceiverDomain, "type": str }, "raw_dkim_domain": { "load": "dkim_domain", "label": "DKIM Domain(s)", "class": RawDkimDomain, "type": str }, "raw_spf_domain": { "load": "spf_domain", "label": "SPF Domain(s)", "class": RawSpfDomain, "type": str }, "raw_dkim_result": { "choices": choices.DKIM_RESULT, "label": "DKIM Result(s)", "class": RawDkimResult, "type": int }, "raw_spf_result": { "choices": choices.SPF_RESULT, "label": "SPF Result(s)", "class": RawSpfResult, "type": int }, "aligned_dkim_result": { "choices": choices.DMARC_RESULT, "label": "Aligned DKIM Result(s)", "class": AlignedDkimResult, "type": int }, "aligned_spf_result": { "choices": choices.DMARC_RESULT, "label": "Aligned SPF Result(s)", "class": AlignedSpfResult, "type": int }, "disposition": { "choices": choices.DISPOSITION_TYPE, "label": "Disposition(s)", "class": Disposition, "type": int } } # Initialize `FilterSetFilterField` form fields from dict defined above # The keyword arguments passed to the `MultiSelectWidget` constructor # are only relevant for multiselect elements that load their options # dynamically. for field_name, field_dict in self.multiselect_filter_fields.items(): self.fields[field_name] = AsyncTypedMultipleChoiceField( coerce=field_dict.get("type"), required=False, label=field_dict.get("label"), choices=field_dict.get("choices", ()), widget=MultiSelectWidget( **{ "load": field_dict.get("load", ""), "action": reverse("choices_async") })) # If the corresponding model objects already exists (i.e. on edit) # the selected options should also be shown as selected in the form if self.instance.id: self.fields[field_name].initial = list( field_dict["class"].objects.filter( foreign_key=self.instance.id).values_list("value", flat=True)) # For multiselect fields that load their options asynchronously # we have to add already selected options to the field's # choices attribute if not field_dict.get("choices"): self.fields[field_name].choices = [ (value, value) for value in self.fields[field_name].initial ] # Define additional non-multiselect filter set filter field form fields # Currently, there can at most be one `SourceIP` and one `MultipleDkim` # object on a filter set. See `models.FilterSetFilterField`'s docstring # for more info about why these filters have their own class and aren't # attributes of a `FilterSet` object. self.fields["source_ip"] = GenericIPAddressField( required=False, label="Mail Sender IP") self.fields["multiple_dkim"] = BooleanField(required=False, label="Multiple DKIM only") # Fill fields with existing data if any if self.instance.id: source_ip_initial = SourceIP.objects.filter( foreign_key=self.instance.id).values_list("value", flat=True) if len(source_ip_initial): self.fields["source_ip"].initial = source_ip_initial[0] multiple_dkim_initial = MultipleDkim.objects.filter( foreign_key=self.instance.id).values_list("value", flat=True) if len(multiple_dkim_initial): self.fields["multiple_dkim"].initial = multiple_dkim_initial[0]
def test_generic_ipaddress_as_ipv6_only(self): f = GenericIPAddressField(protocol="IPv6") with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean("") with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean(None) with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean("127.0.0.1") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean("foo") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean("127.0.0.") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean("1.2.3.4.5") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"): f.clean("256.125.1.5") self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a") self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("12345:2:3:4") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("1::2:3::4") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("foo::223:6cff:fe8a:2e8a") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("1::2:3:4:5:6:7:8") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("1:2")
def test_generic_ipaddress_as_generic(self): # The edge cases of the IPv6 validation code are not deeply tested # here, they are covered in the tests for django.utils.ipv6 f = GenericIPAddressField() with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean("") with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean(None) self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"): f.clean("foo") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"): f.clean("127.0.0.") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"): f.clean("1.2.3.4.5") with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"): f.clean("256.125.1.5") self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a") self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("12345:2:3:4") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("1::2:3::4") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("foo::223:6cff:fe8a:2e8a") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("1::2:3:4:5:6:7:8") with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"): f.clean("1:2")