1
0

test_action.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import datetime
  2. import unittest.mock
  3. import pytest
  4. import systemctl_mqtt
  5. # pylint: disable=protected-access
  6. @pytest.mark.parametrize(
  7. "delay", [datetime.timedelta(seconds=4), datetime.timedelta(hours=21)]
  8. )
  9. def test_poweroff_trigger(delay):
  10. action = systemctl_mqtt._MQTTActionSchedulePoweroff()
  11. with unittest.mock.patch(
  12. "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy"
  13. ), unittest.mock.patch(
  14. "systemctl_mqtt._dbus.login_manager.schedule_shutdown"
  15. ) as schedule_shutdown_mock:
  16. action.trigger(
  17. state=systemctl_mqtt._State(
  18. mqtt_topic_prefix="systemctl/hostname",
  19. homeassistant_discovery_prefix="homeassistant",
  20. homeassistant_discovery_object_id="node",
  21. poweroff_delay=delay,
  22. monitored_system_unit_names=[],
  23. controlled_system_unit_names=[],
  24. )
  25. )
  26. schedule_shutdown_mock.assert_called_once_with(action="poweroff", delay=delay)
  27. @pytest.mark.parametrize(
  28. ("topic_suffix", "expected_action_arg"), [("poweroff", "poweroff")]
  29. )
  30. def test_mqtt_topic_suffix_action_mapping_poweroff(topic_suffix, expected_action_arg):
  31. mqtt_action = systemctl_mqtt._MQTT_TOPIC_SUFFIX_ACTION_MAPPING[topic_suffix]
  32. login_manager_mock = unittest.mock.MagicMock()
  33. with unittest.mock.patch(
  34. "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
  35. return_value=login_manager_mock,
  36. ):
  37. mqtt_action.trigger(
  38. state=systemctl_mqtt._State(
  39. mqtt_topic_prefix="systemctl/hostname",
  40. homeassistant_discovery_prefix="homeassistant",
  41. homeassistant_discovery_object_id="node",
  42. poweroff_delay=datetime.timedelta(),
  43. monitored_system_unit_names=[],
  44. controlled_system_unit_names=[],
  45. )
  46. )
  47. login_manager_mock.ScheduleShutdown.assert_called_once()
  48. schedule_args, schedule_kwargs = login_manager_mock.ScheduleShutdown.call_args
  49. assert not schedule_args
  50. assert schedule_kwargs.pop("action") == expected_action_arg
  51. assert abs(
  52. datetime.datetime.now() - schedule_kwargs.pop("time")
  53. ) < datetime.timedelta(seconds=2)
  54. assert not schedule_kwargs
  55. def test_mqtt_topic_suffix_action_mapping_lock():
  56. mqtt_action = systemctl_mqtt._MQTT_TOPIC_SUFFIX_ACTION_MAPPING["lock-all-sessions"]
  57. login_manager_mock = unittest.mock.MagicMock()
  58. with unittest.mock.patch(
  59. "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
  60. return_value=login_manager_mock,
  61. ):
  62. mqtt_action.trigger(state="dummy")
  63. login_manager_mock.LockSessions.assert_called_once_with()
  64. def test_mqtt_topic_suffix_action_mapping_suspend():
  65. mqtt_action = systemctl_mqtt._MQTT_TOPIC_SUFFIX_ACTION_MAPPING["suspend"]
  66. login_manager_mock = unittest.mock.MagicMock()
  67. with unittest.mock.patch(
  68. "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
  69. return_value=login_manager_mock,
  70. ):
  71. mqtt_action.trigger(state="dummy")
  72. login_manager_mock.Suspend.assert_called_once_with(interactive=False)
  73. def test_poweroff_str():
  74. assert (
  75. str(systemctl_mqtt._MQTTActionSchedulePoweroff())
  76. == "_MQTTActionSchedulePoweroff"
  77. )