diff --git a/src/validators/iban.py b/src/validators/iban.py index ff39cd7..cc6224b 100644 --- a/src/validators/iban.py +++ b/src/validators/iban.py @@ -38,7 +38,10 @@ def iban(value: str, /): (ValidationError): If `value` is an invalid IBAN code. """ return ( - (re.match(r"^[a-z]{2}[0-9]{2}[a-z0-9]{11,30}$", value, re.IGNORECASE) and _mod_check(value)) + ( + re.match(r"^[a-z]{2}[0-9]{2}[a-z0-9]{11,30}$", value, re.IGNORECASE | re.ASCII) + and _mod_check(value) + ) if value else False ) diff --git a/tests/test_iban.py b/tests/test_iban.py index 329a20e..16635f3 100644 --- a/tests/test_iban.py +++ b/tests/test_iban.py @@ -23,3 +23,9 @@ def test_returns_true_on_valid_lowercase_iban(value: str): def test_returns_failed_validation_on_invalid_iban(value: str): """Test returns failed validation on invalid iban.""" assert isinstance(iban(value), ValidationError) + + +@pytest.mark.parametrize("value", ["\u0131T60X0542811101000000123456", "GB82WE\u017fT12345698765432"]) +def test_rejects_non_ascii_case_equivalents(value: str): + """Unicode case equivalents must not pass the ASCII IBAN format check.""" + assert isinstance(iban(value), ValidationError)