Files
aza/AzA march 2026/_test_chat_popup_surface.py
2026-06-13 22:47:31 +02:00

178 lines
5.8 KiB
Python

# -*- coding: utf-8 -*-
"""Tests fuer Empfang-Popup-Unterdrueckung und Surface-State."""
from __future__ import annotations
import os
import tempfile
import time
import unittest
from unittest.mock import MagicMock, patch
from aza_empfang_shell_surface import (
peer_matches_surface,
read_shell_surface_state,
shell_surface_state_path,
surface_indicates_active_direct_chat,
write_shell_surface_state,
)
class TestShellSurfaceState(unittest.TestCase):
def setUp(self):
self._td = tempfile.TemporaryDirectory()
self._patcher = patch(
"aza_empfang_shell_surface.shell_surface_state_path",
return_value=__import__("pathlib").Path(self._td.name) / "surface.json",
)
self._patcher.start()
def tearDown(self):
self._patcher.stop()
self._td.cleanup()
def test_write_and_read(self):
write_shell_surface_state(
{
"mode": "direct",
"peer_user_id": "user_a",
"document_visible": True,
"shell_minimized": False,
}
)
st = read_shell_surface_state()
self.assertIsNotNone(st)
self.assertEqual(st["peer_user_id"], "user_a")
self.assertEqual(st["mode"], "direct")
def test_peer_match(self):
st = {"peer_user_id": "u1", "external_peer_user_id": "ext1"}
self.assertTrue(peer_matches_surface("u1", st))
self.assertTrue(peer_matches_surface("ext1", st))
self.assertFalse(peer_matches_surface("other", st))
def test_active_direct_chat_requires_visible(self):
write_shell_surface_state(
{
"mode": "direct",
"peer_user_id": "peer_x",
"document_visible": False,
"shell_minimized": False,
}
)
self.assertFalse(surface_indicates_active_direct_chat("peer_x"))
def test_active_direct_chat_ok(self):
write_shell_surface_state(
{
"mode": "direct",
"peer_user_id": "peer_x",
"document_visible": True,
"shell_minimized": False,
}
)
self.assertTrue(surface_indicates_active_direct_chat("peer_x"))
def test_stale_state_ignored(self):
path = shell_surface_state_path()
path.write_text(
'{"ts": 1, "mode": "direct", "peer_user_id": "old", "document_visible": true}',
encoding="utf-8",
)
self.assertIsNone(read_shell_surface_state(max_age_sec=1.0))
class TestPopupSuppressLogic(unittest.TestCase):
def test_suppress_when_matching_chat_visible(self):
from aza_empfang_incoming_popup import should_suppress_incoming_popup
app = MagicMock()
app._empfang_webview_subprocess_alive.return_value = True
app._empfang_webview_resolve_shell_hwnd.return_value = 0
with patch(
"aza_empfang_incoming_popup.empfang_shell_hwnd_minimized",
return_value=False,
), patch(
"aza_empfang_incoming_popup.surface_indicates_active_direct_chat",
return_value=True,
):
self.assertTrue(should_suppress_incoming_popup(app, "peer_1"))
def test_no_suppress_when_chat_minimized(self):
from aza_empfang_incoming_popup import should_suppress_incoming_popup
app = MagicMock()
app._empfang_webview_subprocess_alive.return_value = True
with patch(
"aza_empfang_incoming_popup.empfang_shell_hwnd_minimized",
return_value=True,
):
self.assertFalse(should_suppress_incoming_popup(app, "peer_1"))
def test_no_suppress_without_webview(self):
from aza_empfang_incoming_popup import should_suppress_incoming_popup
app = MagicMock()
app._empfang_webview_subprocess_alive.return_value = False
self.assertFalse(should_suppress_incoming_popup(app, "peer_1"))
class TestSendDmPayload(unittest.TestCase):
def test_send_requires_peer_user_id(self):
from aza_empfang_incoming_popup import send_dm_text_to_peer
app = MagicMock()
app.get_practice_id.return_value = "prac_1"
app._empfang_self_user_id.return_value = "me"
app._empfang_self_user_id_resolve_now.return_value = "me"
ok, msg = send_dm_text_to_peer(app, "", "Hallo")
self.assertFalse(ok)
class TestPopupHost(unittest.TestCase):
def test_popup_parent_uses_host_when_main_withdrawn(self):
from aza_empfang_incoming_popup import empfang_popup_parent
app = MagicMock()
host = MagicMock()
with patch(
"aza_empfang_incoming_popup.empfang_main_window_usable",
return_value=False,
), patch(
"aza_empfang_incoming_popup.empfang_popup_host",
return_value=host,
) as mock_host:
self.assertIs(empfang_popup_parent(app), host)
mock_host.assert_called_once_with(app)
def test_popup_parent_uses_app_when_usable(self):
from aza_empfang_incoming_popup import empfang_popup_parent
app = MagicMock()
with patch(
"aza_empfang_incoming_popup.empfang_main_window_usable",
return_value=True,
):
self.assertIs(empfang_popup_parent(app), app)
class TestDiktatInsert(unittest.TestCase):
def test_insert_replaces_selection(self):
import tkinter as tk
from aza_empfang_incoming_popup import insert_diktat_at_cursor
root = tk.Tk()
root.withdraw()
try:
tw = tk.Text(root)
tw.insert("1.0", "alt text")
tw.tag_add("sel", "1.0", "1.3")
tw.mark_set("insert", "1.0")
insert_diktat_at_cursor(tw, "neu")
self.assertEqual(tw.get("1.0", "end").strip(), "neu text")
finally:
root.destroy()
if __name__ == "__main__":
unittest.main()