From a8cfa6f4d324f57a1fabb91b742448b6c43b6205 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Thu, 3 Jul 2025 00:08:00 -0400 Subject: [PATCH] Add TOTP tests and legacy entry type check --- src/requirements.txt | 2 ++ src/tests/test_entry_add.py | 15 +++++++++++++++ src/tests/test_totp.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 src/tests/test_totp.py diff --git a/src/requirements.txt b/src/requirements.txt index d7b2add..29ad75f 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -19,3 +19,5 @@ tomli hypothesis mutmut==2.4.4 pyotp>=2.8.0 + +freezegun diff --git a/src/tests/test_entry_add.py b/src/tests/test_entry_add.py index d96f1c3..a64b068 100644 --- a/src/tests/test_entry_add.py +++ b/src/tests/test_entry_add.py @@ -64,3 +64,18 @@ def test_round_trip_entry_types(method, expected_type): assert entry["type"] == expected_type data = enc_mgr.load_json_data(entry_mgr.index_file) assert data["entries"][str(index)]["type"] == expected_type + + +def test_legacy_entry_defaults_to_password(): + with TemporaryDirectory() as tmpdir: + vault, enc_mgr = create_vault(Path(tmpdir), TEST_SEED, TEST_PASSWORD) + entry_mgr = EntryManager(vault, Path(tmpdir)) + + index = entry_mgr.add_entry("example.com", 8) + + data = enc_mgr.load_json_data(entry_mgr.index_file) + data["entries"][str(index)].pop("type", None) + enc_mgr.save_json_data(data, entry_mgr.index_file) + + loaded = entry_mgr._load_index() + assert loaded["entries"][str(index)]["type"] == "password" diff --git a/src/tests/test_totp.py b/src/tests/test_totp.py new file mode 100644 index 0000000..ddaacd9 --- /dev/null +++ b/src/tests/test_totp.py @@ -0,0 +1,30 @@ +import sys +from pathlib import Path + +import pyotp +from freezegun import freeze_time + +sys.path.append(str(Path(__file__).resolve().parents[1])) + +from helpers import TEST_SEED +from password_manager.totp import TotpManager + + +@freeze_time("1970-01-01 00:16:40") +def test_current_code_matches_pyotp(): + secret = TotpManager.derive_secret(TEST_SEED, 0) + expected = pyotp.TOTP(secret).now() + assert TotpManager.current_code(TEST_SEED, 0) == expected + + +@freeze_time("1970-01-01 00:00:15") +def test_time_remaining(): + assert TotpManager.time_remaining(period=30) == 15 + + +def test_print_progress_bar_terminates(monkeypatch): + monkeypatch.setattr(TotpManager, "time_remaining", lambda period: 0) + calls = [] + monkeypatch.setattr("password_manager.totp.time.sleep", lambda s: calls.append(s)) + TotpManager.print_progress_bar(period=30) + assert calls == []