diff --git a/core/session_manager.py b/core/session_manager.py index 5491929..ecc23e0 100644 --- a/core/session_manager.py +++ b/core/session_manager.py @@ -14,7 +14,7 @@ import logging from datetime import datetime, timezone, timedelta from typing import Dict, Optional -from .database import Session as DbSession, ChatMessage as DbChatMessage, Document as DbDocument, SessionLocal +from .database import Session as DbSession, ChatMessage as DbChatMessage, Document as DbDocument, SessionLocal, utcnow_naive from .models import Session, ChatMessage logger = logging.getLogger(__name__) @@ -619,7 +619,7 @@ class SessionManager: try: all_sessions = db.query(DbSession).all() - cutoff_date = datetime.now(timezone.utc) - timedelta(days=auto_archive_days) + cutoff_date = utcnow_naive() - timedelta(days=auto_archive_days) for db_session in all_sessions: stats['total_checked'] += 1 diff --git a/tests/test_session_manager_cleanup.py b/tests/test_session_manager_cleanup.py new file mode 100644 index 0000000..f6876d7 --- /dev/null +++ b/tests/test_session_manager_cleanup.py @@ -0,0 +1,34 @@ +from datetime import datetime +from types import SimpleNamespace +from unittest.mock import MagicMock + +from core.session_manager import SessionManager +import core.session_manager as SM + + +def _manager_with(sessions=None): + manager = SessionManager.__new__(SessionManager) + manager.sessions = dict(sessions or {}) + return manager + + +def test_cleanup_empty_sessions_archives_old_naive_last_accessed(monkeypatch): + old_session = SimpleNamespace( + id="old-chat", + archived=False, + last_accessed=datetime(2026, 5, 1, 12, 0, 0), + message_count=3, + is_important=False, + ) + db = MagicMock() + db.query.return_value.all.return_value = [old_session] + + monkeypatch.setattr(SM, "SessionLocal", lambda: db) + monkeypatch.setattr(SM, "utcnow_naive", lambda: datetime(2026, 6, 4, 12, 0, 0)) + + stats = _manager_with().cleanup_empty_sessions(auto_archive_days=30) + + assert old_session.archived is True + assert stats == {"deleted_empty": 0, "archived_old": 1, "total_checked": 1} + db.commit.assert_called_once() + db.rollback.assert_not_called()