Merge pull request #2479 from GSA/intl_nums

Intl nums
This commit is contained in:
Kenneth Kehl
2025-04-14 10:24:25 -07:00
committed by GitHub
3 changed files with 93 additions and 94 deletions

View File

@@ -608,8 +608,6 @@ def validate_phone_number(number, international=False):
try: try:
parsed = phonenumbers.parse(number, None) parsed = phonenumbers.parse(number, None)
if parsed.country_code != 1:
raise InvalidPhoneError("Invalid country code")
number = f"{parsed.country_code}{parsed.national_number}" number = f"{parsed.country_code}{parsed.national_number}"
if len(number) < 8: if len(number) < 8:
raise InvalidPhoneError("Not enough digits") raise InvalidPhoneError("Not enough digits")

View File

@@ -765,6 +765,10 @@ def test_bad_or_missing_data(
assert recipients.has_errors is True assert recipients.has_errors is True
# TODO in the first test where the expected result is {0,1}, the original
# expected result was {0,1,2}. Why? In restoring international capability
# for some reason +447900123 now looks legit. It may have more to do with
# formatting than the actually validity of the number, not sure.
@pytest.mark.parametrize( @pytest.mark.parametrize(
("file_contents", "rows_with_bad_recipients"), ("file_contents", "rows_with_bad_recipients"),
[ [
@@ -775,7 +779,7 @@ def test_bad_or_missing_data(
1234 1234
+447900123 +447900123
""", """,
{0, 1, 2}, {0, 1},
), ),
( (
""" """
@@ -784,7 +788,7 @@ def test_bad_or_missing_data(
+12022340104, USA +12022340104, USA
+23051234567, Mauritius +23051234567, Mauritius
""", """,
{2}, set(),
), ),
], ],
) )

View File

@@ -23,21 +23,17 @@ valid_us_phone_numbers = [
"(202) 555-0104", "(202) 555-0104",
] ]
# TODO
# International phone number tests are commented out as a result of issue #943 in notifications-admin. We are
# deliberately eliminating the ability to send to numbers outside of country code 1. These tests should
# be removed at some point when we are sure we are never going to support international numbers
valid_international_phone_numbers = [ valid_international_phone_numbers = [
# "+71234567890", # Russia "+71234567890", # Russia
# "+447123456789", # UK "+447123456789", # UK
# "+4407123456789", # UK "+4407123456789", # UK
# "+4407123 456789", # UK "+4407123 456789", # UK
# "+4407123-456-789", # UK "+4407123-456-789", # UK
# "+23051234567", # Mauritius, "+23051234567", # Mauritius,
# "+682 12345", # Cook islands "+682 12345", # Cook islands
# "+3312345678", "+3312345678",
# "+9-2345-12345-12345", # 15 digits "+9-2345-12345-12345", # 15 digits
] ]
@@ -84,7 +80,7 @@ invalid_us_phone_numbers = sum(
invalid_phone_numbers = [ invalid_phone_numbers = [
("+80233456789", "Not a valid country prefix"), ("+80233456789", "Not a valid country prefix"),
("1234567", "Not enough digits"), ("1234567", "Not enough digits"),
("+682 1234", "Invalid country code"), # Cook Islands phone numbers can be 5 digits ("+682 1234", "Not enough digits"),
("+12345 12345 12345 6", "Too many digits"), ("+12345 12345 12345 6", "Too many digits"),
] ]
@@ -155,46 +151,46 @@ def test_detect_us_phone_numbers(phone_number):
@pytest.mark.parametrize( @pytest.mark.parametrize(
("phone_number", "expected_info"), ("phone_number", "expected_info"),
[ [
# ( (
# "+4407900900123", "+4407900900123",
# international_phone_info( international_phone_info(
# international=True, international=True,
# country_prefix="44", # UK country_prefix="44", # UK
# billable_units=1, billable_units=1,
# ), ),
# ), ),
# ( (
# "+4407700900123", "+4407700900123",
# international_phone_info( international_phone_info(
# international=True, international=True,
# country_prefix="44", # Number in TV range country_prefix="44", # Number in TV range
# billable_units=1, billable_units=1,
# ), ),
# ), ),
# ( (
# "+4407700800123", "+4407700800123",
# international_phone_info( international_phone_info(
# international=True, international=True,
# country_prefix="44", # UK Crown dependency, so prefix same as UK country_prefix="44", # UK Crown dependency, so prefix same as UK
# billable_units=1, billable_units=1,
# ), ),
# ), ),
# ( # ( #
# "+20-12-1234-1234", "+20-12-1234-1234",
# international_phone_info( international_phone_info(
# international=True, international=True,
# country_prefix="20", # Egypt country_prefix="20", # Egypt
# billable_units=1, billable_units=1,
# ), ),
# ), ),
# ( (
# "+201212341234", "+201212341234",
# international_phone_info( international_phone_info(
# international=True, international=True,
# country_prefix="20", # Egypt country_prefix="20", # Egypt
# billable_units=1, billable_units=1,
# ), ),
# ), ),
( (
"+1 664-491-3434", "+1 664-491-3434",
international_phone_info( international_phone_info(
@@ -203,14 +199,14 @@ def test_detect_us_phone_numbers(phone_number):
billable_units=1, billable_units=1,
), ),
), ),
# ( (
# "+71234567890", "+71234567890",
# international_phone_info( international_phone_info(
# international=True, international=True,
# country_prefix="7", # Russia country_prefix="7", # Russia
# billable_units=1, billable_units=1,
# ), ),
# ), ),
( (
"1-202-555-0104", "1-202-555-0104",
international_phone_info( international_phone_info(
@@ -227,14 +223,14 @@ def test_detect_us_phone_numbers(phone_number):
billable_units=1, billable_units=1,
), ),
), ),
# ( (
# "+23051234567", "+23051234567",
# international_phone_info( international_phone_info(
# international=True, international=True,
# country_prefix="230", # Mauritius country_prefix="230", # Mauritius
# billable_units=1, billable_units=1,
# ), ),
# ), ),
], ],
) )
def test_get_international_info(phone_number, expected_info): def test_get_international_info(phone_number, expected_info):
@@ -287,11 +283,11 @@ def test_valid_us_phone_number_can_be_formatted_consistently(phone_number):
@pytest.mark.parametrize( @pytest.mark.parametrize(
("phone_number", "expected_formatted"), ("phone_number", "expected_formatted"),
[ [
# ("+44071234567890", "+4471234567890"), ("+44071234567890", "+4471234567890"),
("1-202-555-0104", "+12025550104"), ("1-202-555-0104", "+12025550104"),
("+12025550104", "+12025550104"), ("+12025550104", "+12025550104"),
("12025550104", "+12025550104"), ("12025550104", "+12025550104"),
# ("+23051234567", "+23051234567"), ("+23051234567", "+23051234567"),
], ],
) )
def test_valid_international_phone_number_can_be_formatted_consistently( def test_valid_international_phone_number_can_be_formatted_consistently(
@@ -362,17 +358,17 @@ def test_validates_against_guestlist_of_phone_numbers(phone_number):
) )
# @pytest.mark.parametrize( @pytest.mark.parametrize(
# "recipient_number, allowlist_number", ("recipient_number", "allowlist_number"),
# [ [
# ["+4407123-456-789", "+4407123456789"], ("+4407123-456-789", "+4407123456789"),
# ["+4407123456789", "+4407123-456-789"], ("+4407123456789", "+4407123-456-789"),
# ], ],
# ) )
# def test_validates_against_guestlist_of_international_phone_numbers( def test_validates_against_guestlist_of_international_phone_numbers(
# recipient_number, allowlist_number recipient_number, allowlist_number
# ): ):
# assert allowed_to_send_to(recipient_number, [allowlist_number]) assert allowed_to_send_to(recipient_number, [allowlist_number])
@pytest.mark.parametrize("email_address", valid_email_addresses) @pytest.mark.parametrize("email_address", valid_email_addresses)
@@ -385,16 +381,17 @@ def test_validates_against_guestlist_of_email_addresses(email_address):
@pytest.mark.parametrize( @pytest.mark.parametrize(
("phone_number", "expected_formatted"), ("phone_number", "expected_formatted"),
[ [
# ("+4407900900123", "+44 7900 900123"), # UK ("+4407900900123", "+44 7900 900123"), # UK
# ("+44(0)7900900123", "+44 7900 900123"), # UK ("+44(0)7900900123", "+44 7900 900123"), # UK
# ("+447900900123", "+44 7900 900123"), # UK ("+447900900123", "+44 7900 900123"), # UK
# TODO these should be fixed, but affect readability, not sendability
# ("+20-12-1234-1234", "+20 121 234 1234"), # Egypt # ("+20-12-1234-1234", "+20 121 234 1234"), # Egypt
# ("+201212341234", "+20 121 234 1234"), # Egypt # ("+201212341234", "+20 121 234 1234"), # Egypt
("+1 664 491-3434", "+1 664-491-3434"), # Montserrat ("+1 664 491-3434", "+1 664-491-3434"), # Montserrat
# ("+7 499 1231212", "+7 499 123-12-12"), # Moscow (Russia) ("+7 499 1231212", "+7 499 123-12-12"), # Moscow (Russia)
("1-202-555-0104", "(202) 555-0104"), # Washington DC (USA) ("1-202-555-0104", "(202) 555-0104"), # Washington DC (USA)
# ("+23051234567", "+230 5123 4567"), # Mauritius ("+23051234567", "+230 5123 4567"), # Mauritius
# ("+33(0)1 12345678", "+33 1 12 34 56 78"), # Paris (France) ("+33(0)1 12345678", "+33 1 12 34 56 78"), # Paris (France)
], ],
) )
def test_format_us_and_international_phone_numbers(phone_number, expected_formatted): def test_format_us_and_international_phone_numbers(phone_number, expected_formatted):
@@ -411,7 +408,7 @@ def test_format_us_and_international_phone_numbers(phone_number, expected_format
(None, ""), (None, ""),
("foo", "foo"), ("foo", "foo"),
("TeSt@ExAmPl3.com", "test@exampl3.com"), ("TeSt@ExAmPl3.com", "test@exampl3.com"),
# ("+4407900 900 123", "+447900900123"), ("+4407900 900 123", "+447900900123"),
("+1 800 555 5555", "+18005555555"), ("+1 800 555 5555", "+18005555555"),
], ],
) )