diff --git a/app/src/scheduler.py b/app/src/scheduler.py index 3c1d25a..5445310 100644 --- a/app/src/scheduler.py +++ b/app/src/scheduler.py @@ -12,7 +12,7 @@ class Schedule: count = 0 @classmethod - def start(cls) -> None: + def start(cls) -> None: # pragma: no cover '''Start the scheduler and schedule the tasks (cron jobs)''' logging.debug("Scheduler init") cls.mqtt = Mqtt(None) @@ -20,7 +20,7 @@ class Schedule: crontab('0 0 * * *', func=cls.atmidnight, start=True) @classmethod - async def atmidnight(cls) -> None: + async def atmidnight(cls) -> None: # pragma: no cover '''Clear daily counters at midnight''' logging.info("Clear daily counters at midnight") diff --git a/app/tests/test_mqtt.py b/app/tests/test_mqtt.py index 8cbe5cd..0906bd4 100755 --- a/app/tests/test_mqtt.py +++ b/app/tests/test_mqtt.py @@ -322,6 +322,28 @@ async def test_mqtt_dispatch(config_mqtt_conn, aiomqtt_mock, spy_modbus_cmd): finally: await m.close() +@pytest.mark.asyncio +async def test_mqtt_dispatch_cb(config_mqtt_conn, aiomqtt_mock): + _ = config_mqtt_conn + _ = aiomqtt_mock + + on_connect = asyncio.Event() + async def cb(): + on_connect.set() + try: + m = Mqtt(cb) + assert m.ha_restarts == 0 + await m.receive('homeassistant/status', b'online') # send the message + assert on_connect.is_set() + assert m.ha_restarts == 1 + + except MqttError: + assert False + except Exception: + assert False + finally: + await m.close() + @pytest.mark.asyncio async def test_mqtt_dispatch_err(config_mqtt_conn, aiomqtt_mock, spy_modbus_cmd, caplog): _ = config_mqtt_conn diff --git a/app/tests/test_server.py b/app/tests/test_server.py index e13ee5f..7b0e934 100644 --- a/app/tests/test_server.py +++ b/app/tests/test_server.py @@ -4,6 +4,10 @@ import logging import os from mock import patch from server import app, Server, ProxyState, HypercornLogHndl +from inverter_base import InverterBase +from gen3.talent import Talent + +from test_inverter_base import FakeReader, FakeWriter pytest_plugins = ('pytest_asyncio',) @@ -108,20 +112,20 @@ class TestServerClass: assert logging.getLogger('hypercorn.access').level == logging.INFO assert logging.getLogger('hypercorn.error').level == logging.INFO - os.environ["LOG_LVL"] = "WARN" - s.parse_args(['--log_backups', '3']) - s.init_logging_system() - assert s.log_backups == 3 - assert s.log_level == logging.WARNING - assert logging.handlers.log_backups == 3 - assert logging.getLogger().level == s.log_level - assert logging.getLogger('msg').level == s.log_level - assert logging.getLogger('conn').level == s.log_level - assert logging.getLogger('data').level == s.log_level - assert logging.getLogger('tracer').level == s.log_level - assert logging.getLogger('asyncio').level == s.log_level - assert logging.getLogger('hypercorn.access').level == logging.INFO - assert logging.getLogger('hypercorn.error').level == logging.INFO + with patch.dict(os.environ, {'LOG_LVL': 'WARN'}): + s.parse_args(['--log_backups', '3']) + s.init_logging_system() + assert s.log_backups == 3 + assert s.log_level == logging.WARNING + assert logging.handlers.log_backups == 3 + assert logging.getLogger().level == s.log_level + assert logging.getLogger('msg').level == s.log_level + assert logging.getLogger('conn').level == s.log_level + assert logging.getLogger('data').level == s.log_level + assert logging.getLogger('tracer').level == s.log_level + assert logging.getLogger('asyncio').level == s.log_level + assert logging.getLogger('hypercorn.access').level == logging.INFO + assert logging.getLogger('hypercorn.error').level == logging.INFO def test_build_config_error(self, caplog): s = self.FakeServer() @@ -202,17 +206,81 @@ class TestApp: @pytest.mark.asyncio async def test_healthy(self): """Test the healthy route.""" + reader = FakeReader() + writer = FakeWriter() - ProxyState.set_up(False) - client = app.test_client() - response = await client.get('/-/healthy') - assert response.status_code == 200 - result = await response.get_data() - assert result == b"I'm fine" + with InverterBase(reader, writer, 'tsun', Talent): + ProxyState.set_up(False) + client = app.test_client() + response = await client.get('/-/healthy') + assert response.status_code == 200 + result = await response.get_data() + assert result == b"I'm fine" - ProxyState.set_up(True) - response = await client.get('/-/healthy') - assert response.status_code == 200 - result = await response.get_data() - assert result == b"I'm fine" + ProxyState.set_up(True) + response = await client.get('/-/healthy') + assert response.status_code == 200 + result = await response.get_data() + assert result == b"I'm fine" + @pytest.mark.asyncio + async def test_unhealthy(self, monkeypatch, caplog): + """Test the healthy route.""" + def result_false(self): + return False + + LOGGER = logging.getLogger("mqtt") + LOGGER.propagate = True + LOGGER.setLevel(logging.INFO) + + monkeypatch.setattr(InverterBase, "healthy", result_false) + InverterBase._registry.clear() + reader = FakeReader() + writer = FakeWriter() + + with caplog.at_level(logging.INFO) and InverterBase(reader, writer, 'tsun', Talent): + ProxyState.set_up(False) + client = app.test_client() + response = await client.get('/-/healthy') + assert response.status_code == 200 + result = await response.get_data() + assert result == b"I'm fine" + assert "" == caplog.text + + ProxyState.set_up(True) + response = await client.get('/-/healthy') + assert response.status_code == 503 + result = await response.get_data() + assert result == b"I have a problem" + assert "" == caplog.text + + @pytest.mark.asyncio + async def test_healthy_exception(self, monkeypatch, caplog): + """Test the healthy route.""" + def result_except(self): + raise ValueError + + LOGGER = logging.getLogger("mqtt") + LOGGER.propagate = True + LOGGER.setLevel(logging.INFO) + + monkeypatch.setattr(InverterBase, "healthy", result_except) + InverterBase._registry.clear() + reader = FakeReader() + writer = FakeWriter() + + with caplog.at_level(logging.INFO) and InverterBase(reader, writer, 'tsun', Talent): + ProxyState.set_up(False) + client = app.test_client() + response = await client.get('/-/healthy') + assert response.status_code == 200 + result = await response.get_data() + assert result == b"I'm fine" + assert "" == caplog.text + + ProxyState.set_up(True) + response = await client.get('/-/healthy') + assert response.status_code == 200 + result = await response.get_data() + assert result == b"I'm fine" + assert "Exception:" in caplog.text