Browse Source

refactor: move `systemctl_mqtt._dbus` to `systemctl_mqtt._dbus.login_manager`

Fabian Peter Hammerle 3 months ago
parent
commit
7b19828678

+ 8 - 6
systemctl_mqtt/__init__.py

@@ -35,7 +35,7 @@ import jeepney
 import jeepney.bus_messages
 import jeepney.io.asyncio
 
-import systemctl_mqtt._dbus
+import systemctl_mqtt._dbus.login_manager
 import systemctl_mqtt._homeassistant
 import systemctl_mqtt._mqtt
 
@@ -65,7 +65,9 @@ class _State:
         self._mqtt_topic_prefix = mqtt_topic_prefix
         self._homeassistant_discovery_prefix = homeassistant_discovery_prefix
         self._homeassistant_discovery_object_id = homeassistant_discovery_object_id
-        self._login_manager = systemctl_mqtt._dbus.get_login_manager_proxy()
+        self._login_manager = (
+            systemctl_mqtt._dbus.login_manager.get_login_manager_proxy()
+        )
         self._shutdown_lock: typing.Optional[jeepney.fds.FileDescriptor] = None
         self._shutdown_lock_mutex = threading.Lock()
         self.poweroff_delay = poweroff_delay
@@ -218,7 +220,7 @@ class _MQTTActionSchedulePoweroff(_MQTTAction):
     # pylint: disable=too-few-public-methods
     def trigger(self, state: _State) -> None:
         # pylint: disable=protected-access
-        systemctl_mqtt._dbus.schedule_shutdown(
+        systemctl_mqtt._dbus.login_manager.schedule_shutdown(
             action="poweroff", delay=state.poweroff_delay
         )
 
@@ -227,14 +229,14 @@ class _MQTTActionLockAllSessions(_MQTTAction):
     # pylint: disable=too-few-public-methods
     def trigger(self, state: _State) -> None:
         # pylint: disable=protected-access
-        systemctl_mqtt._dbus.lock_all_sessions()
+        systemctl_mqtt._dbus.login_manager.lock_all_sessions()
 
 
 class _MQTTActionSuspend(_MQTTAction):
     # pylint: disable=too-few-public-methods
     def trigger(self, state: _State) -> None:
         # pylint: disable=protected-access
-        systemctl_mqtt._dbus.suspend()
+        systemctl_mqtt._dbus.login_manager.suspend()
 
 
 _MQTT_TOPIC_SUFFIX_ACTION_MAPPING = {
@@ -269,7 +271,7 @@ async def _dbus_signal_loop(*, state: _State, mqtt_client: aiomqtt.Client) -> No
         )
         preparing_for_shutdown_match_rule = (
             # pylint: disable=protected-access
-            systemctl_mqtt._dbus.get_login_manager_signal_match_rule(
+            systemctl_mqtt._dbus.login_manager.get_login_manager_signal_match_rule(
                 "PrepareForShutdown"
             )
         )

+ 0 - 0
systemctl_mqtt/_dbus/__init__.py


+ 0 - 0
systemctl_mqtt/_dbus.py → systemctl_mqtt/_dbus/login_manager.py


+ 3 - 3
tests/dbus/message-generators/test_login_manager.py

@@ -23,7 +23,7 @@ import unittest.mock
 import pytest
 from jeepney.low_level import HeaderFields, Message
 
-import systemctl_mqtt._dbus
+import systemctl_mqtt._dbus.login_manager
 
 # pylint: disable=protected-access
 
@@ -67,7 +67,7 @@ def test_method(
     body: typing.Tuple[typing.Any],
 ) -> None:
     with mock_open_dbus_connection() as dbus_connection_mock:
-        proxy = systemctl_mqtt._dbus.get_login_manager_proxy()
+        proxy = systemctl_mqtt._dbus.login_manager.get_login_manager_proxy()
     getattr(proxy, member)(**kwargs)
     dbus_connection_mock.send_and_get_reply.assert_called_once()
     message: Message = dbus_connection_mock.send_and_get_reply.call_args[0][0]
@@ -85,7 +85,7 @@ def test_method(
 @pytest.mark.parametrize("property_name", ["HandlePowerKey", "Docked"])
 def test_get(property_name: str) -> None:
     with mock_open_dbus_connection() as dbus_connection_mock:
-        proxy = systemctl_mqtt._dbus.get_login_manager_proxy()
+        proxy = systemctl_mqtt._dbus.login_manager.get_login_manager_proxy()
     proxy.Get(property_name=property_name)
     dbus_connection_mock.send_and_get_reply.assert_called_once()
     message: Message = dbus_connection_mock.send_and_get_reply.call_args[0][0]

+ 8 - 5
tests/test_action.py

@@ -14,9 +14,9 @@ import systemctl_mqtt
 def test_poweroff_trigger(delay):
     action = systemctl_mqtt._MQTTActionSchedulePoweroff()
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy"
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy"
     ), unittest.mock.patch(
-        "systemctl_mqtt._dbus.schedule_shutdown"
+        "systemctl_mqtt._dbus.login_manager.schedule_shutdown"
     ) as schedule_shutdown_mock:
         action.trigger(
             state=systemctl_mqtt._State(
@@ -36,7 +36,8 @@ def test_mqtt_topic_suffix_action_mapping_poweroff(topic_suffix, expected_action
     mqtt_action = systemctl_mqtt._MQTT_TOPIC_SUFFIX_ACTION_MAPPING[topic_suffix]
     login_manager_mock = unittest.mock.MagicMock()
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ):
         mqtt_action.trigger(
             state=systemctl_mqtt._State(
@@ -60,7 +61,8 @@ def test_mqtt_topic_suffix_action_mapping_lock():
     mqtt_action = systemctl_mqtt._MQTT_TOPIC_SUFFIX_ACTION_MAPPING["lock-all-sessions"]
     login_manager_mock = unittest.mock.MagicMock()
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ):
         mqtt_action.trigger(state="dummy")
     login_manager_mock.LockSessions.assert_called_once_with()
@@ -70,7 +72,8 @@ def test_mqtt_topic_suffix_action_mapping_suspend():
     mqtt_action = systemctl_mqtt._MQTT_TOPIC_SUFFIX_ACTION_MAPPING["suspend"]
     login_manager_mock = unittest.mock.MagicMock()
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ):
         mqtt_action.trigger(state="dummy")
     login_manager_mock.Suspend.assert_called_once_with(interactive=False)

+ 17 - 13
tests/test_dbus.py

@@ -26,13 +26,13 @@ import jeepney.low_level
 import jeepney.wrappers
 import pytest
 
-import systemctl_mqtt._dbus
+import systemctl_mqtt._dbus.login_manager
 
 # pylint: disable=protected-access
 
 
 def test_get_login_manager_proxy():
-    login_manager = systemctl_mqtt._dbus.get_login_manager_proxy()
+    login_manager = systemctl_mqtt._dbus.login_manager.get_login_manager_proxy()
     assert isinstance(login_manager, jeepney.io.blocking.Proxy)
     assert login_manager._msggen.interface == "org.freedesktop.login1.Manager"
     # https://freedesktop.org/wiki/Software/systemd/logind/
@@ -55,7 +55,7 @@ def test__log_shutdown_inhibitors_some(caplog):
         ],
     )
     with caplog.at_level(logging.DEBUG):
-        systemctl_mqtt._dbus._log_shutdown_inhibitors(login_manager)
+        systemctl_mqtt._dbus.login_manager._log_shutdown_inhibitors(login_manager)
     assert len(caplog.records) == 2
     assert caplog.records[0].levelno == logging.DEBUG
     assert (
@@ -69,7 +69,7 @@ def test__log_shutdown_inhibitors_none(caplog):
     login_manager = unittest.mock.MagicMock()
     login_manager.ListInhibitors.return_value = ([],)
     with caplog.at_level(logging.DEBUG):
-        systemctl_mqtt._dbus._log_shutdown_inhibitors(login_manager)
+        systemctl_mqtt._dbus.login_manager._log_shutdown_inhibitors(login_manager)
     assert len(caplog.records) == 1
     assert caplog.records[0].levelno == logging.DEBUG
     assert caplog.records[0].message == "no shutdown inhibitor locks found"
@@ -79,7 +79,7 @@ def test__log_shutdown_inhibitors_fail(caplog):
     login_manager = unittest.mock.MagicMock()
     login_manager.ListInhibitors.side_effect = DBusErrorResponseMock("error", "mocked")
     with caplog.at_level(logging.DEBUG):
-        systemctl_mqtt._dbus._log_shutdown_inhibitors(login_manager)
+        systemctl_mqtt._dbus.login_manager._log_shutdown_inhibitors(login_manager)
     assert len(caplog.records) == 1
     assert caplog.records[0].levelno == logging.WARNING
     assert (
@@ -93,10 +93,11 @@ def test__log_shutdown_inhibitors_fail(caplog):
 def test__schedule_shutdown(action, delay):
     login_manager_mock = unittest.mock.MagicMock()
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ):
         login_manager_mock.ListInhibitors.return_value = ([],)
-        systemctl_mqtt._dbus.schedule_shutdown(action=action, delay=delay)
+        systemctl_mqtt._dbus.login_manager.schedule_shutdown(action=action, delay=delay)
     login_manager_mock.ScheduleShutdown.assert_called_once()
     schedule_args, schedule_kwargs = login_manager_mock.ScheduleShutdown.call_args
     assert not schedule_args
@@ -139,9 +140,10 @@ def test__schedule_shutdown_fail(
     )
     login_manager_mock.ListInhibitors.return_value = ([],)
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ), caplog.at_level(logging.DEBUG):
-        systemctl_mqtt._dbus.schedule_shutdown(
+        systemctl_mqtt._dbus.login_manager.schedule_shutdown(
             action=action, delay=datetime.timedelta(seconds=21)
         )
     login_manager_mock.ScheduleShutdown.assert_called_once()
@@ -156,9 +158,10 @@ def test__schedule_shutdown_fail(
 def test_suspend(caplog):
     login_manager_mock = unittest.mock.MagicMock()
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ), caplog.at_level(logging.INFO):
-        systemctl_mqtt._dbus.suspend()
+        systemctl_mqtt._dbus.login_manager.suspend()
     login_manager_mock.Suspend.assert_called_once_with(interactive=False)
     assert len(caplog.records) == 1
     assert caplog.records[0].levelno == logging.INFO
@@ -168,9 +171,10 @@ def test_suspend(caplog):
 def test_lock_all_sessions(caplog):
     login_manager_mock = unittest.mock.MagicMock()
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ), caplog.at_level(logging.INFO):
-        systemctl_mqtt._dbus.lock_all_sessions()
+        systemctl_mqtt._dbus.login_manager.lock_all_sessions()
     login_manager_mock.LockSessions.assert_called_once_with()
     assert len(caplog.records) == 1
     assert caplog.records[0].levelno == logging.INFO

+ 7 - 5
tests/test_mqtt.py

@@ -50,7 +50,8 @@ async def test__run(
     with unittest.mock.patch(
         "aiomqtt.Client", autospec=False
     ) as mqtt_client_class_mock, unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ), unittest.mock.patch(
         "systemctl_mqtt._dbus_signal_loop"
     ) as dbus_signal_loop_mock:
@@ -254,7 +255,7 @@ async def test__run_authentication_missing_username(
     mqtt_host: str, mqtt_port: int, mqtt_password: str
 ) -> None:
     with unittest.mock.patch("aiomqtt.Client"), unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy"
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy"
     ), unittest.mock.patch("systemctl_mqtt._dbus_signal_loop") as dbus_signal_loop_mock:
         with pytest.raises(ValueError, match=r"^Missing MQTT username$"):
             await systemctl_mqtt._run(
@@ -277,7 +278,8 @@ async def test__run_sigint(mqtt_topic_prefix: str):
     with unittest.mock.patch(
         "aiomqtt.Client", autospec=False
     ) as mqtt_client_class_mock, unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ), unittest.mock.patch(
         "asyncio.gather", side_effect=KeyboardInterrupt
     ):
@@ -338,7 +340,7 @@ async def test__mqtt_message_loop_trigger_poweroff(
         )
     ]
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.schedule_shutdown"
+        "systemctl_mqtt._dbus.login_manager.schedule_shutdown"
     ) as schedule_shutdown_mock, caplog.at_level(logging.DEBUG):
         await systemctl_mqtt._mqtt_message_loop(
             state=state, mqtt_client=mqtt_client_mock
@@ -385,7 +387,7 @@ async def test__mqtt_message_loop_retained(
         )
     ]
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.schedule_shutdown"
+        "systemctl_mqtt._dbus.login_manager.schedule_shutdown"
     ) as schedule_shutdown_mock, caplog.at_level(logging.DEBUG):
         await systemctl_mqtt._mqtt_message_loop(
             state=state, mqtt_client=mqtt_client_mock

+ 8 - 4
tests/test_state_dbus.py

@@ -33,7 +33,7 @@ import systemctl_mqtt
 def test_shutdown_lock():
     lock_fd = unittest.mock.MagicMock(spec=jeepney.fds.FileDescriptor)
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy"
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy"
     ) as get_login_manager_mock:
         state = systemctl_mqtt._State(
             mqtt_topic_prefix="any",
@@ -58,7 +58,9 @@ def test_shutdown_lock():
 @pytest.mark.asyncio
 @pytest.mark.parametrize("active", [True, False])
 async def test_preparing_for_shutdown_handler(active: bool) -> None:
-    with unittest.mock.patch("systemctl_mqtt._dbus.get_login_manager_proxy"):
+    with unittest.mock.patch(
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy"
+    ):
         state = systemctl_mqtt._State(
             mqtt_topic_prefix="any",
             homeassistant_discovery_prefix="pre/fix",
@@ -91,7 +93,8 @@ async def test_publish_preparing_for_shutdown(active: bool) -> None:
     login_manager_mock = unittest.mock.MagicMock()
     login_manager_mock.Get.return_value = (("b", active),)[:]
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ):
         state = systemctl_mqtt._State(
             mqtt_topic_prefix="any",
@@ -122,7 +125,8 @@ async def test_publish_preparing_for_shutdown_get_fail(caplog):
     login_manager_mock = unittest.mock.MagicMock()
     login_manager_mock.Get.side_effect = DBusErrorResponseMock("error", ("mocked",))
     with unittest.mock.patch(
-        "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
+        "systemctl_mqtt._dbus.login_manager.get_login_manager_proxy",
+        return_value=login_manager_mock,
     ):
         state = systemctl_mqtt._State(
             mqtt_topic_prefix="any",