diff --git a/flake.nix b/flake.nix index adf9d65..3620b7c 100644 --- a/flake.nix +++ b/flake.nix @@ -46,6 +46,7 @@ isort.settings.flags = "--profile black"; pylint.enable = false; # doesn't work correctly with module imports in flake detect-private-keys.enable = true; + detect-private-keys.excludes = [ "tests/" ]; }; }; app = self.packages.${system}.smtprd-ng; diff --git a/smtprd_ng/smtprd.py b/smtprd_ng/smtprd.py index 074ea46..f712365 100644 --- a/smtprd_ng/smtprd.py +++ b/smtprd_ng/smtprd.py @@ -400,11 +400,16 @@ class SMTPServer(Controller): return True -def main() -> int: - """Main routine +def parse_args(args=None) -> argparse.ArgumentParser.parse_args: + """Parse arguments - Returns: - int: exit code + Parameters + ---------- + args : List of strings + + Returns + ------- + argparse.ArgumentParser.parse_args : Namespace of arguments """ parser = argparse.ArgumentParser( description=__doc__.strip(), @@ -417,9 +422,21 @@ def main() -> int: default="./config.ini", help="configuration file", ) - args = parser.parse_args() - setlocale(LC_ALL, "C") # for strftime + return parser.parse_args(args) + +def main(args=None) -> int: + """Main routine + + Returns: + int: exit code + """ + args = parse_args(args) + setlocale(LC_ALL, "C") # for strftime + if len(args.config) == 0: + raise OSError("No config file supplied") + if not Path(args.config).is_file(): + raise OSError("Config file not found: " + str(args.config)) try: config: Config = Config.from_ini(args.config) except RuntimeError as e: diff --git a/tests/test_smtprd_ng.py b/tests/test_smtprd_ng.py index 2f35d34..c0004ca 100644 --- a/tests/test_smtprd_ng.py +++ b/tests/test_smtprd_ng.py @@ -19,12 +19,14 @@ Tests for smtprd_ng """ # pylint: disable=protected-access +# pylint: disable=unused-argument import configparser import email import email.message from pathlib import Path +import pytest from M2Crypto import BIO, SMIME, X509 from smtprd_ng import smtprd @@ -134,3 +136,21 @@ def test_client_sign(): p7, data = SMIME.smime_load_pkcs7_bio(buf) v = s.verify(p7, data) assert "Test to sign" in v.decode() + + +def test_cli_no_config_file(capsys): + """Test whether config file parameter is supplied""" + test_args = ["--config", ""] + with pytest.raises(Exception) as e_info: + smtprd.main(test_args) + assert e_info.typename == "OSError" + assert str(e_info.value) == "No config file supplied" + + +def test_cli_config_file_not_found(capsys): + """Test whether config file is found""" + test_args = ["--config", "doesnotexist.conf"] + with pytest.raises(Exception) as e_info: + smtprd.main(test_args) + assert e_info.typename == "OSError" + assert str(e_info.value) == "Config file not found: doesnotexist.conf"