Update datadog test logic (#149459)

Co-authored-by: Joostlek <joostlek@outlook.com>
This commit is contained in:
Avery 2025-07-28 09:10:55 -04:00 committed by GitHub
parent 46d810b9f9
commit a71eecaaa4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 98 additions and 60 deletions

View File

@ -36,14 +36,14 @@ class DatadogConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle user config flow.""" """Handle user config flow."""
errors: dict[str, str] = {} errors: dict[str, str] = {}
if user_input: if user_input:
self._async_abort_entries_match(
{CONF_HOST: user_input[CONF_HOST], CONF_PORT: user_input[CONF_PORT]}
)
# Validate connection to Datadog Agent # Validate connection to Datadog Agent
success = await validate_datadog_connection( success = await validate_datadog_connection(
self.hass, self.hass,
user_input, user_input,
) )
self._async_abort_entries_match(
{CONF_HOST: user_input[CONF_HOST], CONF_PORT: user_input[CONF_PORT]}
)
if not success: if not success:
errors["base"] = "cannot_connect" errors["base"] = "cannot_connect"
else: else:

View File

@ -3,7 +3,7 @@
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
from homeassistant.components import datadog from homeassistant.components import datadog
from homeassistant.config_entries import SOURCE_IMPORT from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
import homeassistant.helpers.issue_registry as ir import homeassistant.helpers.issue_registry as ir
@ -22,7 +22,7 @@ async def test_user_flow_success(hass: HomeAssistant) -> None:
mock_dogstatsd.return_value = mock_instance mock_dogstatsd.return_value = mock_instance
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
datadog.DOMAIN, context={"source": "user"} datadog.DOMAIN, context={"source": SOURCE_USER}
) )
assert result["type"] == FlowResultType.FORM assert result["type"] == FlowResultType.FORM
@ -42,7 +42,7 @@ async def test_user_flow_retry_after_connection_fail(hass: HomeAssistant) -> Non
side_effect=OSError("Connection failed"), side_effect=OSError("Connection failed"),
): ):
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
datadog.DOMAIN, context={"source": "user"} datadog.DOMAIN, context={"source": SOURCE_USER}
) )
result2 = await hass.config_entries.flow.async_configure( result2 = await hass.config_entries.flow.async_configure(
@ -62,6 +62,34 @@ async def test_user_flow_retry_after_connection_fail(hass: HomeAssistant) -> Non
assert result3["options"] == MOCK_OPTIONS assert result3["options"] == MOCK_OPTIONS
async def test_user_flow_abort_already_configured_service(
hass: HomeAssistant,
) -> None:
"""Abort user-initiated config flow if the same host/port is already configured."""
existing_entry = MockConfigEntry(
domain=datadog.DOMAIN,
data=MOCK_DATA,
options=MOCK_OPTIONS,
)
existing_entry.add_to_hass(hass)
result = await hass.config_entries.flow.async_init(
datadog.DOMAIN,
context={"source": SOURCE_USER},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "user"
assert result["errors"] == {}
result = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input=MOCK_CONFIG
)
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "already_configured"
async def test_options_flow_cannot_connect(hass: HomeAssistant) -> None: async def test_options_flow_cannot_connect(hass: HomeAssistant) -> None:
"""Test that the options flow shows an error when connection fails.""" """Test that the options flow shows an error when connection fails."""
mock_entry = MockConfigEntry( mock_entry = MockConfigEntry(
@ -221,9 +249,9 @@ async def test_import_flow_abort_already_configured_service(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
datadog.DOMAIN, datadog.DOMAIN,
context={"source": "import"}, context={"source": SOURCE_IMPORT},
data=MOCK_CONFIG, data=MOCK_CONFIG,
) )
assert result["type"] == "abort" assert result["type"] == FlowResultType.ABORT
assert result["reason"] == "already_configured" assert result["reason"] == "already_configured"

View File

@ -8,57 +8,65 @@ from homeassistant.components.datadog import async_setup_entry
from homeassistant.config_entries import ConfigEntryState from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import EVENT_LOGBOOK_ENTRY, STATE_OFF, STATE_ON, STATE_UNKNOWN from homeassistant.const import EVENT_LOGBOOK_ENTRY, STATE_OFF, STATE_ON, STATE_UNKNOWN
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component
from .common import MOCK_DATA, MOCK_OPTIONS, create_mock_state from .common import MOCK_DATA, MOCK_OPTIONS, create_mock_state
from tests.common import EVENT_STATE_CHANGED, MockConfigEntry, assert_setup_component from tests.common import EVENT_STATE_CHANGED, MockConfigEntry
async def test_invalid_config(hass: HomeAssistant) -> None: async def test_invalid_config(hass: HomeAssistant) -> None:
"""Test invalid configuration.""" """Test invalid configuration."""
with assert_setup_component(0): entry = MockConfigEntry(
assert not await async_setup_component( domain=datadog.DOMAIN,
hass, datadog.DOMAIN, {datadog.DOMAIN: {"host1": "host1"}} data={"host1": "host1"},
) )
entry.add_to_hass(hass)
assert not await hass.config_entries.async_setup(entry.entry_id)
async def test_datadog_setup_full(hass: HomeAssistant) -> None: async def test_datadog_setup_full(hass: HomeAssistant) -> None:
"""Test setup with all data.""" """Test setup with all data."""
config = {datadog.DOMAIN: {"host": "host", "port": 123, "rate": 1, "prefix": "foo"}}
with ( with (
patch( patch("homeassistant.components.datadog.DogStatsd") as mock_dogstatsd,
"homeassistant.components.datadog.config_flow.DogStatsd"
) as mock_dogstatsd,
): ):
assert await async_setup_component(hass, datadog.DOMAIN, config) entry = MockConfigEntry(
domain=datadog.DOMAIN,
data={
"host": "host",
"port": 123,
},
options={
"rate": 1,
"prefix": "foo",
},
)
entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert mock_dogstatsd.call_count == 1 assert mock_dogstatsd.call_count == 1
assert mock_dogstatsd.call_args == mock.call("host", 123) assert mock_dogstatsd.call_args == mock.call(
host="host", port=123, namespace="foo"
)
async def test_datadog_setup_defaults(hass: HomeAssistant) -> None: async def test_datadog_setup_defaults(hass: HomeAssistant) -> None:
"""Test setup with defaults.""" """Test setup with defaults."""
with ( with (
patch( patch("homeassistant.components.datadog.DogStatsd") as mock_dogstatsd,
"homeassistant.components.datadog.config_flow.DogStatsd"
) as mock_dogstatsd,
): ):
assert await async_setup_component( entry = MockConfigEntry(
hass, domain=datadog.DOMAIN,
datadog.DOMAIN, data=MOCK_DATA,
{ options=MOCK_OPTIONS,
datadog.DOMAIN: {
"host": "host",
"port": datadog.DEFAULT_PORT,
"prefix": datadog.DEFAULT_PREFIX,
}
},
) )
entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(entry.entry_id)
assert mock_dogstatsd.call_count == 1 assert mock_dogstatsd.call_count == 1
assert mock_dogstatsd.call_args == mock.call("host", 8125) assert mock_dogstatsd.call_args == mock.call(
host="localhost", port=8125, namespace="hass"
)
async def test_logbook_entry(hass: HomeAssistant) -> None: async def test_logbook_entry(hass: HomeAssistant) -> None:
@ -70,24 +78,24 @@ async def test_logbook_entry(hass: HomeAssistant) -> None:
), ),
): ):
mock_statsd = mock_statsd_class.return_value mock_statsd = mock_statsd_class.return_value
entry = MockConfigEntry(
assert await async_setup_component( domain=datadog.DOMAIN,
hass, data={
datadog.DOMAIN, "host": datadog.DEFAULT_HOST,
{ "port": datadog.DEFAULT_PORT,
datadog.DOMAIN: { },
"host": "host", options={
"port": datadog.DEFAULT_PORT, "rate": datadog.DEFAULT_RATE,
"rate": datadog.DEFAULT_RATE, "prefix": datadog.DEFAULT_PREFIX,
"prefix": datadog.DEFAULT_PREFIX,
}
}, },
) )
entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(entry.entry_id)
event = { event = {
"domain": "automation", "domain": "automation",
"entity_id": "sensor.foo.bar", "entity_id": "sensor.foo.bar",
"message": "foo bar biz", "message": "foo bar baz",
"name": "triggered something", "name": "triggered something",
} }
hass.bus.async_fire(EVENT_LOGBOOK_ENTRY, event) hass.bus.async_fire(EVENT_LOGBOOK_ENTRY, event)
@ -110,18 +118,16 @@ async def test_state_changed(hass: HomeAssistant) -> None:
), ),
): ):
mock_statsd = mock_statsd_class.return_value mock_statsd = mock_statsd_class.return_value
entry = MockConfigEntry(
assert await async_setup_component( domain=datadog.DOMAIN,
hass, data={
datadog.DOMAIN, "host": "host",
{ "port": datadog.DEFAULT_PORT,
datadog.DOMAIN: {
"host": "host",
"prefix": "ha",
"rate": datadog.DEFAULT_RATE,
}
}, },
options={"prefix": "ha", "rate": datadog.DEFAULT_RATE},
) )
entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(entry.entry_id)
valid = {"1": 1, "1.0": 1.0, STATE_ON: 1, STATE_OFF: 0} valid = {"1": 1, "1.0": 1.0, STATE_ON: 1, STATE_OFF: 0}
@ -191,14 +197,18 @@ async def test_unload_entry(hass: HomeAssistant) -> None:
async def test_state_changed_skips_unknown(hass: HomeAssistant) -> None: async def test_state_changed_skips_unknown(hass: HomeAssistant) -> None:
"""Test state_changed_listener skips None and unknown states.""" """Test state_changed_listener skips None and unknown states."""
entry = MockConfigEntry(domain=datadog.DOMAIN, data=MOCK_DATA, options=MOCK_OPTIONS)
entry.add_to_hass(hass)
with ( with (
patch( patch(
"homeassistant.components.datadog.config_flow.DogStatsd" "homeassistant.components.datadog.config_flow.DogStatsd"
) as mock_dogstatsd, ) as mock_dogstatsd,
): ):
entry = MockConfigEntry(
domain=datadog.DOMAIN,
data=MOCK_DATA,
options=MOCK_OPTIONS,
)
entry.add_to_hass(hass)
await async_setup_entry(hass, entry) await async_setup_entry(hass, entry)
# Test None state # Test None state