141 lines
3.9 KiB
Python
141 lines
3.9 KiB
Python
"""
|
|
Unit tests for incoming text announcement behavior.
|
|
"""
|
|
|
|
import importlib.util
|
|
from pathlib import Path
|
|
from unittest.mock import Mock
|
|
|
|
import pytest
|
|
|
|
|
|
def _load_incoming_module():
|
|
module_path = (
|
|
Path(__file__).resolve().parents[2]
|
|
/ "src"
|
|
/ "fenrirscreenreader"
|
|
/ "commands"
|
|
/ "onScreenUpdate"
|
|
/ "70000-incoming.py"
|
|
)
|
|
spec = importlib.util.spec_from_file_location(
|
|
"fenrir_incoming_command", module_path
|
|
)
|
|
module = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
@pytest.fixture
|
|
def incoming_command():
|
|
incoming_module = _load_incoming_module()
|
|
output_manager = Mock(present_text=Mock())
|
|
settings_manager = Mock()
|
|
settings_manager.get_setting_as_bool.side_effect = (
|
|
lambda section, setting: True
|
|
if (section, setting) == ("speech", "auto_read_incoming")
|
|
else False
|
|
)
|
|
settings_manager.get_setting_as_float.side_effect = (
|
|
lambda section, setting: {
|
|
("speech", "rapid_update_window"): 0.3,
|
|
("speech", "batch_flush_interval"): 0.5,
|
|
}[(section, setting)]
|
|
)
|
|
settings_manager.get_setting_as_int.side_effect = (
|
|
lambda section, setting: {
|
|
("speech", "rapid_update_threshold"): 5,
|
|
("speech", "flood_line_threshold"): 500,
|
|
("speech", "max_batch_lines"): 100,
|
|
}[(section, setting)]
|
|
)
|
|
|
|
env = {
|
|
"runtime": {
|
|
"OutputManager": output_manager,
|
|
"SettingsManager": settings_manager,
|
|
"ScreenManager": Mock(
|
|
is_delta=Mock(return_value=True),
|
|
is_screen_change=Mock(return_value=False),
|
|
),
|
|
},
|
|
"screen": {
|
|
"new_delta": "",
|
|
"old_content_text": "",
|
|
"new_content_text": "",
|
|
"old_cursor": {"x": 0, "y": 0},
|
|
"new_cursor": {"x": 0, "y": 0},
|
|
"newNegativeDelta": "",
|
|
},
|
|
"commandBuffer": {},
|
|
}
|
|
|
|
command = incoming_module.command()
|
|
command.initialize(env)
|
|
return command, env, output_manager
|
|
|
|
|
|
@pytest.mark.unit
|
|
class TestIncomingCommand:
|
|
"""Test incoming text filtering for chat-like screen updates."""
|
|
|
|
def test_prefers_inserted_chat_line_over_changed_headers(
|
|
self, incoming_command
|
|
):
|
|
command, env, output_manager = incoming_command
|
|
env["screen"]["old_content_text"] = "\n".join(
|
|
[
|
|
"Status old",
|
|
"Users old",
|
|
"alice: hi",
|
|
"bob: hello",
|
|
"> ",
|
|
]
|
|
)
|
|
env["screen"]["new_content_text"] = "\n".join(
|
|
[
|
|
"Status new",
|
|
"Users new",
|
|
"bob: hello",
|
|
"carol: test",
|
|
"> ",
|
|
]
|
|
)
|
|
env["screen"]["new_delta"] = "\n".join(
|
|
["Status new", "Users new", "carol: test"]
|
|
)
|
|
|
|
command.run()
|
|
|
|
output_manager.present_text.assert_called_once_with(
|
|
"carol: test", interrupt=False, flush=False
|
|
)
|
|
|
|
def test_keeps_header_update_when_no_lower_screen_insert_exists(
|
|
self, incoming_command
|
|
):
|
|
command, env, output_manager = incoming_command
|
|
env["screen"]["old_content_text"] = "\n".join(
|
|
[
|
|
"Status old",
|
|
"Users old",
|
|
"alice: hi",
|
|
"bob: hello",
|
|
]
|
|
)
|
|
env["screen"]["new_content_text"] = "\n".join(
|
|
[
|
|
"Status new",
|
|
"Users new",
|
|
"alice: hi",
|
|
"bob: hello",
|
|
]
|
|
)
|
|
env["screen"]["new_delta"] = "\n".join(["Status new", "Users new"])
|
|
|
|
command.run()
|
|
|
|
output_manager.present_text.assert_called_once_with(
|
|
"Status new\nUsers new", interrupt=False, flush=False
|
|
)
|