From 853fab0a680075b1339d870c3e00239c4c292c9f Mon Sep 17 00:00:00 2001
From: Erik Montnemery <erik@montnemery.com>
Date: Wed, 24 Aug 2022 10:48:23 +0200
Subject: [PATCH] Mock MQTT setup in hassio tests (#77245)

* Mock MQTT setup in hassio tests

* Tweak
---
 tests/components/hassio/test_discovery.py | 127 ++++++++++++----------
 1 file changed, 71 insertions(+), 56 deletions(-)

diff --git a/tests/components/hassio/test_discovery.py b/tests/components/hassio/test_discovery.py
index 30013c34f21..655cc4b23b5 100644
--- a/tests/components/hassio/test_discovery.py
+++ b/tests/components/hassio/test_discovery.py
@@ -1,14 +1,38 @@
 """Test config flow."""
 from http import HTTPStatus
-from unittest.mock import Mock, patch
+from unittest.mock import AsyncMock, Mock, patch
 
+import pytest
+
+from homeassistant import config_entries
 from homeassistant.components.hassio import HassioServiceInfo
 from homeassistant.components.hassio.handler import HassioAPIError
+from homeassistant.components.mqtt import DOMAIN as MQTT_DOMAIN
 from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STARTED
 from homeassistant.setup import async_setup_component
 
+from tests.common import MockModule, mock_entity_platform, mock_integration
+
+
+@pytest.fixture
+async def mock_mqtt(hass):
+    """Mock the MQTT integration's config flow."""
+    mock_integration(hass, MockModule(MQTT_DOMAIN))
+    mock_entity_platform(hass, f"config_flow.{MQTT_DOMAIN}", None)
+
+    with patch.dict(config_entries.HANDLERS):
+
+        class MqttFlow(config_entries.ConfigFlow, domain=MQTT_DOMAIN):
+            """Test flow."""
+
+            VERSION = 1
 
-async def test_hassio_discovery_startup(hass, aioclient_mock, hassio_client):
+            async_step_hassio = AsyncMock(return_value={"type": "abort"})
+
+        yield MqttFlow
+
+
+async def test_hassio_discovery_startup(hass, aioclient_mock, hassio_client, mock_mqtt):
     """Test startup and discovery after event."""
     aioclient_mock.get(
         "http://127.0.0.1/discovery",
@@ -39,31 +63,29 @@ async def test_hassio_discovery_startup(hass, aioclient_mock, hassio_client):
 
     assert aioclient_mock.call_count == 0
 
-    with patch(
-        "homeassistant.components.mqtt.config_flow.FlowHandler.async_step_hassio",
-        return_value={"type": "abort"},
-    ) as mock_mqtt:
-        hass.bus.async_fire(EVENT_HOMEASSISTANT_START)
-        await hass.async_block_till_done()
-        hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED)
-        await hass.async_block_till_done()
-        assert aioclient_mock.call_count == 2
-        assert mock_mqtt.called
-        mock_mqtt.assert_called_with(
-            HassioServiceInfo(
-                config={
-                    "broker": "mock-broker",
-                    "port": 1883,
-                    "username": "mock-user",
-                    "password": "mock-pass",
-                    "protocol": "3.1.1",
-                    "addon": "Mosquitto Test",
-                }
-            )
+    hass.bus.async_fire(EVENT_HOMEASSISTANT_START)
+    await hass.async_block_till_done()
+    hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED)
+    await hass.async_block_till_done()
+    assert aioclient_mock.call_count == 2
+    assert mock_mqtt.async_step_hassio.called
+    mock_mqtt.async_step_hassio.assert_called_with(
+        HassioServiceInfo(
+            config={
+                "broker": "mock-broker",
+                "port": 1883,
+                "username": "mock-user",
+                "password": "mock-pass",
+                "protocol": "3.1.1",
+                "addon": "Mosquitto Test",
+            }
         )
+    )
 
 
-async def test_hassio_discovery_startup_done(hass, aioclient_mock, hassio_client):
+async def test_hassio_discovery_startup_done(
+    hass, aioclient_mock, hassio_client, mock_mqtt
+):
     """Test startup and discovery with hass discovery."""
     aioclient_mock.post(
         "http://127.0.0.1/supervisor/options",
@@ -102,17 +124,14 @@ async def test_hassio_discovery_startup_done(hass, aioclient_mock, hassio_client
     ), patch(
         "homeassistant.components.hassio.HassIO.get_info",
         Mock(side_effect=HassioAPIError()),
-    ), patch(
-        "homeassistant.components.mqtt.config_flow.FlowHandler.async_step_hassio",
-        return_value={"type": "abort"},
-    ) as mock_mqtt:
+    ):
         await hass.async_start()
         await async_setup_component(hass, "hassio", {})
         await hass.async_block_till_done()
 
         assert aioclient_mock.call_count == 2
-        assert mock_mqtt.called
-        mock_mqtt.assert_called_with(
+        assert mock_mqtt.async_step_hassio.called
+        mock_mqtt.async_step_hassio.assert_called_with(
             HassioServiceInfo(
                 config={
                     "broker": "mock-broker",
@@ -126,7 +145,7 @@ async def test_hassio_discovery_startup_done(hass, aioclient_mock, hassio_client
         )
 
 
-async def test_hassio_discovery_webhook(hass, aioclient_mock, hassio_client):
+async def test_hassio_discovery_webhook(hass, aioclient_mock, hassio_client, mock_mqtt):
     """Test discovery webhook."""
     aioclient_mock.get(
         "http://127.0.0.1/discovery/testuuid",
@@ -151,30 +170,26 @@ async def test_hassio_discovery_webhook(hass, aioclient_mock, hassio_client):
         json={"result": "ok", "data": {"name": "Mosquitto Test"}},
     )
 
-    with patch(
-        "homeassistant.components.mqtt.config_flow.FlowHandler.async_step_hassio",
-        return_value={"type": "abort"},
-    ) as mock_mqtt:
-        resp = await hassio_client.post(
-            "/api/hassio_push/discovery/testuuid",
-            json={"addon": "mosquitto", "service": "mqtt", "uuid": "testuuid"},
-        )
-        await hass.async_block_till_done()
-        hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED)
-        await hass.async_block_till_done()
+    resp = await hassio_client.post(
+        "/api/hassio_push/discovery/testuuid",
+        json={"addon": "mosquitto", "service": "mqtt", "uuid": "testuuid"},
+    )
+    await hass.async_block_till_done()
+    hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED)
+    await hass.async_block_till_done()
 
-        assert resp.status == HTTPStatus.OK
-        assert aioclient_mock.call_count == 2
-        assert mock_mqtt.called
-        mock_mqtt.assert_called_with(
-            HassioServiceInfo(
-                config={
-                    "broker": "mock-broker",
-                    "port": 1883,
-                    "username": "mock-user",
-                    "password": "mock-pass",
-                    "protocol": "3.1.1",
-                    "addon": "Mosquitto Test",
-                }
-            )
+    assert resp.status == HTTPStatus.OK
+    assert aioclient_mock.call_count == 2
+    assert mock_mqtt.async_step_hassio.called
+    mock_mqtt.async_step_hassio.assert_called_with(
+        HassioServiceInfo(
+            config={
+                "broker": "mock-broker",
+                "port": 1883,
+                "username": "mock-user",
+                "password": "mock-pass",
+                "protocol": "3.1.1",
+                "addon": "Mosquitto Test",
+            }
         )
+    )
-- 
GitLab