odoo_mqtt/iot_bridge/tests/unit/test_service_manager.py

87 lines
2.8 KiB
Python

"""Unit tests for ServiceManager initialization and config application."""
from typing import Any, cast
from types import SimpleNamespace
from unittest.mock import Mock
from config.schema import (
BridgeConfig,
DeviceConfig,
DeviceStatusConfig,
EventQueueConfig,
LoggingConfig,
MQTTConfig,
OdooConfig,
SessionConfig,
)
from core.service_manager import ServiceManager
def _build_config(use_mock: bool = True) -> BridgeConfig:
return BridgeConfig(
mqtt=MQTTConfig(broker="localhost", port=1883, client_id="bridge"),
odoo=OdooConfig(
base_url="http://odoo:8069",
database="odoo-db",
username="admin",
api_key="secret",
use_mock=use_mock,
mock_failure_rate=0.1,
),
logging=LoggingConfig(),
event_queue=EventQueueConfig(),
device_status=DeviceStatusConfig(enabled=False),
devices=[
DeviceConfig(
device_id="device-1",
mqtt_topic="shelly/device-1/status",
parser_type="shelly_pm",
machine_name="Machine 1",
session_config=SessionConfig(
strategy="power_threshold",
standby_threshold_w=5,
working_threshold_w=20,
start_debounce_s=3,
stop_debounce_s=15,
message_timeout_s=20,
heartbeat_interval_s=60,
),
)
],
)
def test_initialize_odoo_client_returns_none_without_config():
manager = ServiceManager(config=None, logger=Mock(), bridge_port=8080, bridge_token=None)
client = manager.initialize_odoo_client()
assert client is None
def test_initialize_odoo_client_returns_mock_client_when_enabled():
manager = ServiceManager(config=_build_config(use_mock=True), logger=Mock(), bridge_port=8080, bridge_token=None)
client = manager.initialize_odoo_client()
assert client is not None
assert client.__class__.__name__ == "MockOdooClient"
def test_apply_initial_config_updates_config_server_state_and_device_manager():
manager = ServiceManager(config=_build_config(use_mock=True), logger=Mock(), bridge_port=8080, bridge_token=None)
manager.device_manager = Mock()
manager.config_server = cast(
Any,
SimpleNamespace(current_config=None, device_count=0, subscription_count=0),
)
manager.apply_initial_config()
manager.device_manager.apply_config.assert_called_once()
assert manager.config_server is not None
assert manager.config_server.current_config is not None
assert manager.config_server.current_config.mqtt is not None
assert manager.config_server.device_count == 1
assert manager.config_server.subscription_count == 1