Allow multiple Transmission clients and add unique_id to entities (#28136)
* Allow multiple clients + improvements * remove commented code * fixed test_init.py
This commit is contained in:
parent
062ec8a7c2
commit
7cb6607b1f
10 changed files with 333 additions and 183 deletions
|
@ -1,4 +1,4 @@
|
|||
"""Tests for Met.no config flow."""
|
||||
"""Tests for Transmission config flow."""
|
||||
from datetime import timedelta
|
||||
from unittest.mock import patch
|
||||
|
||||
|
@ -31,6 +31,14 @@ PASSWORD = "password"
|
|||
PORT = 9091
|
||||
SCAN_INTERVAL = 10
|
||||
|
||||
MOCK_ENTRY = {
|
||||
CONF_NAME: NAME,
|
||||
CONF_HOST: HOST,
|
||||
CONF_USERNAME: USERNAME,
|
||||
CONF_PASSWORD: PASSWORD,
|
||||
CONF_PORT: PORT,
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture(name="api")
|
||||
def mock_transmission_api():
|
||||
|
@ -90,18 +98,10 @@ async def test_flow_works(hass, api):
|
|||
assert result["data"][CONF_NAME] == NAME
|
||||
assert result["data"][CONF_HOST] == HOST
|
||||
assert result["data"][CONF_PORT] == PORT
|
||||
assert result["data"]["options"][CONF_SCAN_INTERVAL] == DEFAULT_SCAN_INTERVAL
|
||||
# assert result["data"]["options"][CONF_SCAN_INTERVAL] == DEFAULT_SCAN_INTERVAL
|
||||
|
||||
# test with all provided
|
||||
result = await flow.async_step_user(
|
||||
{
|
||||
CONF_NAME: NAME,
|
||||
CONF_HOST: HOST,
|
||||
CONF_USERNAME: USERNAME,
|
||||
CONF_PASSWORD: PASSWORD,
|
||||
CONF_PORT: PORT,
|
||||
}
|
||||
)
|
||||
result = await flow.async_step_user(MOCK_ENTRY)
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert result["title"] == NAME
|
||||
|
@ -110,7 +110,7 @@ async def test_flow_works(hass, api):
|
|||
assert result["data"][CONF_USERNAME] == USERNAME
|
||||
assert result["data"][CONF_PASSWORD] == PASSWORD
|
||||
assert result["data"][CONF_PORT] == PORT
|
||||
assert result["data"]["options"][CONF_SCAN_INTERVAL] == DEFAULT_SCAN_INTERVAL
|
||||
# assert result["data"]["options"][CONF_SCAN_INTERVAL] == DEFAULT_SCAN_INTERVAL
|
||||
|
||||
|
||||
async def test_options(hass):
|
||||
|
@ -118,14 +118,7 @@ async def test_options(hass):
|
|||
entry = MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
title=CONF_NAME,
|
||||
data={
|
||||
"name": DEFAULT_NAME,
|
||||
"host": HOST,
|
||||
"username": USERNAME,
|
||||
"password": PASSWORD,
|
||||
"port": DEFAULT_PORT,
|
||||
"options": {CONF_SCAN_INTERVAL: DEFAULT_SCAN_INTERVAL},
|
||||
},
|
||||
data=MOCK_ENTRY,
|
||||
options={CONF_SCAN_INTERVAL: DEFAULT_SCAN_INTERVAL},
|
||||
)
|
||||
flow = init_config_flow(hass)
|
||||
|
@ -157,7 +150,7 @@ async def test_import(hass, api):
|
|||
assert result["data"][CONF_NAME] == DEFAULT_NAME
|
||||
assert result["data"][CONF_HOST] == HOST
|
||||
assert result["data"][CONF_PORT] == DEFAULT_PORT
|
||||
assert result["data"]["options"][CONF_SCAN_INTERVAL] == DEFAULT_SCAN_INTERVAL
|
||||
assert result["data"][CONF_SCAN_INTERVAL] == DEFAULT_SCAN_INTERVAL
|
||||
|
||||
# import with all
|
||||
result = await flow.async_step_import(
|
||||
|
@ -177,18 +170,40 @@ async def test_import(hass, api):
|
|||
assert result["data"][CONF_USERNAME] == USERNAME
|
||||
assert result["data"][CONF_PASSWORD] == PASSWORD
|
||||
assert result["data"][CONF_PORT] == PORT
|
||||
assert result["data"]["options"][CONF_SCAN_INTERVAL] == SCAN_INTERVAL
|
||||
assert result["data"][CONF_SCAN_INTERVAL] == SCAN_INTERVAL
|
||||
|
||||
|
||||
async def test_integration_already_exists(hass, api):
|
||||
"""Test we only allow a single config flow."""
|
||||
MockConfigEntry(domain=DOMAIN).add_to_hass(hass)
|
||||
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": "user"}
|
||||
async def test_host_already_configured(hass, api):
|
||||
"""Test host is already configured."""
|
||||
entry = MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
data=MOCK_ENTRY,
|
||||
options={CONF_SCAN_INTERVAL: DEFAULT_SCAN_INTERVAL},
|
||||
)
|
||||
entry.add_to_hass(hass)
|
||||
flow = init_config_flow(hass)
|
||||
result = await flow.async_step_user(MOCK_ENTRY)
|
||||
|
||||
assert result["type"] == "abort"
|
||||
assert result["reason"] == "one_instance_allowed"
|
||||
assert result["reason"] == "already_configured"
|
||||
|
||||
|
||||
async def test_name_already_configured(hass, api):
|
||||
"""Test name is already configured."""
|
||||
entry = MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
data=MOCK_ENTRY,
|
||||
options={CONF_SCAN_INTERVAL: DEFAULT_SCAN_INTERVAL},
|
||||
)
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
mock_entry = MOCK_ENTRY.copy()
|
||||
mock_entry[CONF_HOST] = "0.0.0.0"
|
||||
flow = init_config_flow(hass)
|
||||
result = await flow.async_step_user(mock_entry)
|
||||
|
||||
assert result["type"] == "form"
|
||||
assert result["errors"] == {CONF_NAME: "name_exists"}
|
||||
|
||||
|
||||
async def test_error_on_wrong_credentials(hass, auth_error):
|
||||
|
|
123
tests/components/transmission/test_init.py
Normal file
123
tests/components/transmission/test_init.py
Normal file
|
@ -0,0 +1,123 @@
|
|||
"""Tests for Transmission init."""
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
from transmissionrpc.error import TransmissionError
|
||||
|
||||
from homeassistant.components import transmission
|
||||
from homeassistant.exceptions import ConfigEntryNotReady
|
||||
from homeassistant.setup import async_setup_component
|
||||
|
||||
from tests.common import MockConfigEntry, mock_coro
|
||||
|
||||
MOCK_ENTRY = MockConfigEntry(
|
||||
domain=transmission.DOMAIN,
|
||||
data={
|
||||
transmission.CONF_NAME: "Transmission",
|
||||
transmission.CONF_HOST: "0.0.0.0",
|
||||
transmission.CONF_USERNAME: "user",
|
||||
transmission.CONF_PASSWORD: "pass",
|
||||
transmission.CONF_PORT: 9091,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture(name="api")
|
||||
def mock_transmission_api():
|
||||
"""Mock an api."""
|
||||
with patch("transmissionrpc.Client"):
|
||||
yield
|
||||
|
||||
|
||||
@pytest.fixture(name="auth_error")
|
||||
def mock_api_authentication_error():
|
||||
"""Mock an api."""
|
||||
with patch(
|
||||
"transmissionrpc.Client", side_effect=TransmissionError("401: Unauthorized")
|
||||
):
|
||||
yield
|
||||
|
||||
|
||||
@pytest.fixture(name="unknown_error")
|
||||
def mock_api_unknown_error():
|
||||
"""Mock an api."""
|
||||
with patch("transmissionrpc.Client", side_effect=TransmissionError):
|
||||
yield
|
||||
|
||||
|
||||
async def test_setup_with_no_config(hass):
|
||||
"""Test that we do not discover anything or try to set up a Transmission client."""
|
||||
assert await async_setup_component(hass, transmission.DOMAIN, {}) is True
|
||||
assert transmission.DOMAIN not in hass.data
|
||||
|
||||
|
||||
async def test_setup_with_config(hass, api):
|
||||
"""Test that we import the config and setup the client."""
|
||||
config = {
|
||||
transmission.DOMAIN: {
|
||||
transmission.CONF_NAME: "Transmission",
|
||||
transmission.CONF_HOST: "0.0.0.0",
|
||||
transmission.CONF_USERNAME: "user",
|
||||
transmission.CONF_PASSWORD: "pass",
|
||||
transmission.CONF_PORT: 9091,
|
||||
},
|
||||
transmission.DOMAIN: {
|
||||
transmission.CONF_NAME: "Transmission2",
|
||||
transmission.CONF_HOST: "0.0.0.1",
|
||||
transmission.CONF_USERNAME: "user",
|
||||
transmission.CONF_PASSWORD: "pass",
|
||||
transmission.CONF_PORT: 9091,
|
||||
},
|
||||
}
|
||||
assert await async_setup_component(hass, transmission.DOMAIN, config) is True
|
||||
|
||||
|
||||
async def test_successful_config_entry(hass, api):
|
||||
"""Test that configured transmission is configured successfully."""
|
||||
|
||||
entry = MOCK_ENTRY
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
assert await transmission.async_setup_entry(hass, entry) is True
|
||||
assert entry.options == {
|
||||
transmission.CONF_SCAN_INTERVAL: transmission.DEFAULT_SCAN_INTERVAL
|
||||
}
|
||||
|
||||
|
||||
async def test_setup_failed(hass):
|
||||
"""Test transmission failed due to an error."""
|
||||
|
||||
entry = MOCK_ENTRY
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
# test connection error raising ConfigEntryNotReady
|
||||
with patch(
|
||||
"transmissionrpc.Client",
|
||||
side_effect=TransmissionError("111: Connection refused"),
|
||||
), pytest.raises(ConfigEntryNotReady):
|
||||
|
||||
await transmission.async_setup_entry(hass, entry)
|
||||
|
||||
# test Authentication error returning false
|
||||
|
||||
with patch(
|
||||
"transmissionrpc.Client", side_effect=TransmissionError("401: Unauthorized")
|
||||
):
|
||||
|
||||
assert await transmission.async_setup_entry(hass, entry) is False
|
||||
|
||||
|
||||
async def test_unload_entry(hass, api):
|
||||
"""Test removing transmission client."""
|
||||
entry = MOCK_ENTRY
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
with patch.object(
|
||||
hass.config_entries, "async_forward_entry_unload", return_value=mock_coro(True)
|
||||
) as unload_entry:
|
||||
assert await transmission.async_setup_entry(hass, entry)
|
||||
|
||||
assert await transmission.async_unload_entry(hass, entry)
|
||||
assert unload_entry.call_count == 2
|
||||
assert entry.entry_id not in hass.data[transmission.DOMAIN]
|
Loading…
Add table
Add a link
Reference in a new issue