diff --git a/dev-requirements.txt b/dev-requirements.txt index a4784a4ee9..3a6c5c0606 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -10,6 +10,7 @@ mypy-extensions>=1.0.0 mypy>=1.15.0,<2 packaging>=25.0 pytest>=6.0.1 +python-stdnum>=1.20 setuptools>=80.9.0 tox>=4.24.1 twine>=6.2.0 diff --git a/faker/providers/bank/no_NO/__init__.py b/faker/providers/bank/no_NO/__init__.py index 7e5ff16690..3ef6295f15 100644 --- a/faker/providers/bank/no_NO/__init__.py +++ b/faker/providers/bank/no_NO/__init__.py @@ -6,3 +6,13 @@ class Provider(BankProvider): bban_format = "###########" country_code = "NO" + + def bban(self) -> str: + """Generate a valid BBAN with correct MOD11 check digit.""" + for _ in range(100): + first_10 = self.numerify("##########") + weights = (6, 7, 8, 9, 4, 5, 6, 7, 8, 9) + check = sum(w * int(d) for w, d in zip(weights, first_10)) % 11 + if check != 10: + return first_10 + str(check) + return first_10 + "0" diff --git a/tests/providers/test_bank.py b/tests/providers/test_bank.py index 20c018271e..d2f37bb57b 100644 --- a/tests/providers/test_bank.py +++ b/tests/providers/test_bank.py @@ -2,6 +2,8 @@ import pytest +from stdnum import iban as iban_validator + from faker.providers.bank import Provider as BankProvider from faker.providers.bank.az_AZ import Provider as AzAzBankProvider from faker.providers.bank.cs_CZ import Provider as CsCZBankProvider @@ -409,6 +411,10 @@ def test_iban(self, faker, num_samples): assert iban[:2] == NoNoBankProvider.country_code assert re.fullmatch(r"\d{2}\d{11}", iban[2:]) + def test_iban_stdnum(self, faker, num_samples): + for _ in range(num_samples): + iban_validator.validate(faker.iban()) + class TestPlPl: """Test pl_PL bank provider""" diff --git a/tox.ini b/tox.ini index c228883d37..0a21beb6d3 100644 --- a/tox.ini +++ b/tox.ini @@ -7,6 +7,7 @@ deps = coverage>=5.2 freezegun pytest>=6.0.1 + python-stdnum>=1.20 ukpostcodeparser>=1.1.1 validators>=0.13.0 sphinx>=2.4,<3.0