From 866518c5a0877f73bd48620655d8f468309abc9e Mon Sep 17 00:00:00 2001
From: Robert Hillis <tkdrob4390@yahoo.com>
Date: Tue, 28 Mar 2023 10:49:32 -0400
Subject: [PATCH] Add tests to Lidarr (#79610)

* Add tests to Lidarr

* fix js files

* take out the trash

* fix 3.9

* uno mas

* fix fixture

* ruff

* Update const.py

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
---
 .coveragerc                                   |   3 -
 .prettierignore                               |   2 +
 homeassistant/components/lidarr/const.py      |   2 -
 tests/components/lidarr/__init__.py           |  52 -------
 tests/components/lidarr/conftest.py           | 142 ++++++++++++++++++
 .../lidarr/fixtures/initialize-wrong.js       |  12 ++
 .../components/lidarr/fixtures/initialize.js  |  12 ++
 tests/components/lidarr/fixtures/queue.json   |  57 +++++++
 .../lidarr/fixtures/rootfolder-linux.json     |  15 ++
 .../lidarr/fixtures/system-status.json        |   4 +-
 .../lidarr/fixtures/wanted-missing.json       | 134 +++++++++++++++++
 tests/components/lidarr/test_config_flow.py   | 130 ++++++----------
 tests/components/lidarr/test_init.py          |  61 ++++++++
 tests/components/lidarr/test_sensor.py        |  33 ++++
 14 files changed, 518 insertions(+), 141 deletions(-)
 create mode 100644 tests/components/lidarr/conftest.py
 create mode 100644 tests/components/lidarr/fixtures/initialize-wrong.js
 create mode 100644 tests/components/lidarr/fixtures/initialize.js
 create mode 100644 tests/components/lidarr/fixtures/queue.json
 create mode 100644 tests/components/lidarr/fixtures/rootfolder-linux.json
 create mode 100644 tests/components/lidarr/fixtures/wanted-missing.json
 create mode 100644 tests/components/lidarr/test_init.py
 create mode 100644 tests/components/lidarr/test_sensor.py

diff --git a/.coveragerc b/.coveragerc
index 507e0dc8953..82677177e64 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -629,9 +629,6 @@ omit =
     homeassistant/components/lg_netcast/media_player.py
     homeassistant/components/lg_soundbar/__init__.py
     homeassistant/components/lg_soundbar/media_player.py
-    homeassistant/components/lidarr/__init__.py
-    homeassistant/components/lidarr/coordinator.py
-    homeassistant/components/lidarr/sensor.py
     homeassistant/components/life360/__init__.py
     homeassistant/components/life360/coordinator.py
     homeassistant/components/life360/device_tracker.py
diff --git a/.prettierignore b/.prettierignore
index a4d1d99079d..aab23e23078 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -4,3 +4,5 @@ azure-*.yml
 docs/source/_templates/*
 homeassistant/components/*/translations/*.json
 homeassistant/generated/*
+tests/components/lidarr/fixtures/initialize.js
+tests/components/lidarr/fixtures/initialize-wrong.js
diff --git a/homeassistant/components/lidarr/const.py b/homeassistant/components/lidarr/const.py
index feadedb6d49..ccf56db802e 100644
--- a/homeassistant/components/lidarr/const.py
+++ b/homeassistant/components/lidarr/const.py
@@ -17,8 +17,6 @@ BYTE_SIZES = [
 ]
 
 # Defaults
-DEFAULT_DAYS = "1"
-DEFAULT_HOST = "localhost"
 DEFAULT_NAME = "Lidarr"
 DEFAULT_UNIT = UnitOfInformation.GIGABYTES
 DEFAULT_MAX_RECORDS = 20
diff --git a/tests/components/lidarr/__init__.py b/tests/components/lidarr/__init__.py
index 8c1220e4c6c..6c1042e10de 100644
--- a/tests/components/lidarr/__init__.py
+++ b/tests/components/lidarr/__init__.py
@@ -1,53 +1 @@
 """Tests for the Lidarr component."""
-from aiopyarr.lidarr_client import LidarrClient
-
-from homeassistant.components.lidarr.const import DOMAIN
-from homeassistant.const import (
-    CONF_API_KEY,
-    CONF_URL,
-    CONF_VERIFY_SSL,
-    CONTENT_TYPE_JSON,
-)
-from homeassistant.core import HomeAssistant
-from homeassistant.helpers.aiohttp_client import async_get_clientsession
-
-from tests.common import MockConfigEntry, load_fixture
-from tests.test_util.aiohttp import AiohttpClientMocker
-
-BASE_PATH = ""
-API_KEY = "1234567890abcdef1234567890abcdef"
-URL = "http://127.0.0.1:8686"
-client = LidarrClient(session=async_get_clientsession, api_token=API_KEY, url=URL)
-API_URL = f"{URL}/api/{client._host.api_ver}"
-
-MOCK_REAUTH_INPUT = {CONF_API_KEY: "new_key"}
-
-MOCK_USER_INPUT = {
-    CONF_URL: URL,
-    CONF_VERIFY_SSL: False,
-}
-
-CONF_DATA = MOCK_USER_INPUT | {CONF_API_KEY: API_KEY}
-
-
-def mock_connection(
-    aioclient_mock: AiohttpClientMocker,
-    url: str = API_URL,
-) -> None:
-    """Mock lidarr connection."""
-    aioclient_mock.get(
-        f"{url}/system/status",
-        text=load_fixture("lidarr/system-status.json"),
-        headers={"Content-Type": CONTENT_TYPE_JSON},
-    )
-
-
-def create_entry(hass: HomeAssistant) -> MockConfigEntry:
-    """Create Efergy entry in Home Assistant."""
-    entry = MockConfigEntry(
-        domain=DOMAIN,
-        data=CONF_DATA,
-    )
-
-    entry.add_to_hass(hass)
-    return entry
diff --git a/tests/components/lidarr/conftest.py b/tests/components/lidarr/conftest.py
new file mode 100644
index 00000000000..308de36954e
--- /dev/null
+++ b/tests/components/lidarr/conftest.py
@@ -0,0 +1,142 @@
+"""Configure pytest for Lidarr tests."""
+from __future__ import annotations
+
+from collections.abc import Awaitable, Callable, Generator
+from http import HTTPStatus
+
+from aiohttp.client_exceptions import ClientError
+from aiopyarr.lidarr_client import LidarrClient
+import pytest
+
+from homeassistant.components.lidarr.const import DOMAIN
+from homeassistant.const import (
+    CONF_API_KEY,
+    CONF_URL,
+    CONF_VERIFY_SSL,
+    CONTENT_TYPE_JSON,
+)
+from homeassistant.core import HomeAssistant
+from homeassistant.helpers.aiohttp_client import async_get_clientsession
+from homeassistant.setup import async_setup_component
+
+from tests.common import MockConfigEntry, load_fixture
+from tests.test_util.aiohttp import AiohttpClientMocker
+
+URL = "http://127.0.0.1:8668"
+API_KEY = "1234567890abcdef1234567890abcdef"
+client = LidarrClient(session=async_get_clientsession, api_token=API_KEY, url=URL)
+API_URL = f"{URL}/api/{client._host.api_ver}"
+
+MOCK_INPUT = {CONF_URL: URL, CONF_VERIFY_SSL: False}
+
+CONF_DATA = MOCK_INPUT | {CONF_API_KEY: API_KEY}
+
+ComponentSetup = Callable[[], Awaitable[None]]
+
+
+def mock_error(
+    aioclient_mock: AiohttpClientMocker, status: HTTPStatus | None = None
+) -> None:
+    """Mock an error."""
+    if status:
+        aioclient_mock.get(f"{API_URL}/queue", status=status)
+        aioclient_mock.get(f"{API_URL}/rootfolder", status=status)
+        aioclient_mock.get(f"{API_URL}/system/status", status=status)
+        aioclient_mock.get(f"{API_URL}/wanted/missing", status=status)
+    aioclient_mock.get(f"{API_URL}/queue", exc=ClientError)
+    aioclient_mock.get(f"{API_URL}/rootfolder", exc=ClientError)
+    aioclient_mock.get(f"{API_URL}/system/status", exc=ClientError)
+    aioclient_mock.get(f"{API_URL}/wanted/missing", exc=ClientError)
+
+
+@pytest.fixture
+def cannot_connect(aioclient_mock: AiohttpClientMocker) -> None:
+    """Mock cannot connect error."""
+    mock_error(aioclient_mock, status=HTTPStatus.INTERNAL_SERVER_ERROR)
+
+
+@pytest.fixture
+def invalid_auth(aioclient_mock: AiohttpClientMocker) -> None:
+    """Mock invalid authorization error."""
+    mock_error(aioclient_mock, status=HTTPStatus.UNAUTHORIZED)
+
+
+@pytest.fixture
+def wrong_app(aioclient_mock: AiohttpClientMocker) -> None:
+    """Mock Lidarr wrong app."""
+    aioclient_mock.get(
+        f"{URL}/initialize.js",
+        text=load_fixture("lidarr/initialize-wrong.js"),
+        headers={"Content-Type": "application/javascript"},
+    )
+
+
+@pytest.fixture
+def zeroconf_failed(aioclient_mock: AiohttpClientMocker) -> None:
+    """Mock Lidarr zero configuration failure."""
+    aioclient_mock.get(
+        f"{URL}/initialize.js",
+        text="login-failed",
+        headers={"Content-Type": "application/javascript"},
+    )
+
+
+@pytest.fixture
+def unknown(aioclient_mock: AiohttpClientMocker) -> None:
+    """Mock Lidarr unknown error."""
+    aioclient_mock.get(
+        f"{URL}/initialize.js",
+        text="something went wrong",
+        headers={"Content-Type": "application/javascript"},
+    )
+
+
+@pytest.fixture(name="connection")
+def mock_connection(aioclient_mock: AiohttpClientMocker) -> None:
+    """Mock Lidarr connection."""
+    aioclient_mock.get(
+        f"{URL}/initialize.js",
+        text=load_fixture("lidarr/initialize.js"),
+        headers={"Content-Type": "application/javascript"},
+    )
+    aioclient_mock.get(
+        f"{API_URL}/system/status",
+        text=load_fixture("lidarr/system-status.json"),
+        headers={"Content-Type": CONTENT_TYPE_JSON},
+    )
+    aioclient_mock.get(
+        f"{API_URL}/queue",
+        text=load_fixture("lidarr/queue.json"),
+        headers={"Content-Type": CONTENT_TYPE_JSON},
+    )
+    aioclient_mock.get(
+        f"{API_URL}/wanted/missing",
+        text=load_fixture("lidarr/wanted-missing.json"),
+        headers={"Content-Type": CONTENT_TYPE_JSON},
+    )
+    aioclient_mock.get(
+        f"{API_URL}/rootfolder",
+        text=load_fixture("lidarr/rootfolder-linux.json"),
+        headers={"Content-Type": CONTENT_TYPE_JSON},
+    )
+
+
+@pytest.fixture(name="config_entry")
+def mock_config_entry(hass: HomeAssistant) -> MockConfigEntry:
+    """Create Lidarr entry in Home Assistant."""
+    return MockConfigEntry(domain=DOMAIN, data=CONF_DATA)
+
+
+@pytest.fixture(name="setup_integration")
+async def mock_setup_integration(
+    hass: HomeAssistant,
+    config_entry: MockConfigEntry,
+) -> Generator[ComponentSetup, None, None]:
+    """Set up the lidarr integration in Home Assistant."""
+    config_entry.add_to_hass(hass)
+
+    async def func() -> None:
+        assert await async_setup_component(hass, DOMAIN, {})
+        await hass.async_block_till_done()
+
+    return func
diff --git a/tests/components/lidarr/fixtures/initialize-wrong.js b/tests/components/lidarr/fixtures/initialize-wrong.js
new file mode 100644
index 00000000000..9d92f564da8
--- /dev/null
+++ b/tests/components/lidarr/fixtures/initialize-wrong.js
@@ -0,0 +1,12 @@
+window.Radarr = {
+    apiRoot: '/api/v3',
+    apiKey: '1234567890abcdef1234567890abcdef',
+    release: '4.0.3.5849-develop',
+    version: '4.0.3.5849',
+    instanceName: 'Radarr',
+    branch: 'nightly',
+    analytics: true,
+    userHash: 'abcd1234',
+    urlBase: '',
+    isProduction: true
+  };
\ No newline at end of file
diff --git a/tests/components/lidarr/fixtures/initialize.js b/tests/components/lidarr/fixtures/initialize.js
new file mode 100644
index 00000000000..d50aaf9cc64
--- /dev/null
+++ b/tests/components/lidarr/fixtures/initialize.js
@@ -0,0 +1,12 @@
+window.Lidarr = {
+    apiRoot: '/api/v1',
+    apiKey: '1234567890abcdef1234567890abcdef',
+    release: '10.0.0.34882-develop',
+    version: '10.0.0.34882',
+    instanceName: 'Lidarr',
+    branch: 'nightly',
+    analytics: true,
+    userHash: 'abcd1234',
+    urlBase: '',
+    isProduction: true
+  };
\ No newline at end of file
diff --git a/tests/components/lidarr/fixtures/queue.json b/tests/components/lidarr/fixtures/queue.json
new file mode 100644
index 00000000000..24a922b97a5
--- /dev/null
+++ b/tests/components/lidarr/fixtures/queue.json
@@ -0,0 +1,57 @@
+{
+  "page": 1,
+  "pageSize": 20,
+  "sortKey": "timeleft",
+  "sortDirection": "default",
+  "totalRecords": 2,
+  "records": [
+    {
+      "artistId": 1,
+      "albumId": 1,
+      "quality": {
+        "quality": { "id": 0, "name": "Unknown" },
+        "revision": { "version": 1, "real": 0, "isRepack": false }
+      },
+      "size": 1000000,
+      "title": "string",
+      "sizeleft": 100000,
+      "timeleft": "00:00:00",
+      "estimatedCompletionTime": "2020-09-26T18:47:46Z",
+      "status": "downloading",
+      "trackedDownloadStatus": "ok",
+      "trackedDownloadState": "downloading",
+      "statusMessages": [],
+      "downloadId": "string",
+      "protocol": "string",
+      "downloadClient": "testclient",
+      "indexer": "test",
+      "outputPath": "/downloads/string",
+      "downloadForced": false,
+      "id": 1
+    },
+    {
+      "artistId": 1,
+      "albumId": 1,
+      "quality": {
+        "quality": { "id": 0, "name": "Unknown" },
+        "revision": { "version": 1, "real": 0, "isRepack": false }
+      },
+      "size": 2000000,
+      "title": "string2",
+      "sizeleft": 1000000,
+      "timeleft": "00:00:10",
+      "estimatedCompletionTime": "2020-09-26T18:47:46Z",
+      "status": "downloading",
+      "trackedDownloadStatus": "ok",
+      "trackedDownloadState": "downloading",
+      "statusMessages": [],
+      "downloadId": "string",
+      "protocol": "string",
+      "downloadClient": "testclient",
+      "indexer": "test",
+      "outputPath": "/downloads/string",
+      "downloadForced": false,
+      "id": 1
+    }
+  ]
+}
diff --git a/tests/components/lidarr/fixtures/rootfolder-linux.json b/tests/components/lidarr/fixtures/rootfolder-linux.json
new file mode 100644
index 00000000000..070703279b4
--- /dev/null
+++ b/tests/components/lidarr/fixtures/rootfolder-linux.json
@@ -0,0 +1,15 @@
+[
+  {
+    "name": "/music/",
+    "path": "/music/",
+    "defaultMetadataProfileId": 1,
+    "defaultQualityProfileId": 1,
+    "defaultMonitorOption": "all",
+    "defaultNewItemMonitorOption": "all",
+    "defaultTags": [],
+    "accessible": true,
+    "freeSpace": 1000000000,
+    "totalSpace": 100000000000,
+    "id": 2
+  }
+]
diff --git a/tests/components/lidarr/fixtures/system-status.json b/tests/components/lidarr/fixtures/system-status.json
index 6baa9428ff6..bd49c581536 100644
--- a/tests/components/lidarr/fixtures/system-status.json
+++ b/tests/components/lidarr/fixtures/system-status.json
@@ -5,8 +5,8 @@
   "isProduction": false,
   "isAdmin": false,
   "isUserInteractive": true,
-  "startupPath": "C:\\ProgramData\\Radarr",
-  "appData": "C:\\ProgramData\\Radarr",
+  "startupPath": "C:\\ProgramData\\Lidarr",
+  "appData": "C:\\ProgramData\\Lidarr",
   "osName": "Windows",
   "osVersion": "10.0.18363.0",
   "isNetCore": true,
diff --git a/tests/components/lidarr/fixtures/wanted-missing.json b/tests/components/lidarr/fixtures/wanted-missing.json
new file mode 100644
index 00000000000..2b5886b39dd
--- /dev/null
+++ b/tests/components/lidarr/fixtures/wanted-missing.json
@@ -0,0 +1,134 @@
+{
+  "page": 1,
+  "pageSize": 20,
+  "sortKey": "title",
+  "sortDirection": "default",
+  "totalRecords": 1,
+  "records": [
+    {
+      "title": "test",
+      "disambiguation": "string",
+      "overview": "string",
+      "artistId": 0,
+      "foreignAlbumId": "string",
+      "monitored": true,
+      "anyReleaseOk": true,
+      "profileId": 1,
+      "duration": 0,
+      "albumType": "Album",
+      "secondaryTypes": [
+        {
+          "id": 0,
+          "name": "string"
+        }
+      ],
+      "mediumCount": 1,
+      "ratings": {
+        "votes": 0,
+        "value": 0
+      },
+      "releaseDate": "1968-01-01T00:00:00Z",
+      "releases": [
+        {
+          "id": 0,
+          "albumId": 0,
+          "foreignReleaseId": "string",
+          "title": "string",
+          "status": "string",
+          "duration": 0,
+          "trackCount": 1,
+          "media": [
+            {
+              "mediumNumber": 1,
+              "mediumName": "Unknown",
+              "mediumFormat": "Unknown"
+            }
+          ],
+          "mediumCount": 1,
+          "disambiguation": "",
+          "country": ["string"],
+          "label": ["test"],
+          "format": "Unknown",
+          "monitored": true
+        }
+      ],
+      "genres": ["string"],
+      "media": [
+        {
+          "mediumNumber": 1,
+          "mediumName": "Unknown",
+          "mediumFormat": "Unknown"
+        }
+      ],
+      "artist": {
+        "artistMetadataId": 0,
+        "status": "continuing",
+        "ended": false,
+        "artistName": "test",
+        "foreignArtistId": "string",
+        "tadbId": 0,
+        "discogsId": 0,
+        "overview": "string",
+        "artistType": "Group",
+        "disambiguation": "",
+        "links": [
+          {
+            "url": "string",
+            "name": "string"
+          }
+        ],
+        "images": [
+          {
+            "url": "https://test.jpg",
+            "coverType": "fanart",
+            "extension": ".jpg"
+          }
+        ],
+        "path": "string",
+        "qualityProfileId": 1,
+        "metadataProfileId": 1,
+        "monitored": true,
+        "monitorNewItems": "all",
+        "genres": ["string"],
+        "cleanName": "string",
+        "sortName": "string",
+        "tags": [0],
+        "added": "2020-03-18T15:51:22Z",
+        "ratings": {
+          "votes": 0,
+          "value": 0
+        },
+        "statistics": {
+          "albumCount": 0,
+          "trackFileCount": 0,
+          "trackCount": 0,
+          "totalTrackCount": 0,
+          "sizeOnDisk": 0,
+          "percentOfTracks": 0
+        },
+        "id": 0
+      },
+      "images": [
+        {
+          "url": "string",
+          "coverType": "poster"
+        }
+      ],
+      "links": [
+        {
+          "url": "string",
+          "name": "string"
+        }
+      ],
+      "statistics": {
+        "trackFileCount": 0,
+        "trackCount": 1,
+        "totalTrackCount": 1,
+        "sizeOnDisk": 0,
+        "percentOfTracks": 0
+      },
+      "grabbed": false,
+      "id": 1
+    }
+  ]
+}
diff --git a/tests/components/lidarr/test_config_flow.py b/tests/components/lidarr/test_config_flow.py
index b7859324340..d3c4352dc1e 100644
--- a/tests/components/lidarr/test_config_flow.py
+++ b/tests/components/lidarr/test_config_flow.py
@@ -1,138 +1,104 @@
 """Test Lidarr config flow."""
-from unittest.mock import patch
-
-from aiopyarr import exceptions
-
 from homeassistant import data_entry_flow
 from homeassistant.components.lidarr.const import DEFAULT_NAME, DOMAIN
 from homeassistant.config_entries import SOURCE_REAUTH, SOURCE_USER
 from homeassistant.const import CONF_API_KEY, CONF_SOURCE
 from homeassistant.core import HomeAssistant
 
-from . import API_KEY, CONF_DATA, MOCK_USER_INPUT, create_entry, mock_connection
-
-from tests.test_util.aiohttp import AiohttpClientMocker
-
-
-def _patch_client():
-    return patch(
-        "homeassistant.components.lidarr.config_flow.LidarrClient.async_get_system_status"
-    )
+from .conftest import CONF_DATA, MOCK_INPUT, ComponentSetup
 
 
-async def test_flow_user_form(
-    hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
-) -> None:
+async def test_flow_user_form(hass: HomeAssistant, connection) -> None:
     """Test that the user set up form is served."""
-    mock_connection(aioclient_mock)
     result = await hass.config_entries.flow.async_init(
         DOMAIN,
         context={CONF_SOURCE: SOURCE_USER},
     )
-    with patch(
-        "homeassistant.components.lidarr.config_flow.LidarrClient.async_try_zeroconf",
-        return_value=("/api/v3", API_KEY, ""),
-    ):
-        result = await hass.config_entries.flow.async_configure(
-            result["flow_id"],
-            user_input=MOCK_USER_INPUT,
-        )
+
+    assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
+    assert result["step_id"] == "user"
+
+    result = await hass.config_entries.flow.async_configure(
+        result["flow_id"],
+        user_input=MOCK_INPUT,
+    )
     assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
     assert result["title"] == DEFAULT_NAME
     assert result["data"] == CONF_DATA
 
 
-async def test_flow_user_invalid_auth(hass: HomeAssistant) -> None:
+async def test_flow_user_invalid_auth(hass: HomeAssistant, invalid_auth) -> None:
     """Test invalid authentication."""
-    with _patch_client() as client:
-        client.side_effect = exceptions.ArrAuthenticationException
-        result = await hass.config_entries.flow.async_init(
-            DOMAIN,
-            context={CONF_SOURCE: SOURCE_USER},
-        )
-        result = await hass.config_entries.flow.async_configure(
-            result["flow_id"],
-            user_input=CONF_DATA,
-        )
+    result = await hass.config_entries.flow.async_init(
+        DOMAIN,
+        context={CONF_SOURCE: SOURCE_USER},
+        data=CONF_DATA,
+    )
     assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
     assert result["step_id"] == "user"
     assert result["errors"]["base"] == "invalid_auth"
 
 
-async def test_flow_user_cannot_connect(hass: HomeAssistant) -> None:
+async def test_flow_user_cannot_connect(hass: HomeAssistant, cannot_connect) -> None:
     """Test connection error."""
-    with _patch_client() as client:
-        client.side_effect = exceptions.ArrConnectionException
-        result = await hass.config_entries.flow.async_init(
-            DOMAIN,
-            context={CONF_SOURCE: SOURCE_USER},
-        )
-        result = await hass.config_entries.flow.async_configure(
-            result["flow_id"],
-            user_input=CONF_DATA,
-        )
+    result = await hass.config_entries.flow.async_init(
+        DOMAIN,
+        context={CONF_SOURCE: SOURCE_USER},
+        data=CONF_DATA,
+    )
+
     assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
     assert result["step_id"] == "user"
     assert result["errors"]["base"] == "cannot_connect"
 
 
-async def test_wrong_app(hass: HomeAssistant) -> None:
+async def test_wrong_app(hass: HomeAssistant, wrong_app) -> None:
     """Test we show user form on wrong app."""
-    with patch(
-        "homeassistant.components.lidarr.config_flow.LidarrClient.async_try_zeroconf",
-        side_effect=exceptions.ArrWrongAppException,
-    ):
-        result = await hass.config_entries.flow.async_init(
-            DOMAIN,
-            context={CONF_SOURCE: SOURCE_USER},
-            data=MOCK_USER_INPUT,
-        )
+    result = await hass.config_entries.flow.async_init(
+        DOMAIN,
+        context={CONF_SOURCE: SOURCE_USER},
+        data=MOCK_INPUT,
+    )
 
     assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
     assert result["step_id"] == "user"
     assert result["errors"]["base"] == "wrong_app"
 
 
-async def test_zero_conf_failure(hass: HomeAssistant) -> None:
-    """Test we show user form on api key retrieval failure."""
-    with patch(
-        "homeassistant.components.lidarr.config_flow.LidarrClient.async_try_zeroconf",
-        side_effect=exceptions.ArrZeroConfException,
-    ):
-        result = await hass.config_entries.flow.async_init(
-            DOMAIN,
-            context={CONF_SOURCE: SOURCE_USER},
-            data=MOCK_USER_INPUT,
-        )
+async def test_zeroconf_failed(hass: HomeAssistant, zeroconf_failed) -> None:
+    """Test we show user form on zeroconf failure."""
+    result = await hass.config_entries.flow.async_init(
+        DOMAIN,
+        context={CONF_SOURCE: SOURCE_USER},
+        data=MOCK_INPUT,
+    )
 
     assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
     assert result["step_id"] == "user"
     assert result["errors"]["base"] == "zeroconf_failed"
 
 
-async def test_flow_user_unknown_error(hass: HomeAssistant) -> None:
+async def test_flow_user_unknown_error(hass: HomeAssistant, unknown) -> None:
     """Test unknown error."""
-    with _patch_client() as client:
-        client.side_effect = exceptions.ArrException
-        result = await hass.config_entries.flow.async_init(
-            DOMAIN,
-            context={CONF_SOURCE: SOURCE_USER},
-        )
-        result = await hass.config_entries.flow.async_configure(
-            result["flow_id"],
-            user_input=CONF_DATA,
-        )
+    result = await hass.config_entries.flow.async_init(
+        DOMAIN,
+        context={CONF_SOURCE: SOURCE_USER},
+    )
+    result = await hass.config_entries.flow.async_configure(
+        result["flow_id"],
+        user_input=CONF_DATA,
+    )
     assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
     assert result["step_id"] == "user"
     assert result["errors"]["base"] == "unknown"
 
 
 async def test_flow_reauth(
-    hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
+    hass: HomeAssistant, setup_integration: ComponentSetup, connection
 ) -> None:
     """Test reauth."""
-    entry = create_entry(hass)
-    mock_connection(aioclient_mock)
+    await setup_integration()
+    entry = hass.config_entries.async_entries(DOMAIN)[0]
     result = await hass.config_entries.flow.async_init(
         DOMAIN,
         context={
diff --git a/tests/components/lidarr/test_init.py b/tests/components/lidarr/test_init.py
new file mode 100644
index 00000000000..2a217bebd5f
--- /dev/null
+++ b/tests/components/lidarr/test_init.py
@@ -0,0 +1,61 @@
+"""Test Lidarr integration."""
+from homeassistant.components.lidarr.const import DEFAULT_NAME, DOMAIN
+from homeassistant.config_entries import ConfigEntryState
+from homeassistant.core import HomeAssistant
+from homeassistant.helpers import device_registry as dr
+
+from .conftest import ComponentSetup
+
+
+async def test_setup(
+    hass: HomeAssistant, setup_integration: ComponentSetup, connection
+) -> None:
+    """Test setup."""
+    await setup_integration()
+    entry = hass.config_entries.async_entries(DOMAIN)[0]
+    assert entry.state == ConfigEntryState.LOADED
+
+    assert await hass.config_entries.async_unload(entry.entry_id)
+    await hass.async_block_till_done()
+
+    assert entry.state is ConfigEntryState.NOT_LOADED
+    assert not hass.data.get(DOMAIN)
+
+
+async def test_async_setup_entry_not_ready(
+    hass: HomeAssistant, setup_integration: ComponentSetup, cannot_connect
+) -> None:
+    """Test that it throws ConfigEntryNotReady when exception occurs during setup."""
+    await setup_integration()
+    entry = hass.config_entries.async_entries(DOMAIN)[0]
+    assert len(hass.config_entries.async_entries(DOMAIN)) == 1
+    assert entry.state == ConfigEntryState.SETUP_RETRY
+    assert not hass.data.get(DOMAIN)
+
+
+async def test_async_setup_entry_auth_failed(
+    hass: HomeAssistant, setup_integration: ComponentSetup, invalid_auth
+) -> None:
+    """Test that it throws ConfigEntryAuthFailed when authentication fails."""
+    await setup_integration()
+    entry = hass.config_entries.async_entries(DOMAIN)[0]
+    assert len(hass.config_entries.async_entries(DOMAIN)) == 1
+    assert entry.state == ConfigEntryState.SETUP_ERROR
+    assert not hass.data.get(DOMAIN)
+
+
+async def test_device_info(
+    hass: HomeAssistant, setup_integration: ComponentSetup, connection
+) -> None:
+    """Test device info."""
+    await setup_integration()
+    entry = hass.config_entries.async_entries(DOMAIN)[0]
+    device_registry = dr.async_get(hass)
+    await hass.async_block_till_done()
+    device = device_registry.async_get_device({(DOMAIN, entry.entry_id)})
+
+    assert device.configuration_url == "http://127.0.0.1:8668"
+    assert device.identifiers == {(DOMAIN, entry.entry_id)}
+    assert device.manufacturer == DEFAULT_NAME
+    assert device.name == "Mock Title"
+    assert device.sw_version == "10.0.0.34882"
diff --git a/tests/components/lidarr/test_sensor.py b/tests/components/lidarr/test_sensor.py
new file mode 100644
index 00000000000..7fe347f4619
--- /dev/null
+++ b/tests/components/lidarr/test_sensor.py
@@ -0,0 +1,33 @@
+"""The tests for Lidarr sensor platform."""
+from unittest.mock import AsyncMock
+
+from homeassistant.components.sensor import CONF_STATE_CLASS, SensorStateClass
+from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT
+from homeassistant.core import HomeAssistant
+
+from .conftest import ComponentSetup
+
+
+async def test_sensors(
+    hass: HomeAssistant,
+    setup_integration: ComponentSetup,
+    entity_registry_enabled_by_default: AsyncMock,
+    connection,
+):
+    """Test for successfully setting up the Lidarr platform."""
+    await setup_integration()
+
+    state = hass.states.get("sensor.mock_title_disk_space")
+    assert state.state == "0.93"
+    assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "GB"
+    state = hass.states.get("sensor.mock_title_queue")
+    assert state.state == "2"
+    assert state.attributes.get("string") == "stopped"
+    assert state.attributes.get("string2") == "downloading"
+    assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "Albums"
+    assert state.attributes.get(CONF_STATE_CLASS) == SensorStateClass.TOTAL
+    state = hass.states.get("sensor.mock_title_wanted")
+    assert state.state == "1"
+    assert state.attributes.get("test") == "test"
+    assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "Albums"
+    assert state.attributes.get(CONF_STATE_CLASS) == SensorStateClass.TOTAL
-- 
GitLab