From 021a85641646ab292d16147b9bad4cd40b8cfec0 Mon Sep 17 00:00:00 2001 From: Ruidy Date: Mon, 5 Jul 2021 19:47:07 +0200 Subject: [PATCH] feat: add symbols --- README.md | 2 +- app/main.py | 5 ++++- app/main_test.py | 7 +++++++ app/pass_gen.py | 5 ++++- app/pass_gen_test.py | 11 +++++++++++ 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5125298..aa22c69 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ - [x] As a user I want to generate a random secure password to protect my personal accounts - [x] Minimal length - - [ ] Include symbols + - [x] Include symbols - [ ] Include numbers - [ ] Include lowercase characters - [ ] Include uppercase characters diff --git a/app/main.py b/app/main.py index 2cb7a41..593277e 100644 --- a/app/main.py +++ b/app/main.py @@ -11,9 +11,12 @@ app = typer.Typer() def main( random: bool = True, length: int = typer.Option(8, help="Length of the generated password."), + symbols: bool = typer.Option( + False, help="If the generated password should includes special characters." + ), ) -> None: seed = r.randint(0, 100) if random else 0 - typer.echo(generate_password(seed, length)) + typer.echo(generate_password(seed, length, symbols)) if __name__ == "__main__": diff --git a/app/main_test.py b/app/main_test.py index d4fb52f..8b904fa 100644 --- a/app/main_test.py +++ b/app/main_test.py @@ -16,6 +16,13 @@ def test_cli_can_set_password_length() -> None: assert "2yW4AcqGFz" in result.stdout +def test_cli_can_set_symbols() -> None: + args = ["--symbols"] + result = _run_cli(*args) + print(result.stdout) + assert "X1fH$!ZM" in result.stdout + + def _run_cli(*args) -> Result: result = runner.invoke(app, ["--no-random", *args]) assert result.exit_code == 0 diff --git a/app/pass_gen.py b/app/pass_gen.py index edc04f4..f7cb810 100644 --- a/app/pass_gen.py +++ b/app/pass_gen.py @@ -2,12 +2,15 @@ import string import random -def generate_password(seed: int, length: int = 8) -> str: +def generate_password(seed: int, length: int = 8, symbols: bool = False) -> str: lowercase = string.ascii_lowercase uppercase = string.ascii_uppercase digits = string.digits + punctuation = string.punctuation letters = lowercase + uppercase + digits + if symbols: + letters += punctuation random_generator = random.Random(seed) diff --git a/app/pass_gen_test.py b/app/pass_gen_test.py index 3b9068c..b6bdd8a 100644 --- a/app/pass_gen_test.py +++ b/app/pass_gen_test.py @@ -22,3 +22,14 @@ def test_can_generate_random_password(seed: int, expected: str) -> None: ) def test_control_password_length(seed: int, length: int, expected: str) -> None: assert generate_password(seed, length) == expected + + +@pytest.mark.parametrize( + ("seed", "symbols", "expected"), + [ + (0, True, "X1fH$!ZM"), + (1, True, """r+iGp"58"""), + ], +) +def test_password_can_contain_symbols(seed: int, symbols: bool, expected: str) -> None: + assert generate_password(seed, symbols=symbols) == expected