您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

test_mixins.py 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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(data={'phone_number': '', 'country': 'GB', 'postcode': 'WW1 2BB'})
  70. self.assertFalse(form.is_valid())
  71. self.assertEqual(form.errors['phone_number'], ['This field is required.'])
  72. @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=[])
  73. def test_optional_empty_field_validates(self):
  74. class TestForm(PhoneNumberMixin, AbstractAddressForm):
  75. phone_number_fields = {
  76. 'phone_number': {
  77. 'required': False,
  78. 'help_text': '',
  79. 'max_length': 32,
  80. 'label': 'Phone number'
  81. }
  82. }
  83. class Meta:
  84. model = ShippingAddress
  85. fields = ['country', 'phone_number', 'postcode']
  86. CountryFactory(iso_3166_1_a2='GB', is_shipping_country=True)
  87. form = TestForm(data={'phone_number': '', 'country': 'GB', 'postcode': 'WW1 2BB'})
  88. self.assertTrue(form.is_valid())
  89. @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=[])
  90. def test_invalid_number_fails_validation(self):
  91. class TestForm(PhoneNumberMixin, AbstractAddressForm):
  92. phone_number_fields = {
  93. 'phone_number': {
  94. 'required': False,
  95. 'help_text': '',
  96. 'max_length': 32,
  97. 'label': 'Phone number'
  98. }
  99. }
  100. class Meta:
  101. model = ShippingAddress
  102. fields = ['country', 'phone_number', 'postcode']
  103. CountryFactory(iso_3166_1_a2='GB', is_shipping_country=True)
  104. form = TestForm(data={'phone_number': '123456', 'country': 'GB', 'postcode': 'WW1 2BB'})
  105. self.assertFalse(form.is_valid())
  106. self.assertEqual(form.errors['phone_number'], ['This is not a valid local phone format for UNITED KINGDOM.'])
  107. @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=[])
  108. def test_valid_number_passes_validation(self):
  109. class TestForm(PhoneNumberMixin, AbstractAddressForm):
  110. phone_number_fields = {
  111. 'phone_number': {
  112. 'required': False,
  113. 'help_text': '',
  114. 'max_length': 32,
  115. 'label': 'Phone number'
  116. }
  117. }
  118. class Meta:
  119. model = ShippingAddress
  120. fields = ['country', 'phone_number', 'postcode']
  121. CountryFactory(iso_3166_1_a2='GB', is_shipping_country=True)
  122. form = TestForm(data={'phone_number': '02089001234', 'country': 'GB', 'postcode': 'WW1 2BB'})
  123. self.assertTrue(form.is_valid())