Files
fenrir/tests/unit/test_incoming_command.py

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
)