from __future__ import annotations import unittest from types import SimpleNamespace from javis.providers.base import ChatMessage from javis.ui.chat_controller import DesktopController, sanitized_error class _Service: def __init__(self) -> None: self.sessions = [ SimpleNamespace(id="one", title="Eins"), SimpleNamespace(id="two", title="Zwei"), ] def new_session(self): return self.sessions[0] def list_sessions(self): return self.sessions def search_sessions(self, text: str): return [session for session in self.sessions if text in session.title] def load_session(self, session_id: str): session = next(item for item in self.sessions if item.id == session_id) return SimpleNamespace( session=session, messages=[ChatMessage("user", "Hallo")], ) def rename_session(self, session_id: str, title: str): session = next(item for item in self.sessions if item.id == session_id) session.title = title return session class _Hybrid: mode = "auto" last_route = None def set_mode(self, mode: str) -> None: self.mode = mode class DesktopControllerTests(unittest.TestCase): def setUp(self) -> None: self.runtime = SimpleNamespace( service=_Service(), hybrid_provider=_Hybrid(), ) self.controller = DesktopController(self.runtime) def test_controller_manages_sessions_without_qt_window(self) -> None: created = self.controller.new_session() listed = self.controller.list_sessions() searched = self.controller.list_sessions("Zwei") loaded = self.controller.load_session("two") renamed = self.controller.rename_active_session("Neu") self.assertEqual(created.id, "one") self.assertEqual(len(listed), 2) self.assertEqual([session.id for session in searched], ["two"]) self.assertEqual(loaded.messages[0].content, "Hallo") self.assertEqual(renamed.title, "Neu") def test_error_sanitizer_masks_key_patterns(self) -> None: secret = "AIza" + "x" * 25 result = sanitized_error(RuntimeError(f"Fehler {secret}")) self.assertNotIn(secret, result) self.assertIn("MASKIERT", result)