From 5a54f14d1f3991554f601a925c3ff019389c9c69 Mon Sep 17 00:00:00 2001 From: Ruidy Date: Thu, 8 Jul 2021 09:45:02 +0200 Subject: [PATCH] feat: add short commands and refactor --- .vscode/settings.json | 10 ++- Pipfile | 1 + Pipfile.lock | 160 +++++++++++++++++++++++++---------------- README.md | 13 ++-- app/main.py | 51 ++++++++++--- app/pass_gen.py | 19 +++-- psswd.txt | 1 - tests/main_test.py | 2 +- tests/pass_gen_test.py | 14 ++-- 9 files changed, 177 insertions(+), 94 deletions(-) delete mode 100644 psswd.txt diff --git a/.vscode/settings.json b/.vscode/settings.json index 5035f91..bd9a5b9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,13 @@ ], "python.testing.unittestEnabled": false, "python.testing.nosetestsEnabled": false, - "python.testing.pytestEnabled": true + "python.testing.pytestEnabled": true, + "spellright.language": [ + "en" + ], + "spellright.documentTypes": [ + "markdown", + "latex", + "plaintext" + ] } \ No newline at end of file diff --git a/Pipfile b/Pipfile index a8a20c5..d6f28b3 100644 --- a/Pipfile +++ b/Pipfile @@ -4,6 +4,7 @@ verify_ssl = true name = "pypi" [packages] +pydantic = "==1.8.2" typer = "==0.3.2" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 0231648..565544c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "ca7961fcac4b43a2fb90aeddc0c5c638e2043b5ebbacb8670e93cc0897a855b0" + "sha256": "23e051ec53ebc361abbf021b0f9d11da381c0ac7632e2feb7885804bb5d88e46" }, "pipfile-spec": 6, "requires": { @@ -24,6 +24,34 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==7.1.2" }, + "pydantic": { + "hashes": [ + "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd", + "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739", + "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f", + "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840", + "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23", + "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287", + "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62", + "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b", + "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb", + "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820", + "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3", + "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b", + "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e", + "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3", + "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316", + "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b", + "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4", + "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20", + "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e", + "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505", + "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1", + "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833" + ], + "index": "pypi", + "version": "==1.8.2" + }, "typer": { "hashes": [ "sha256:5455d750122cff96745b0dec87368f56d023725a7ebc9d2e54dd23dc86816303", @@ -31,6 +59,14 @@ ], "index": "pypi", "version": "==0.3.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", + "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", + "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" + ], + "version": "==3.10.0.0" } }, "develop": { @@ -75,61 +111,61 @@ }, "coverage": { "hashes": [ - "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c", - "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6", - "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45", - "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a", - "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03", - "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529", - "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a", - "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a", - "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2", - "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6", - "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759", - "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53", - "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a", - "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4", - "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff", - "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502", - "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793", - "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb", - "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905", - "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821", - "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b", - "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81", - "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0", - "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b", - "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3", - "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184", - "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701", - "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a", - "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82", - "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638", - "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5", - "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083", - "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6", - "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90", - "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465", - "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a", - "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3", - "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e", - "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066", - "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf", - "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b", - "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae", - "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669", - "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873", - "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b", - "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6", - "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb", - "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160", - "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c", - "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079", - "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d", - "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6" + "sha256:00368e6328ebff76197fff5f4d5704b44098f89d8d99a67a349ad6674ec0b157", + "sha256:0389690e0a1c94e9a246dc3130355d70805e51ca509db1bf07fbde27efb33aa4", + "sha256:065d2181f44392893d37d0a4f9ff60b485d705f733356d0a2fb292a58c6f2e0f", + "sha256:082febdba717c769da92d5e19e14a659ebef6daab19b67fced304b7b8d2475e2", + "sha256:0a35ae0d590effb7cc96e7d6935ae2ab8a51526a111fbe0f12d1671aa9fdc377", + "sha256:142493f0400a0bd5acf03c52971229e937323c3e24c372800ae1c44a503e0921", + "sha256:186f53367a08e8d24cc534c7cbfa43a82d1618a48dec2e0c56e80577ec1888fe", + "sha256:2163a00bcd613e95e118c01ea2811f705fbbacf1904d657b24d306879e2303d3", + "sha256:24ecf342b1e23de259d81b3adc83578935babeb54f6950c9bd9534b12443a49c", + "sha256:2c24d3e09f433817ddd0cb2e8f82f8b42cd09a8ac558462fedf99be479ed4851", + "sha256:2d741575de4a13869c9d4a685235bacc897c94afd3703e2ad4fdc362f37e87da", + "sha256:305ca73c09dd84054a3a8f53d5b70e0325b5b303245d0b96ed505698dc7e8ea7", + "sha256:4bf1d0a390de707f8bfd49efdcdac9366ce77ed64cb35b344f58b1ec62517317", + "sha256:50d90d6b753debb7568621125aad4e5fb418e7bdcb0dba3fa6f4ee82994b35d4", + "sha256:5a2079bca21fa959608223b90cf2f95ce686a6497fb12bfaaa7bb24c3e298199", + "sha256:60c6d433f0357db7ed2a2a698fb75b8ce919ce547d6d6bc79c576e090f509768", + "sha256:66cfae29bccea703f02d8997f60d71e236c5a321588f5aa5a318bd88ca23dc0a", + "sha256:6d6fc990962559de1f3685eb3e365ca60f2e3257bfd145bf675c566b8ebb1944", + "sha256:703b126f3ad20c463b545e199c4da460695630da5fdfd949de6a6269b45eabab", + "sha256:730cee22c41852b90948343cdfd183db1e96a9de69fd4dabec3532c582afea68", + "sha256:7e4a16bde8a3b7424b2955130f5a6c29e741e7138fe05c5d9d72efc356076a80", + "sha256:801e8277958bc2e6cc1f2443a20a2a97f79583aa64524b130e1c0de44c287ca9", + "sha256:80baa69a78d5696c60b72dee44ac3d5ccf75ee82e84d018938ddf642d036a6a8", + "sha256:80c00ce9cef80afbf18d16cb3052f5601ba8d087501d829169eecb33c153346a", + "sha256:89db5a374d793344087732207ee15869549486b2148e3e2e6effe22146351fcd", + "sha256:917b98cc5725ea2e0b88c74d34182589a9be07092cb35b861ea9e74189174f71", + "sha256:9398f8fd89f6f260e94e57559df1885b8200b18312824b617a8789e0f5e7dc74", + "sha256:95b6f212bb0c7379f1f2f6e47c722fbdc7355d8b7488a68649e83dfa29522704", + "sha256:9f23313f3e494475581d46de3b8b6bdcf618ee1df412490e779a9aa0a6c72162", + "sha256:9f6f26e5b129bb0218aab30d368d6ead750517a457986f8854b1df4b4c318098", + "sha256:a502693c83a2c6558bc45b4c2dc01a00c9b99cb3cf846913438933a44af174fc", + "sha256:aa4999130a8e892fa9051edc18bf4daa0a2839d3f3de2dcfcbf0ae4619ee3b5e", + "sha256:b10be0b80784c1beb8061e5ce938d8511a182125de5fc695a60f0561b984d361", + "sha256:b1f7b23a606aaf2464eb81c23b5b20623e2ba44b4aaca6ea9bfe00e84a1a5264", + "sha256:b78c8d232d97dbc8ad3a3d94cc15fccabe9a331685d76d2e5cb5284acc4a5feb", + "sha256:b88fa862817035ad7921f2641c27a85dab12cc685ad3ef29c0caaf5b3d10a868", + "sha256:b93fb9137070899b5f10d6487724f4427b5945983a785e1e2f1102c5e175c516", + "sha256:b9639e16c1bc4eb8a78b3b30df4146bb78df5d52ba1b7454b634abd89aede6cc", + "sha256:baa3b6be365c97f80d92a397cb8963dcd9bc22d101b39784e77a9cad093812f8", + "sha256:c06c5758bae454a49dc3e7917804b46c31bb4a72cedfc8e7b4f17a318b3de9d6", + "sha256:c544153709e93ea7e9edcefee72f5afcf484a9cb526067065f9419419f4a3694", + "sha256:c6c74260ba130f7c20a340e8f9e544b0941621641f53edcf69e4602e12c9f29e", + "sha256:d040615ff5c02ffd97ba9f0f73b9db34c09b8142fbfdd363b2a79fa6a554242c", + "sha256:d85774b1ac09ec1d958e63baa436cc4c90e2e910294847ba51dcc3ca3ca04a63", + "sha256:e508bb216eee8350e77b436f9f99c4f2d8335ecb51483f5ffd8bf5e84aaa56d1", + "sha256:ea1cb38b1a52392ebb4e93eaf4a44b3cfdec35cca3f78a9a599f27b7f27031e2", + "sha256:ec310e0029d530d1043f638b7a326b349884421572626bc2909408da7b0d03e5", + "sha256:ed04b79f53fa975660f1a598120c504a0f4529170eeaf0d823fcc1f06f4d2e0f", + "sha256:f4909ee1ddabed351f0fa55063a7dbe498001e2245a9602d9fb0fd74afecdca9", + "sha256:f49ae9e19737493911e7f8e551310f719f463e442ea1ec92fe0804c62066a7e8", + "sha256:f4c93e6102087dda4931fcd50fa4ad44e8e43e09419290c5f05cc2c690961ebf", + "sha256:fa1b639d85af4794cb20d7cfd4c5ae38e94a418b17a2318a1992b470fb68260d" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==5.5" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==5.6b1" }, "flake8": { "hashes": [ @@ -230,11 +266,11 @@ }, "pluggy": { "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" + "sha256:265a94bf44ca13662f12fcd1b074c14d4b269a712f051b6f644ef7e705d6735f", + "sha256:467f0219e89bb5061a8429c6fc5cf055fa3983a0e68e84a1d205046306b37d9e" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.13.1" + "version": "==1.0.0.dev0" }, "py": { "hashes": [ @@ -262,11 +298,11 @@ }, "pyparsing": { "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + "sha256:1c6409312ce2ce2997896af5756753778d5f1603666dba5587804f09ad82ed27", + "sha256:f4896b4cc085a1f8f8ae53a1a90db5a86b3825ff73eb974dffee3d9e701007f4" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" + "markers": "python_version >= '3.5'", + "version": "==3.0.0b2" }, "pytest": { "hashes": [ diff --git a/README.md b/README.md index 1b1c8da..ebd63ac 100644 --- a/README.md +++ b/README.md @@ -5,18 +5,19 @@ A simple password generator command line interface. ## Stories - [x] As a user I want to generate a random secure password to protect my personal accounts - - [x] Minimal length - - [x] Include symbols - - [x] Include numbers + - [x] Minimal length + - [x] Include symbols + - [x] Include numbers - [x] As a user I want the generated password to be copied to the clipboard - [x] As a user I want the generated password to be saved to a file - +- [ ] As a user I want to store generated passwords in a database for later usage + - [ ] Passwords must not be associated directly with the service they were generated for + - [ ] I can verify if the password is associated to a given service ## Getting Started These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. - ### Installing Clone the project repository @@ -49,7 +50,6 @@ make help make test ``` - ## Built With - [Typer](https://typer.tiangolo.com/) - Typer, build great CLIs. Easy to code. Based on Python type hints @@ -71,4 +71,3 @@ See also the list of [contributors](https://github.com/rjNemo/pass-gen/contribut ## License This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details - diff --git a/app/main.py b/app/main.py index f427df2..b8dcb1a 100644 --- a/app/main.py +++ b/app/main.py @@ -4,34 +4,63 @@ from typing import Optional import typer -from .pass_gen import generate_password +from .pass_gen import PassGenOptions, generate_password app = typer.Typer() @app.command() def main( - random: bool = True, - length: int = typer.Option(8, help="Length of the generated password."), + length: int = typer.Option( + 8, + "--length", + "-l", + help="Length of the generated password.", + ), numbers: bool = typer.Option( - True, help="If the generated password should include numeric characters." + True, + "--numbers", + "-n", + help="If the generated password should include numeric characters.", ), symbols: bool = typer.Option( - False, help="If the generated password should include special characters." + False, + "--symbols", + "-s", + help="If the generated password should include special characters.", ), file: Optional[str] = typer.Option( - None, help="Path to the file where the generated password should be saved." + None, + "--file", + "-f", + help="Path to the file where the generated password should be saved.", ), + random: bool = True, ) -> None: seed = r.randint(0, 100) if random else 0 - password = generate_password(seed, length, symbols, numbers) + options = PassGenOptions( + seed=seed, + length=length, + symbols=symbols, + numbers=numbers, + ) + + password = generate_password(options) typer.echo(typer.style(f"🔐 {password}", fg=typer.colors.GREEN, bold=True)) if file is not None: - with open(file, "w") as f: - f.write(password) - return + save_to_file(file, password) + return typer.echo(f"The password has been saved to: {file} 🗄") + return copy_to_clipboard(password) + + +def copy_to_clipboard(password: str) -> None: subprocess.run("pbcopy", universal_newlines=True, input=password) - typer.echo("The password has been copied to your clipboard 😉\nPaste it using cmd + v") + return typer.echo("The password has been copied to your clipboard 😉\nPaste it using cmd + v") + + +def save_to_file(file: str, password: str) -> None: + with open(file, "w") as f: + f.write(password) diff --git a/app/pass_gen.py b/app/pass_gen.py index 18c346d..9948593 100644 --- a/app/pass_gen.py +++ b/app/pass_gen.py @@ -2,15 +2,22 @@ import random import string from typing import Protocol +from pydantic import BaseModel -def generate_password( - seed: int, length: int = 8, symbols: bool = False, numbers: bool = True -) -> str: - characters = _build_characters(symbols=symbols, numbers=numbers) - random_generator = _new_random_generator(seed) +class PassGenOptions(BaseModel): + seed: int + length: int = 8 + symbols: bool = False + numbers: bool = True - return "".join(random_generator.sample(characters, length)) + +def generate_password(options: PassGenOptions) -> str: + characters = _build_characters(symbols=options.symbols, numbers=options.numbers) + + random_generator = _new_random_generator(options.seed) + + return "".join(random_generator.sample(characters, options.length)) class RandomSampler(Protocol): diff --git a/psswd.txt b/psswd.txt deleted file mode 100644 index f40ee0d..0000000 --- a/psswd.txt +++ /dev/null @@ -1 +0,0 @@ --'R>;X*cut&2^aOK \ No newline at end of file diff --git a/tests/main_test.py b/tests/main_test.py index 5f87e56..3de76b8 100644 --- a/tests/main_test.py +++ b/tests/main_test.py @@ -26,7 +26,7 @@ def test_cli_can_set_symbols() -> None: def test_cli_can_set_numbers() -> None: - args = ["--no-numbers"] + args = ["-n"] result = _run_cli(*args) print(result.stdout) assert "yWAcqGFz" in result.stdout diff --git a/tests/pass_gen_test.py b/tests/pass_gen_test.py index 5db0c5c..b5e9a98 100644 --- a/tests/pass_gen_test.py +++ b/tests/pass_gen_test.py @@ -1,5 +1,5 @@ import pytest -from app.pass_gen import generate_password +from app.pass_gen import PassGenOptions, generate_password @pytest.mark.parametrize( @@ -10,7 +10,8 @@ from app.pass_gen import generate_password ], ) def test_can_generate_random_password(seed: int, expected: str) -> None: - assert generate_password(seed) == expected + options = PassGenOptions(seed=seed) + assert generate_password(options) == expected @pytest.mark.parametrize( @@ -21,7 +22,8 @@ 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 + options = PassGenOptions(seed=seed, length=length) + assert generate_password(options) == expected @pytest.mark.parametrize( @@ -32,7 +34,8 @@ def test_control_password_length(seed: int, length: int, expected: str) -> None: ], ) def test_password_can_contain_symbols(seed: int, symbols: bool, expected: str) -> None: - assert generate_password(seed, symbols=symbols) == expected + options = PassGenOptions(seed=seed, symbols=symbols) + assert generate_password(options) == expected @pytest.mark.parametrize( @@ -43,4 +46,5 @@ def test_password_can_contain_symbols(seed: int, symbols: bool, expected: str) - ], ) def test_password_can_contain_numbers(seed: int, numbers: bool, expected: str) -> None: - assert generate_password(seed, numbers=numbers) == expected + options = PassGenOptions(seed=seed, numbers=numbers) + assert generate_password(options) == expected