94 lines
2.7 KiB
Python
94 lines
2.7 KiB
Python
from unittest.mock import MagicMock, patch
|
|
import pytest
|
|
from config.config_manager import ConfigManager
|
|
from core.switcher import MonitorSwitcher
|
|
|
|
|
|
@pytest.fixture
|
|
def config(tmp_path):
|
|
return ConfigManager(tmp_path / "config.json")
|
|
|
|
|
|
def _make_mock_monitor():
|
|
m = MagicMock()
|
|
m.__enter__ = MagicMock(return_value=m)
|
|
m.__exit__ = MagicMock(return_value=False)
|
|
return m
|
|
|
|
|
|
def test_apply_profile_sends_vcp_to_both_monitors(config):
|
|
mon0 = _make_mock_monitor()
|
|
mon1 = _make_mock_monitor()
|
|
|
|
with patch("core.switcher.get_monitors", return_value=[mon0, mon1]):
|
|
sw = MonitorSwitcher(config)
|
|
sw.apply_profile("pc1_dp")
|
|
|
|
mon0.set_vcp_feature.assert_called_once_with(0x60, 15)
|
|
mon1.set_vcp_feature.assert_called_once_with(0x60, 15)
|
|
|
|
|
|
def test_apply_profile_hdmi(config):
|
|
mon0 = _make_mock_monitor()
|
|
mon1 = _make_mock_monitor()
|
|
|
|
with patch("core.switcher.get_monitors", return_value=[mon0, mon1]):
|
|
sw = MonitorSwitcher(config)
|
|
sw.apply_profile("pc2_hdmi")
|
|
|
|
mon0.set_vcp_feature.assert_called_once_with(0x60, 17)
|
|
mon1.set_vcp_feature.assert_called_once_with(0x60, 17)
|
|
|
|
|
|
def test_apply_profile_skips_missing_monitor(config):
|
|
mon0 = _make_mock_monitor()
|
|
|
|
with patch("core.switcher.get_monitors", return_value=[mon0]):
|
|
sw = MonitorSwitcher(config)
|
|
sw.apply_profile("pc1_dp")
|
|
|
|
mon0.set_vcp_feature.assert_called_once_with(0x60, 15)
|
|
|
|
|
|
def test_apply_profile_continues_on_monitor_error(config):
|
|
mon0 = _make_mock_monitor()
|
|
mon1 = _make_mock_monitor()
|
|
mon0.set_vcp_feature.side_effect = Exception("DDC/CI error")
|
|
|
|
with patch("core.switcher.get_monitors", return_value=[mon0, mon1]):
|
|
sw = MonitorSwitcher(config)
|
|
sw.apply_profile("pc1_dp")
|
|
|
|
mon1.set_vcp_feature.assert_called_once_with(0x60, 15)
|
|
|
|
|
|
def test_apply_profile_unknown_profile_does_nothing(config):
|
|
with patch("core.switcher.get_monitors", return_value=[]) as mock_gm:
|
|
sw = MonitorSwitcher(config)
|
|
sw.apply_profile("nonexistent")
|
|
mock_gm.assert_not_called()
|
|
|
|
|
|
def test_on_switch_callback_fires(config):
|
|
mon0 = _make_mock_monitor()
|
|
mon1 = _make_mock_monitor()
|
|
received = []
|
|
|
|
with patch("core.switcher.get_monitors", return_value=[mon0, mon1]):
|
|
sw = MonitorSwitcher(config)
|
|
sw.on_switch(lambda pid: received.append(pid))
|
|
sw.apply_profile("pc2_hdmi")
|
|
|
|
assert received == ["pc2_hdmi"]
|
|
|
|
|
|
def test_apply_profile_updates_active_profile(config):
|
|
mon0 = _make_mock_monitor()
|
|
mon1 = _make_mock_monitor()
|
|
|
|
with patch("core.switcher.get_monitors", return_value=[mon0, mon1]):
|
|
sw = MonitorSwitcher(config)
|
|
sw.apply_profile("pc2_hdmi")
|
|
|
|
assert config.get_active_profile_id() == "pc2_hdmi"
|