Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion care/utils/models/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,20 @@ class PhoneNumberValidator(RegexValidator):
}

def __init__(self, types: Iterable[str], *args, **kwargs):
if not isinstance(types, Iterable) or isinstance(types, str) or len(types) == 0:
if not isinstance(types, Iterable) or isinstance(types, str):
msg = "The `types` argument must be a non-empty iterable."
raise ValueError(msg)

Comment thread
4arjun marked this conversation as resolved.
Outdated
types = tuple(types)
if not types:
msg = "The `types` argument must be a non-empty iterable."
raise ValueError(msg)

unsupported_types = [type_ for type_ in types if type_ not in self.regex_map]
if unsupported_types:
msg = f"Unsupported phone number type(s): {', '.join(unsupported_types)}."
raise ValueError(msg)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
Comment thread
4arjun marked this conversation as resolved.
Outdated

self.types = types
self.message = f"Invalid phone number. Must be one of the following types: {', '.join(self.types)}. Received: %(value)s"
self.code = "invalid_phone_number"
Expand Down
24 changes: 24 additions & 0 deletions care/utils/tests/test_phone_number_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,27 @@ def test_invalid_support_numbers(self):
for number in self.invalid_support_numbers:
with self.assertRaises(ValidationError, msg=f"Failed for {number}"):
self.support_validator(number)

def test_types_must_be_non_empty_iterable(self):
invalid_types = ["mobile", ()]

for types in invalid_types:
with self.assertRaisesMessage(
ValueError,
"The `types` argument must be a non-empty iterable.",
):
PhoneNumberValidator(types=types)

def test_unsupported_types_raise_value_error(self):
with self.assertRaisesMessage(
ValueError,
"Unsupported phone number type(s): pager.",
):
PhoneNumberValidator(types=("mobile", "pager"))

def test_types_accepts_generator(self):
types = (type_ for type_ in ("mobile", "landline"))
validator = PhoneNumberValidator(types=types)

self.assertIsNone(validator("+919876543210"))
self.assertIsNone(validator("+914902626488"))
Comment thread
4arjun marked this conversation as resolved.
Outdated