test_dbus.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import datetime
  2. import unittest.mock
  3. import dbus
  4. import pytest
  5. import systemctl_mqtt
  6. _UTC = datetime.timezone(offset=datetime.timedelta(seconds=0))
  7. # pylint: disable=protected-access
  8. def test__get_login_manager():
  9. login_manager = systemctl_mqtt._get_login_manager()
  10. assert isinstance(login_manager, dbus.proxies.Interface)
  11. assert login_manager.dbus_interface == "org.freedesktop.login1.Manager"
  12. # https://freedesktop.org/wiki/Software/systemd/logind/
  13. assert isinstance(login_manager.CanPowerOff(), dbus.String)
  14. @pytest.mark.parametrize("action", ["poweroff", "reboot"])
  15. def test__schedule_shutdown(action):
  16. login_manager_mock = unittest.mock.MagicMock()
  17. with unittest.mock.patch(
  18. "systemctl_mqtt._get_login_manager", return_value=login_manager_mock
  19. ):
  20. systemctl_mqtt._schedule_shutdown(action=action)
  21. login_manager_mock.ScheduleShutdown.assert_called_once()
  22. schedule_args, schedule_kwargs = login_manager_mock.ScheduleShutdown.call_args
  23. assert len(schedule_args) == 2
  24. assert schedule_args[0] == action
  25. shutdown_datetime = datetime.datetime.fromtimestamp(
  26. schedule_args[1] / 10 ** 6, tz=_UTC,
  27. )
  28. delay = shutdown_datetime - datetime.datetime.now(tz=_UTC)
  29. assert delay.total_seconds() == pytest.approx(
  30. datetime.timedelta(seconds=4).total_seconds(), abs=0.1,
  31. )
  32. assert not schedule_kwargs
  33. @pytest.mark.parametrize(
  34. ("topic_suffix", "expected_action_arg"), [("poweroff", "poweroff")]
  35. )
  36. def test_mqtt_topic_suffix_action_mapping(topic_suffix, expected_action_arg):
  37. action = systemctl_mqtt._MQTT_TOPIC_SUFFIX_ACTION_MAPPING[topic_suffix]
  38. login_manager_mock = unittest.mock.MagicMock()
  39. with unittest.mock.patch(
  40. "systemctl_mqtt._get_login_manager", return_value=login_manager_mock
  41. ):
  42. action()
  43. login_manager_mock.ScheduleShutdown.assert_called_once()
  44. schedule_args, schedule_kwargs = login_manager_mock.ScheduleShutdown.call_args
  45. assert len(schedule_args) == 2
  46. assert schedule_args[0] == expected_action_arg
  47. assert not schedule_kwargs