test_customvalidator.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from django.conf import settings
  2. from django.core.exceptions import ValidationError
  3. from django.test import TestCase, override_settings
  4. from dcim.models import Site
  5. from extras.validators import CustomValidator
  6. class MyValidator(CustomValidator):
  7. def validate(self, instance):
  8. if instance.name != 'foo':
  9. self.fail("Name must be foo!")
  10. min_validator = CustomValidator({
  11. 'asn': {
  12. 'min': 65000
  13. }
  14. })
  15. max_validator = CustomValidator({
  16. 'asn': {
  17. 'max': 65100
  18. }
  19. })
  20. min_length_validator = CustomValidator({
  21. 'name': {
  22. 'min_length': 5
  23. }
  24. })
  25. max_length_validator = CustomValidator({
  26. 'name': {
  27. 'max_length': 10
  28. }
  29. })
  30. regex_validator = CustomValidator({
  31. 'name': {
  32. 'regex': r'\d{3}$' # Ends with three digits
  33. }
  34. })
  35. required_validator = CustomValidator({
  36. 'description': {
  37. 'required': True
  38. }
  39. })
  40. prohibited_validator = CustomValidator({
  41. 'description': {
  42. 'prohibited': True
  43. }
  44. })
  45. custom_validator = MyValidator()
  46. class CustomValidatorTest(TestCase):
  47. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [min_validator]})
  48. def test_configuration(self):
  49. self.assertIn('dcim.site', settings.CUSTOM_VALIDATORS)
  50. validator = settings.CUSTOM_VALIDATORS['dcim.site'][0]
  51. self.assertIsInstance(validator, CustomValidator)
  52. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [min_validator]})
  53. def test_min(self):
  54. with self.assertRaises(ValidationError):
  55. Site(name='abcdef123', slug='abcdefghijk', asn=1).clean()
  56. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [max_validator]})
  57. def test_max(self):
  58. with self.assertRaises(ValidationError):
  59. Site(name='abcdef123', slug='abcdefghijk', asn=65535).clean()
  60. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [min_length_validator]})
  61. def test_min_length(self):
  62. with self.assertRaises(ValidationError):
  63. Site(name='abc', slug='abc', asn=65000).clean()
  64. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [max_length_validator]})
  65. def test_max_length(self):
  66. with self.assertRaises(ValidationError):
  67. Site(name='abcdefghijk', slug='abcdefghijk').clean()
  68. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [regex_validator]})
  69. def test_regex(self):
  70. with self.assertRaises(ValidationError):
  71. Site(name='abcdefgh', slug='abcdefgh').clean()
  72. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [required_validator]})
  73. def test_required(self):
  74. with self.assertRaises(ValidationError):
  75. Site(name='abcdefgh', slug='abcdefgh', description='').clean()
  76. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [prohibited_validator]})
  77. def test_prohibited(self):
  78. with self.assertRaises(ValidationError):
  79. Site(name='abcdefgh', slug='abcdefgh', description='ABC').clean()
  80. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [min_length_validator]})
  81. def test_valid(self):
  82. Site(name='abcdef123', slug='abcdef123').clean()
  83. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [custom_validator]})
  84. def test_custom_invalid(self):
  85. with self.assertRaises(ValidationError):
  86. Site(name='abc', slug='abc').clean()
  87. @override_settings(CUSTOM_VALIDATORS={'dcim.site': [custom_validator]})
  88. def test_custom_valid(self):
  89. Site(name='foo', slug='foo').clean()