from django import forms from django.test import TestCase, override_settings from oscar.apps.address.forms import AbstractAddressForm from oscar.apps.address.models import UserAddress from oscar.apps.order.models import ShippingAddress from oscar.forms.mixins import PhoneNumberMixin from oscar.test.factories import CountryFactory class PhoneNumberMixinTestCase(TestCase): def test_mixin_adds_phone_number_field(self): class TestForm(PhoneNumberMixin, forms.Form): pass form = TestForm() self.assertIn("phone_number", form.fields) def test_mixin_adds_all_phone_number_fields(self): class TestForm(PhoneNumberMixin, forms.Form): phone_number_fields = { "phone_number": { "required": False, "help_text": "", "max_length": 32, "label": "Phone number", }, "another_phone_number": { "required": False, "help_text": "Another phone number help text", "max_length": 32, "label": "Another phone number", }, "one_more_phone_number": { "required": False, "help_text": "", "max_length": 32, "label": "One more phone number", }, } form = TestForm() self.assertIn("phone_number", form.fields) self.assertIn("another_phone_number", form.fields) self.assertIn("one_more_phone_number", form.fields) field = form.fields["another_phone_number"] self.assertEqual(field.help_text, "Another phone number help text") def test_mixin_retains_existing_field_properties(self): class TestForm(PhoneNumberMixin, forms.ModelForm): class Meta: model = UserAddress fields = ["country", "phone_number"] # Override default label and help text labels = {"phone_number": "Special number"} help_texts = {"phone_number": "Special help text"} form = TestForm() field = form.fields["phone_number"] self.assertEqual(field.label, "Special number") self.assertEqual(field.help_text, "Special help text") @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=("phone_number",)) def test_required_empty_field_raises_validation_error(self): class TestForm(PhoneNumberMixin, AbstractAddressForm): phone_number_fields = { "phone_number": { "required": True, "help_text": "", "max_length": 32, "label": "Phone number", } } class Meta: model = ShippingAddress fields = ["country", "phone_number", "postcode"] CountryFactory(iso_3166_1_a2="GB", is_shipping_country=True) form = TestForm( data={"phone_number": "", "country": "GB", "postcode": "WW1 2BB"} ) self.assertFalse(form.is_valid()) self.assertEqual(form.errors["phone_number"], ["This field is required."]) @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=[]) def test_optional_empty_field_validates(self): class TestForm(PhoneNumberMixin, AbstractAddressForm): phone_number_fields = { "phone_number": { "required": False, "help_text": "", "max_length": 32, "label": "Phone number", } } class Meta: model = ShippingAddress fields = ["country", "phone_number", "postcode"] CountryFactory(iso_3166_1_a2="GB", is_shipping_country=True) form = TestForm( data={"phone_number": "", "country": "GB", "postcode": "WW1 2BB"} ) self.assertTrue(form.is_valid()) @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=[]) def test_invalid_number_fails_validation(self): class TestForm(PhoneNumberMixin, AbstractAddressForm): phone_number_fields = { "phone_number": { "required": False, "help_text": "", "max_length": 32, "label": "Phone number", } } class Meta: model = ShippingAddress fields = ["country", "phone_number", "postcode"] CountryFactory(iso_3166_1_a2="GB", is_shipping_country=True) form = TestForm( data={"phone_number": "123456", "country": "GB", "postcode": "WW1 2BB"} ) self.assertFalse(form.is_valid()) self.assertEqual( form.errors["phone_number"], ["This is not a valid local phone format for UNITED KINGDOM."], ) @override_settings(OSCAR_REQUIRED_ADDRESS_FIELDS=[]) def test_valid_number_passes_validation(self): class TestForm(PhoneNumberMixin, AbstractAddressForm): phone_number_fields = { "phone_number": { "required": False, "help_text": "", "max_length": 32, "label": "Phone number", } } class Meta: model = ShippingAddress fields = ["country", "phone_number", "postcode"] CountryFactory(iso_3166_1_a2="GB", is_shipping_country=True) form = TestForm( data={"phone_number": "02089001234", "country": "GB", "postcode": "WW1 2BB"} ) self.assertTrue(form.is_valid())