import pytest from tracker import UsageTracker @pytest.fixture def tracker(tmp_path): return UsageTracker(db_path=str(tmp_path / "test.db")) def test_whitelist_starts_empty(tracker): assert tracker.get_whitelist() == set() def test_add_and_get(tracker): tracker.add_to_whitelist("My-Pack") assert tracker.get_whitelist() == {"My-Pack"} def test_add_is_idempotent(tracker): tracker.add_to_whitelist("My-Pack") tracker.add_to_whitelist("My-Pack") assert tracker.get_whitelist() == {"My-Pack"} def test_remove(tracker): tracker.add_to_whitelist("My-Pack") tracker.remove_from_whitelist("My-Pack") assert tracker.get_whitelist() == set() def test_remove_absent_is_noop(tracker): tracker.remove_from_whitelist("Nope") # must not raise assert tracker.get_whitelist() == set() def test_reset_clears_whitelist(tracker): tracker.add_to_whitelist("My-Pack") tracker.reset() assert tracker.get_whitelist() == set() class _Mapper: """Minimal stand-in for NodePackageMapper with a fixed mapping.""" def __init__(self, mapping): self.mapping = mapping def get_package(self, ct): return self.mapping.get(ct, "__unknown__") def get_all_packages(self): return set(self.mapping.values()) - {"__builtin__"} def test_package_stats_flags_whitelisted(tracker): mapper = _Mapper({"NodeA": "Pack-A", "NodeB": "Pack-B"}) tracker.record_usage(["NodeA", "NodeB"], mapper) tracker.add_to_whitelist("Pack-A") stats = {p["package"]: p for p in tracker.get_package_stats(mapper)} assert stats["Pack-A"]["whitelisted"] is True assert stats["Pack-B"]["whitelisted"] is False def test_package_stats_whitelist_is_case_insensitive(tracker): mapper = _Mapper({"NodeA": "Pack-A"}) tracker.record_usage(["NodeA"], mapper) tracker.add_to_whitelist("pack-a") # different case than the package name stats = {p["package"]: p for p in tracker.get_package_stats(mapper)} assert stats["Pack-A"]["whitelisted"] is True