From 4193037cd44a762554cbb0e7e10fd2ee2bdf2bc5 Mon Sep 17 00:00:00 2001 From: Chris Caron Date: Sun, 1 Jun 2025 20:20:42 -0400 Subject: [PATCH] more test coverage --- apprise/utils/pem.py | 4 +++- test/test_utils_pem.py | 51 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/apprise/utils/pem.py b/apprise/utils/pem.py index aaff8627..17bc6771 100644 --- a/apprise/utils/pem.py +++ b/apprise/utils/pem.py @@ -279,7 +279,7 @@ class ApprisePEMController: has_key = True if self.private_key(autogen=False) \ or self.public_key(autogen=False) else False - if (has_key and not name) or not self.path: + if (has_key and not (name or force)) or not self.path: logger.trace( 'PEM keygen disabled, reason=%s', 'keyfile-defined' if not has_key @@ -342,6 +342,8 @@ class ApprisePEMController: except OSError: pass + return False + try: with open(prv_path, 'wb') as f: f.write(private_key) diff --git a/test/test_utils_pem.py b/test/test_utils_pem.py index cde6cac1..b0e6cd3c 100644 --- a/test/test_utils_pem.py +++ b/test/test_utils_pem.py @@ -129,6 +129,12 @@ def test_utils_pem_general(tmpdir): auth_secret=b'secret') assert isinstance(webpush_content, bytes) + webpush_content = pem_c.encrypt_webpush( + unencrypted_str.encode('utf-8'), + public_key=pem_c.public_key(), + auth_secret=b'secret') + assert isinstance(webpush_content, bytes) + # Non Bytes (garbage basically) with pytest.raises(TypeError): assert pem_c.decrypt(None) is None @@ -225,11 +231,22 @@ def test_utils_pem_general(tmpdir): # It works now assert pem_c.keygen() is True + # Tests public_key generation failure only with mock.patch('builtins.open', side_effect=OSError()): assert pem_c.keygen(force=True) is False with mock.patch('os.unlink', side_effect=OSError()): assert pem_c.keygen(force=True) is False + # Tests private key generation + side_effect = [ + mock.mock_open(read_data="file contents").return_value] + \ + [OSError() for _ in range(10)] + with mock.patch('builtins.open', side_effect=side_effect): + assert pem_c.keygen(force=True) is False + with mock.patch('builtins.open', side_effect=side_effect): + with mock.patch('os.unlink', side_effect=OSError()): + assert pem_c.keygen(force=True) is False + # Generate a new key referencing another location pem_c = utils.pem.ApprisePEMController(path=str(tmpdir0), asset=asset) # We can't re-generate keys if ones already exist @@ -263,6 +280,40 @@ def test_utils_pem_general(tmpdir): assert pem_c.decrypt( content, private_key=pem_c.private_key()) == unencrypted_str + # Test different edge cases of load_private_key() + pem_c = utils.pem.ApprisePEMController(path=str(tmpdir0), asset=asset) + assert pem_c.load_private_key(path=prv_keyfile) is True + pem_c = utils.pem.ApprisePEMController(path=str(tmpdir0), asset=asset) + with mock.patch('builtins.open', side_effect=TypeError()): + assert pem_c.load_private_key(path=prv_keyfile) is False + with mock.patch('builtins.open', side_effect=OSError()): + assert pem_c.load_private_key(path=prv_keyfile) is False + with mock.patch('builtins.open', side_effect=FileNotFoundError()): + assert pem_c.load_private_key(path=prv_keyfile) is False + + # Test different edge cases of load_public_key() + pem_c = utils.pem.ApprisePEMController(path=str(tmpdir0), asset=asset) + assert pem_c.load_public_key(path=pub_keyfile) is True + pem_c = utils.pem.ApprisePEMController(path=str(tmpdir0), asset=asset) + with mock.patch('builtins.open', side_effect=TypeError()): + assert pem_c.load_public_key(path=pub_keyfile) is False + with mock.patch('builtins.open', side_effect=OSError()): + assert pem_c.load_public_key(path=pub_keyfile) is False + with mock.patch('builtins.open', side_effect=FileNotFoundError()): + assert pem_c.load_public_key(path=pub_keyfile) is False + + pem_c = utils.pem.ApprisePEMController(path=str(tmpdir0), asset=asset) + assert pem_c.public_keyfile('test1', 'test2') == pub_keyfile + assert pem_c.private_keyfile('test1', 'test2') == prv_keyfile + + pem_c = utils.pem.ApprisePEMController( + path=str(tmpdir0), name='pub1', asset=asset) + assert pem_c.public_key(autogen=True) + + pem_c = utils.pem.ApprisePEMController( + path=str(tmpdir0), name='pub2', asset=asset) + assert pem_c.private_key(autogen=True) + @pytest.mark.skipif( 'cryptography' in sys.modules,