test_constraints.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. from django.core.exceptions import ValidationError
  2. from django.test import TestCase, skipUnlessDBFeature
  3. from .models import (
  4. ChildProduct,
  5. ChildUniqueConstraintProduct,
  6. Product,
  7. UniqueConstraintConditionProduct,
  8. UniqueConstraintNullsDistinctProduct,
  9. UniqueConstraintProduct,
  10. )
  11. class PerformConstraintChecksTest(TestCase):
  12. @skipUnlessDBFeature("supports_table_check_constraints")
  13. def test_full_clean_with_check_constraints(self):
  14. product = Product(price=10, discounted_price=15)
  15. with self.assertRaises(ValidationError) as cm:
  16. product.full_clean()
  17. self.assertEqual(
  18. cm.exception.message_dict,
  19. {
  20. "__all__": [
  21. "Constraint “price_gt_discounted_price_validation” is violated."
  22. ]
  23. },
  24. )
  25. @skipUnlessDBFeature("supports_table_check_constraints")
  26. def test_full_clean_with_check_constraints_on_child_model(self):
  27. product = ChildProduct(price=10, discounted_price=15)
  28. with self.assertRaises(ValidationError) as cm:
  29. product.full_clean()
  30. self.assertEqual(
  31. cm.exception.message_dict,
  32. {
  33. "__all__": [
  34. "Constraint “price_gt_discounted_price_validation” is violated."
  35. ]
  36. },
  37. )
  38. @skipUnlessDBFeature("supports_table_check_constraints")
  39. def test_full_clean_with_check_constraints_disabled(self):
  40. product = Product(price=10, discounted_price=15)
  41. product.full_clean(validate_constraints=False)
  42. def test_full_clean_with_unique_constraints(self):
  43. UniqueConstraintProduct.objects.create(name="product", color="yellow", rank=1)
  44. tests = [
  45. UniqueConstraintProduct(name="product", color="yellow", rank=1),
  46. # Child model.
  47. ChildUniqueConstraintProduct(name="product", color="yellow", rank=1),
  48. ]
  49. for product in tests:
  50. with self.subTest(model=product.__class__.__name__):
  51. with self.assertRaises(ValidationError) as cm:
  52. product.full_clean()
  53. self.assertEqual(
  54. cm.exception.message_dict,
  55. {
  56. "__all__": [
  57. "Unique constraint product with this Name and Color "
  58. "already exists."
  59. ],
  60. "rank": [
  61. "Unique constraint product with this Rank already exists."
  62. ],
  63. },
  64. )
  65. def test_full_clean_with_unique_constraints_disabled(self):
  66. UniqueConstraintProduct.objects.create(name="product", color="yellow", rank=1)
  67. product = UniqueConstraintProduct(name="product", color="yellow", rank=1)
  68. product.full_clean(validate_constraints=False)
  69. @skipUnlessDBFeature("supports_partial_indexes")
  70. def test_full_clean_with_partial_unique_constraints(self):
  71. UniqueConstraintConditionProduct.objects.create(name="product")
  72. product = UniqueConstraintConditionProduct(name="product")
  73. with self.assertRaises(ValidationError) as cm:
  74. product.full_clean()
  75. self.assertEqual(
  76. cm.exception.message_dict,
  77. {
  78. "__all__": [
  79. "Constraint “name_without_color_uniq_validation” is violated."
  80. ]
  81. },
  82. )
  83. @skipUnlessDBFeature("supports_partial_indexes")
  84. def test_full_clean_with_partial_unique_constraints_disabled(self):
  85. UniqueConstraintConditionProduct.objects.create(name="product")
  86. product = UniqueConstraintConditionProduct(name="product")
  87. product.full_clean(validate_constraints=False)
  88. @skipUnlessDBFeature("supports_nulls_distinct_unique_constraints")
  89. def test_full_clean_with_nulls_distinct_unique_constraints(self):
  90. UniqueConstraintNullsDistinctProduct.objects.create(name=None)
  91. product = UniqueConstraintNullsDistinctProduct(name=None)
  92. with self.assertRaises(ValidationError) as cm:
  93. product.full_clean()
  94. self.assertEqual(
  95. cm.exception.message_dict,
  96. {
  97. "name": [
  98. "Unique constraint nulls distinct product with this Name "
  99. "already exists."
  100. ]
  101. },
  102. )
  103. @skipUnlessDBFeature("supports_nulls_distinct_unique_constraints")
  104. def test_full_clean_with_nulls_distinct_unique_constraints_disabled(self):
  105. UniqueConstraintNullsDistinctProduct.objects.create(name=None)
  106. product = UniqueConstraintNullsDistinctProduct(name=None)
  107. product.full_clean(validate_constraints=False)