From 6aead9342345fc912affd18017935273ed66dec2 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Tue, 1 Jul 2025 12:51:24 -0400 Subject: [PATCH] Add workflow test for PasswordManager --- src/tests/test_manager_workflow.py | 87 ++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/tests/test_manager_workflow.py diff --git a/src/tests/test_manager_workflow.py b/src/tests/test_manager_workflow.py new file mode 100644 index 0000000..8694591 --- /dev/null +++ b/src/tests/test_manager_workflow.py @@ -0,0 +1,87 @@ +import sys +from pathlib import Path +from tempfile import TemporaryDirectory +from cryptography.fernet import Fernet + +sys.path.append(str(Path(__file__).resolve().parents[1])) + +from password_manager.encryption import EncryptionManager +from password_manager.entry_management import EntryManager +from password_manager.vault import Vault +from password_manager.backup import BackupManager +from password_manager.manager import PasswordManager + + +class FakePasswordGenerator: + def generate_password(self, length: int, index: int) -> str: # noqa: D401 + return f"pw-{index}-{length}" + + +class FakeNostrClient: + def __init__(self, *args, **kwargs): + self.published = [] + + def publish_json_to_nostr(self, data: bytes): + self.published.append(data) + return True + + +def test_manager_workflow(monkeypatch): + with TemporaryDirectory() as tmpdir: + tmp_path = Path(tmpdir) + key = Fernet.generate_key() + enc_mgr = EncryptionManager(key, tmp_path) + vault = Vault(enc_mgr, tmp_path) + entry_mgr = EntryManager(vault, tmp_path) + backup_mgr = BackupManager(tmp_path) + + monkeypatch.setattr("password_manager.manager.NostrClient", FakeNostrClient) + + pm = PasswordManager.__new__(PasswordManager) + pm.encryption_manager = enc_mgr + pm.vault = vault + pm.entry_manager = entry_mgr + pm.backup_manager = backup_mgr + pm.password_generator = FakePasswordGenerator() + pm.nostr_client = FakeNostrClient() + pm.fingerprint_dir = tmp_path + pm.is_dirty = False + + inputs = iter( + [ + "example.com", + "", # username + "", # url + "", # length (default) + "0", # retrieve index + "0", # modify index + "user", # new username + "", # new url + "", # blacklist status + ] + ) + monkeypatch.setattr("builtins.input", lambda *args, **kwargs: next(inputs)) + + pm.handle_add_password() + assert pm.is_dirty is True + backups = list(tmp_path.glob("passwords_db_backup_*.json.enc")) + assert len(backups) == 1 + checksum_file = tmp_path / "seedpass_passwords_db_checksum.txt" + assert checksum_file.exists() + checksum_after_add = checksum_file.read_text() + first_post = pm.nostr_client.published[-1] + + pm.is_dirty = False + pm.handle_retrieve_entry() + assert pm.is_dirty is False + + pm.handle_modify_entry() + assert pm.is_dirty is True + pm.backup_manager.create_backup() + backup_dir = tmp_path / "backups" + backups_mod = list(backup_dir.glob("passwords_db_backup_*.json.enc")) + assert backups_mod + checksum_after_modify = checksum_file.read_text() + assert checksum_after_modify != checksum_after_add + assert first_post in pm.nostr_client.published + assert pm.nostr_client.published[-1] != first_post