1. from django.core.exceptions import ValidationError
    
  2. from django.forms import GenericIPAddressField
    
  3. from django.test import SimpleTestCase
    
  4. 
    
  5. 
    
  6. class GenericIPAddressFieldTest(SimpleTestCase):
    
  7.     def test_generic_ipaddress_invalid_arguments(self):
    
  8.         with self.assertRaises(ValueError):
    
  9.             GenericIPAddressField(protocol="hamster")
    
  10.         with self.assertRaises(ValueError):
    
  11.             GenericIPAddressField(protocol="ipv4", unpack_ipv4=True)
    
  12. 
    
  13.     def test_generic_ipaddress_as_generic(self):
    
  14.         # The edge cases of the IPv6 validation code are not deeply tested
    
  15.         # here, they are covered in the tests for django.utils.ipv6
    
  16.         f = GenericIPAddressField()
    
  17.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  18.             f.clean("")
    
  19.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  20.             f.clean(None)
    
  21.         self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1")
    
  22.         with self.assertRaisesMessage(
    
  23.             ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
    
  24.         ):
    
  25.             f.clean("foo")
    
  26.         with self.assertRaisesMessage(
    
  27.             ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
    
  28.         ):
    
  29.             f.clean("127.0.0.")
    
  30.         with self.assertRaisesMessage(
    
  31.             ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
    
  32.         ):
    
  33.             f.clean("1.2.3.4.5")
    
  34.         with self.assertRaisesMessage(
    
  35.             ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
    
  36.         ):
    
  37.             f.clean("256.125.1.5")
    
  38.         self.assertEqual(
    
  39.             f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a"
    
  40.         )
    
  41.         self.assertEqual(
    
  42.             f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a"
    
  43.         )
    
  44.         with self.assertRaisesMessage(
    
  45.             ValidationError, "'This is not a valid IPv6 address.'"
    
  46.         ):
    
  47.             f.clean("12345:2:3:4")
    
  48.         with self.assertRaisesMessage(
    
  49.             ValidationError, "'This is not a valid IPv6 address.'"
    
  50.         ):
    
  51.             f.clean("1::2:3::4")
    
  52.         with self.assertRaisesMessage(
    
  53.             ValidationError, "'This is not a valid IPv6 address.'"
    
  54.         ):
    
  55.             f.clean("foo::223:6cff:fe8a:2e8a")
    
  56.         with self.assertRaisesMessage(
    
  57.             ValidationError, "'This is not a valid IPv6 address.'"
    
  58.         ):
    
  59.             f.clean("1::2:3:4:5:6:7:8")
    
  60.         with self.assertRaisesMessage(
    
  61.             ValidationError, "'This is not a valid IPv6 address.'"
    
  62.         ):
    
  63.             f.clean("1:2")
    
  64. 
    
  65.     def test_generic_ipaddress_as_ipv4_only(self):
    
  66.         f = GenericIPAddressField(protocol="IPv4")
    
  67.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  68.             f.clean("")
    
  69.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  70.             f.clean(None)
    
  71.         self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1")
    
  72.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
    
  73.             f.clean("foo")
    
  74.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
    
  75.             f.clean("127.0.0.")
    
  76.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
    
  77.             f.clean("1.2.3.4.5")
    
  78.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
    
  79.             f.clean("256.125.1.5")
    
  80.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
    
  81.             f.clean("fe80::223:6cff:fe8a:2e8a")
    
  82.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
    
  83.             f.clean("2a02::223:6cff:fe8a:2e8a")
    
  84. 
    
  85.     def test_generic_ipaddress_as_ipv6_only(self):
    
  86.         f = GenericIPAddressField(protocol="IPv6")
    
  87.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  88.             f.clean("")
    
  89.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  90.             f.clean(None)
    
  91.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
    
  92.             f.clean("127.0.0.1")
    
  93.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
    
  94.             f.clean("foo")
    
  95.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
    
  96.             f.clean("127.0.0.")
    
  97.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
    
  98.             f.clean("1.2.3.4.5")
    
  99.         with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
    
  100.             f.clean("256.125.1.5")
    
  101.         self.assertEqual(
    
  102.             f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a"
    
  103.         )
    
  104.         self.assertEqual(
    
  105.             f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a"
    
  106.         )
    
  107.         with self.assertRaisesMessage(
    
  108.             ValidationError, "'This is not a valid IPv6 address.'"
    
  109.         ):
    
  110.             f.clean("12345:2:3:4")
    
  111.         with self.assertRaisesMessage(
    
  112.             ValidationError, "'This is not a valid IPv6 address.'"
    
  113.         ):
    
  114.             f.clean("1::2:3::4")
    
  115.         with self.assertRaisesMessage(
    
  116.             ValidationError, "'This is not a valid IPv6 address.'"
    
  117.         ):
    
  118.             f.clean("foo::223:6cff:fe8a:2e8a")
    
  119.         with self.assertRaisesMessage(
    
  120.             ValidationError, "'This is not a valid IPv6 address.'"
    
  121.         ):
    
  122.             f.clean("1::2:3:4:5:6:7:8")
    
  123.         with self.assertRaisesMessage(
    
  124.             ValidationError, "'This is not a valid IPv6 address.'"
    
  125.         ):
    
  126.             f.clean("1:2")
    
  127. 
    
  128.     def test_generic_ipaddress_as_generic_not_required(self):
    
  129.         f = GenericIPAddressField(required=False)
    
  130.         self.assertEqual(f.clean(""), "")
    
  131.         self.assertEqual(f.clean(None), "")
    
  132.         self.assertEqual(f.clean("127.0.0.1"), "127.0.0.1")
    
  133.         with self.assertRaisesMessage(
    
  134.             ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
    
  135.         ):
    
  136.             f.clean("foo")
    
  137.         with self.assertRaisesMessage(
    
  138.             ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
    
  139.         ):
    
  140.             f.clean("127.0.0.")
    
  141.         with self.assertRaisesMessage(
    
  142.             ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
    
  143.         ):
    
  144.             f.clean("1.2.3.4.5")
    
  145.         with self.assertRaisesMessage(
    
  146.             ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
    
  147.         ):
    
  148.             f.clean("256.125.1.5")
    
  149.         self.assertEqual(
    
  150.             f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a"
    
  151.         )
    
  152.         self.assertEqual(
    
  153.             f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a"
    
  154.         )
    
  155.         with self.assertRaisesMessage(
    
  156.             ValidationError, "'This is not a valid IPv6 address.'"
    
  157.         ):
    
  158.             f.clean("12345:2:3:4")
    
  159.         with self.assertRaisesMessage(
    
  160.             ValidationError, "'This is not a valid IPv6 address.'"
    
  161.         ):
    
  162.             f.clean("1::2:3::4")
    
  163.         with self.assertRaisesMessage(
    
  164.             ValidationError, "'This is not a valid IPv6 address.'"
    
  165.         ):
    
  166.             f.clean("foo::223:6cff:fe8a:2e8a")
    
  167.         with self.assertRaisesMessage(
    
  168.             ValidationError, "'This is not a valid IPv6 address.'"
    
  169.         ):
    
  170.             f.clean("1::2:3:4:5:6:7:8")
    
  171.         with self.assertRaisesMessage(
    
  172.             ValidationError, "'This is not a valid IPv6 address.'"
    
  173.         ):
    
  174.             f.clean("1:2")
    
  175. 
    
  176.     def test_generic_ipaddress_normalization(self):
    
  177.         # Test the normalizing code
    
  178.         f = GenericIPAddressField()
    
  179.         self.assertEqual(f.clean(" ::ffff:0a0a:0a0a  "), "::ffff:10.10.10.10")
    
  180.         self.assertEqual(f.clean(" ::ffff:10.10.10.10  "), "::ffff:10.10.10.10")
    
  181.         self.assertEqual(
    
  182.             f.clean(" 2001:000:a:0000:0:fe:fe:beef  "), "2001:0:a::fe:fe:beef"
    
  183.         )
    
  184.         self.assertEqual(
    
  185.             f.clean(" 2001::a:0000:0:fe:fe:beef  "), "2001:0:a::fe:fe:beef"
    
  186.         )
    
  187. 
    
  188.         f = GenericIPAddressField(unpack_ipv4=True)
    
  189.         self.assertEqual(f.clean(" ::ffff:0a0a:0a0a"), "10.10.10.10")