import asyncio import time from pathlib import Path import pytest from ais_hub.config import Config, StorageCfg from ais_hub.core.stats import Stats from ais_hub.storage import db as storage_db from ais_hub.storage.retention import cleanup_once @pytest.mark.asyncio async def test_cleanup_once_removes_old_rows(tmp_path: Path): cfg = Config() cfg.storage.path = str(tmp_path / "t.db") cfg.storage.retention.ais_dynamic_days = 1 cfg.storage.retention.gps_fix_days = 1 cfg.storage.retention.raw_nmea_days = 1 cfg.storage.retention.radio_telemetry_days = 1 conn = await storage_db.connect(cfg.storage.path) now = time.time() old = now - 5 * 86400 fresh = now - 60 await conn.executemany( "INSERT INTO ais_dynamic (mmsi, ts, lat, lon, sog, cog, heading, nav_status, rot, raw_msg_type) " "VALUES (?,?,?,?,?,?,?,?,?,?)", [ (1, old, 0, 0, 0, 0, 0, 0, 0, 1), (1, fresh, 0, 0, 0, 0, 0, 0, 0, 1), ], ) await conn.executemany( "INSERT INTO gps_fix (ts, lat, lon, sog, cog, alt, fix_quality, sats, hdop) " "VALUES (?,?,?,?,?,?,?,?,?)", [(old, 0, 0, 0, 0, 0, 1, 5, 1.0), (fresh, 0, 0, 0, 0, 0, 1, 5, 1.0)], ) await conn.commit() stats = Stats() await cleanup_once(conn, cfg.storage, stats) async with conn.execute("SELECT COUNT(*) FROM ais_dynamic") as cur: (n_dyn,) = await cur.fetchone() async with conn.execute("SELECT COUNT(*) FROM gps_fix") as cur: (n_gps,) = await cur.fetchone() assert n_dyn == 1 assert n_gps == 1 assert stats.counters.get("retention_deleted_ais_dynamic", 0) >= 1 assert stats.counters.get("retention_deleted_gps_fix", 0) >= 1 await storage_db.close(conn)