"""Tests for the node audit store (legal compliance IP/action logging).""" import time import pytest from meshbay_node.audit import AuditStore @pytest.fixture async def audit(tmp_path): store = AuditStore(db_path=tmp_path / "audit.db") await store.open() yield store await store.close() @pytest.mark.asyncio async def test_log_and_retrieve(audit): await audit.log_event( user_id="u1", event="handshake", ip="1.2.3.4", username="alice", group_id="g1", detail="test") await audit.log_event( user_id="u2", event="file_download", ip="5.6.7.8", username="bob", group_id="g1", detail="video.mp4") entries = await audit.get_entries() assert len(entries) == 2 assert entries[0].event == "file_download" assert entries[0].ip == "5.6.7.8" assert entries[1].event == "handshake" @pytest.mark.asyncio async def test_filter_by_event(audit): await audit.log_event(user_id="u1", event="handshake", ip="1.1.1.1") await audit.log_event(user_id="u1", event="file_download", ip="1.1.1.1") await audit.log_event(user_id="u1", event="handshake", ip="1.1.1.1") entries = await audit.get_entries(event="handshake") assert len(entries) == 2 assert all(e.event == "handshake" for e in entries) @pytest.mark.asyncio async def test_filter_by_user(audit): await audit.log_event(user_id="u1", event="handshake") await audit.log_event(user_id="u2", event="handshake") entries = await audit.get_entries(user_id="u1") assert len(entries) == 1 assert entries[0].user_id == "u1" @pytest.mark.asyncio async def test_entry_count(audit): assert await audit.entry_count() == 0 await audit.log_event(user_id="u1", event="connect") await audit.log_event(user_id="u2", event="connect") assert await audit.entry_count() == 2 @pytest.mark.asyncio async def test_cleanup_old_entries(audit): await audit.log_event(user_id="u1", event="old") # manually backdate await audit._db.execute( "UPDATE audit_log SET timestamp = ? WHERE event = 'old'", (time.time() - 400 * 86400,)) await audit._db.commit() await audit.log_event(user_id="u2", event="recent") deleted = await audit.cleanup(retention_days=365) assert deleted == 1 assert await audit.entry_count() == 1