diff --git a/faker/providers/password/__init__.py b/faker/providers/password/__init__.py new file mode 100644 index 0000000000..9780085a68 --- /dev/null +++ b/faker/providers/password/__init__.py @@ -0,0 +1,14 @@ +import string +import random +import string +import numbers +from .. import BaseProvider + +class Provider(BaseProvider): + """Password generation provider""" + password = [] + def generate_password(self, size: int) -> str: + characters = string.ascii_letters+ string.digits + string.digits + string.punctuation + string.punctuation + password = ''.join(random.choice(characters) for _ in range(size)) + return password + diff --git a/tests/providers/test_password.py b/tests/providers/test_password.py new file mode 100644 index 0000000000..43cfc0e331 --- /dev/null +++ b/tests/providers/test_password.py @@ -0,0 +1,40 @@ +import unittest +from faker import Faker +import string +class TestPasswordProvider(unittest.TestCase): + """Test password generation provider""" + + def setUp(self): + self.fake = Faker() + self.fake.add_provider("path.to.your.module.Provider") # Ex: 'faker_password.provider.Provider' + Faker.seed(0) + + def test_generate_password_size(self): + for size in [8, 12, 20, 32]: + password = self.fake.generate_password(size=size) + self.assertEqual(len(password), size, f"Password length should be {size}") + + + def test_password_has_uppercase(self): + password = self.fake.generate_password(size=16) + has_upper = any(char.isupper() for char in password) + self.assertTrue(has_upper, "Password should contain at least one uppercase letter") + + + def test_password_has_upper_and_lowercase(self): + password = self.fake.generate_password(size=16) + has_upper = any(char.isupper() for char in password) + has_lower = any(char.islower() for char in password) + self.assertTrue(has_upper, "Password should contain at least one uppercase letter") + self.assertTrue(has_lower, "Password should contain at least one lowercase letter") + + def test_password_has_symbol(self): + password = self.fake.generate_password(size=16) + has_symbol = any(char in string.punctuation for char in password) + self.assertTrue(has_symbol, "Password should contain at least one symbol") + + + def test_password_has_number(self): + password = self.fake.generate_password(size=16) + has_digit = any(char in string.digits for char in password) + self.assertTrue(has_digit, "Password should contain at least one number") \ No newline at end of file