You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_mixins.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. from django import forms
  2. from django.test import TestCase, override_settings
  3. from oscar.apps.address.forms import AbstractAddressForm
  4. from oscar.apps.address.models import UserAddress
  5. from oscar.apps.order.models import ShippingAddress
  6. from oscar.forms.mixins import PhoneNumberMixin
  7. from oscar.test.factories import CountryFactory
  8. class PhoneNumberMixinTestCase(TestCase):
  9. def test_mixin_adds_phone_number_field(self):
  10. class TestForm(PhoneNumberMixin, forms.Form):
  11. pass
  12. form = TestForm()
  13. self.assertIn("phone_number", form.fields)
  14. def test_mixin_adds_all_phone_number_fields(self):
  15. class TestForm(PhoneNumberMixin, forms.Form):
  16. phone_number_fields = {
  17. "phone_number": {
  18. "required": False,
  19. "help_text": "",
  20. "max_length": 32,
  21. "label": "Phone number",
  22. },
  23. "another_phone_number": {
  24. "required": False,
  25. "help_text": "Another phone number help text",
  26. "max_length": 32,
  27. "label": "Another phone number",
  28. },
  29. "one_more_phone_number": {
  30. "required": False,
  31. "help_text": "",
  32. "max_length": 32,
  33. "label": "One more phone number",
  34. },
  35. }
  36. form = TestForm()
  37. self.assertIn("phone_number", form.fields)
  38. self.assertIn("another_phone_number", form.fields)
  39. self.assertIn("one_more_phone_number", form.fields)
  40. field = form.fields["another_phone_number"]
  41. self.assertEqual(field.help_text, "Another phone number help text")
  42. def test_mixin_retains_existing_field_properties(self):
  43. class TestForm(PhoneNumberMixin, forms.ModelForm):
  44. class Meta:
  45. model = UserAddress
  46. fields = ["country", "phone_number"]
  47. # Override default label and help text
  48. labels = {"phone_number": "Special number"}
  49. help_texts = {"phone_number": "Special help text"}
  50. form = TestForm()
  51. field = form.fields["phone_number"]
  52. self.assertEqual(field.label, "Special number")
  53. self.assertEqual(field.help_text, "Special help text")
  54. @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=("phone_number",))
  55. def test_required_empty_field_raises_validation_error(self):
  56. class TestForm(PhoneNumberMixin, AbstractAddressForm):
  57. phone_number_fields = {
  58. "phone_number": {
  59. "required": True,
  60. "help_text": "",
  61. "max_length": 32,
  62. "label": "Phone number",
  63. }
  64. }
  65. class Meta:
  66. model = ShippingAddress
  67. fields = ["country", "phone_number", "postcode"]
  68. CountryFactory(iso_3166_1_a2="GB", is_shipping_country=True)
  69. form = TestForm(
  70. data={"phone_number": "", "country": "GB", "postcode": "WW1 2BB"}
  71. )
  72. self.assertFalse(form.is_valid())
  73. self.assertEqual(form.errors["phone_number"], ["This field is required."])
  74. @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=[])
  75. def test_optional_empty_field_validates(self):
  76. class TestForm(PhoneNumberMixin, AbstractAddressForm):
  77. phone_number_fields = {
  78. "phone_number": {
  79. "required": False,
  80. "help_text": "",
  81. "max_length": 32,
  82. "label": "Phone number",
  83. }
  84. }
  85. class Meta:
  86. model = ShippingAddress
  87. fields = ["country", "phone_number", "postcode"]
  88. CountryFactory(iso_3166_1_a2="GB", is_shipping_country=True)
  89. form = TestForm(
  90. data={"phone_number": "", "country": "GB", "postcode": "WW1 2BB"}
  91. )
  92. self.assertTrue(form.is_valid())
  93. @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=[])
  94. def test_invalid_number_fails_validation(self):
  95. class TestForm(PhoneNumberMixin, AbstractAddressForm):
  96. phone_number_fields = {
  97. "phone_number": {
  98. "required": False,
  99. "help_text": "",
  100. "max_length": 32,
  101. "label": "Phone number",
  102. }
  103. }
  104. class Meta:
  105. model = ShippingAddress
  106. fields = ["country", "phone_number", "postcode"]
  107. CountryFactory(iso_3166_1_a2="GB", is_shipping_country=True)
  108. form = TestForm(
  109. data={"phone_number": "123456", "country": "GB", "postcode": "WW1 2BB"}
  110. )
  111. self.assertFalse(form.is_valid())
  112. self.assertEqual(
  113. form.errors["phone_number"],
  114. ["This is not a valid local phone format for UNITED KINGDOM."],
  115. )
  116. @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=[])
  117. def test_valid_number_passes_validation(self):
  118. class TestForm(PhoneNumberMixin, AbstractAddressForm):
  119. phone_number_fields = {
  120. "phone_number": {
  121. "required": False,
  122. "help_text": "",
  123. "max_length": 32,
  124. "label": "Phone number",
  125. }
  126. }
  127. class Meta:
  128. model = ShippingAddress
  129. fields = ["country", "phone_number", "postcode"]
  130. CountryFactory(iso_3166_1_a2="GB", is_shipping_country=True)
  131. form = TestForm(
  132. data={"phone_number": "02089001234", "country": "GB", "postcode": "WW1 2BB"}
  133. )
  134. self.assertTrue(form.is_valid())