1. import re
    
  2. 
    
  3. from django.core.exceptions import ValidationError
    
  4. from django.forms import RegexField
    
  5. from django.test import SimpleTestCase
    
  6. 
    
  7. 
    
  8. class RegexFieldTest(SimpleTestCase):
    
  9.     def test_regexfield_1(self):
    
  10.         f = RegexField("^[0-9][A-F][0-9]$")
    
  11.         self.assertEqual("2A2", f.clean("2A2"))
    
  12.         self.assertEqual("3F3", f.clean("3F3"))
    
  13.         with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
    
  14.             f.clean("3G3")
    
  15.         with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
    
  16.             f.clean(" 2A2")
    
  17.         with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
    
  18.             f.clean("2A2 ")
    
  19.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  20.             f.clean("")
    
  21. 
    
  22.     def test_regexfield_2(self):
    
  23.         f = RegexField("^[0-9][A-F][0-9]$", required=False)
    
  24.         self.assertEqual("2A2", f.clean("2A2"))
    
  25.         self.assertEqual("3F3", f.clean("3F3"))
    
  26.         with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
    
  27.             f.clean("3G3")
    
  28.         self.assertEqual("", f.clean(""))
    
  29. 
    
  30.     def test_regexfield_3(self):
    
  31.         f = RegexField(re.compile("^[0-9][A-F][0-9]$"))
    
  32.         self.assertEqual("2A2", f.clean("2A2"))
    
  33.         self.assertEqual("3F3", f.clean("3F3"))
    
  34.         with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
    
  35.             f.clean("3G3")
    
  36.         with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
    
  37.             f.clean(" 2A2")
    
  38.         with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
    
  39.             f.clean("2A2 ")
    
  40. 
    
  41.     def test_regexfield_4(self):
    
  42.         f = RegexField("^[0-9]+$", min_length=5, max_length=10)
    
  43.         with self.assertRaisesMessage(
    
  44.             ValidationError, "'Ensure this value has at least 5 characters (it has 3).'"
    
  45.         ):
    
  46.             f.clean("123")
    
  47.         with self.assertRaisesMessage(
    
  48.             ValidationError,
    
  49.             "'Ensure this value has at least 5 characters (it has 3).', "
    
  50.             "'Enter a valid value.'",
    
  51.         ):
    
  52.             f.clean("abc")
    
  53.         self.assertEqual("12345", f.clean("12345"))
    
  54.         self.assertEqual("1234567890", f.clean("1234567890"))
    
  55.         with self.assertRaisesMessage(
    
  56.             ValidationError,
    
  57.             "'Ensure this value has at most 10 characters (it has 11).'",
    
  58.         ):
    
  59.             f.clean("12345678901")
    
  60.         with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
    
  61.             f.clean("12345a")
    
  62. 
    
  63.     def test_regexfield_unicode_characters(self):
    
  64.         f = RegexField(r"^\w+$")
    
  65.         self.assertEqual("éèøçÎÎ你好", f.clean("éèøçÎÎ你好"))
    
  66. 
    
  67.     def test_change_regex_after_init(self):
    
  68.         f = RegexField("^[a-z]+$")
    
  69.         f.regex = "^[0-9]+$"
    
  70.         self.assertEqual("1234", f.clean("1234"))
    
  71.         with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
    
  72.             f.clean("abcd")
    
  73. 
    
  74.     def test_get_regex(self):
    
  75.         f = RegexField("^[a-z]+$")
    
  76.         self.assertEqual(f.regex, re.compile("^[a-z]+$"))
    
  77. 
    
  78.     def test_regexfield_strip(self):
    
  79.         f = RegexField("^[a-z]+$", strip=True)
    
  80.         self.assertEqual(f.clean(" a"), "a")
    
  81.         self.assertEqual(f.clean("a "), "a")
    
  82. 
    
  83.     def test_empty_value(self):
    
  84.         f = RegexField("", required=False)
    
  85.         self.assertEqual(f.clean(""), "")
    
  86.         self.assertEqual(f.clean(None), "")
    
  87.         f = RegexField("", empty_value=None, required=False)
    
  88.         self.assertIsNone(f.clean(""))
    
  89.         self.assertIsNone(f.clean(None))