199 lines
6.1 KiB
Python
199 lines
6.1 KiB
Python
"""Test repairs for System Monitor."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from http import HTTPStatus
|
|
from unittest.mock import Mock
|
|
|
|
from syrupy.assertion import SnapshotAssertion
|
|
|
|
from homeassistant.components.repairs.websocket_api import (
|
|
RepairsFlowIndexView,
|
|
RepairsFlowResourceView,
|
|
)
|
|
from homeassistant.components.systemmonitor.const import DOMAIN
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.data_entry_flow import FlowResultType
|
|
from homeassistant.helpers import entity_registry as er, issue_registry as ir
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
from tests.common import ANY, MockConfigEntry
|
|
from tests.typing import ClientSessionGenerator, WebSocketGenerator
|
|
|
|
|
|
async def test_migrate_process_sensor(
|
|
hass: HomeAssistant,
|
|
entity_registry: er.EntityRegistry,
|
|
entity_registry_enabled_by_default: None,
|
|
mock_psutil: Mock,
|
|
mock_os: Mock,
|
|
hass_client: ClientSessionGenerator,
|
|
hass_ws_client: WebSocketGenerator,
|
|
snapshot: SnapshotAssertion,
|
|
) -> None:
|
|
"""Test migrating process sensor to binary sensor."""
|
|
mock_config_entry = MockConfigEntry(
|
|
title="System Monitor",
|
|
domain=DOMAIN,
|
|
data={},
|
|
options={
|
|
"binary_sensor": {"process": ["python3", "pip"]},
|
|
"sensor": {"process": ["python3", "pip"]},
|
|
"resources": [
|
|
"disk_use_percent_/",
|
|
"disk_use_percent_/home/notexist/",
|
|
"memory_free_",
|
|
"network_out_eth0",
|
|
"process_python3",
|
|
],
|
|
},
|
|
)
|
|
mock_config_entry.add_to_hass(hass)
|
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
assert hass.config_entries.async_entries(DOMAIN) == snapshot(
|
|
name="before_migration"
|
|
)
|
|
|
|
assert await async_setup_component(hass, "repairs", {})
|
|
await hass.async_block_till_done()
|
|
|
|
entity = "sensor.system_monitor_process_python3"
|
|
state = hass.states.get(entity)
|
|
assert state
|
|
|
|
assert entity_registry.async_get(entity)
|
|
|
|
ws_client = await hass_ws_client(hass)
|
|
client = await hass_client()
|
|
|
|
await ws_client.send_json({"id": 1, "type": "repairs/list_issues"})
|
|
msg = await ws_client.receive_json()
|
|
|
|
assert msg["success"]
|
|
assert len(msg["result"]["issues"]) > 0
|
|
issue = None
|
|
for i in msg["result"]["issues"]:
|
|
if i["issue_id"] == "process_sensor":
|
|
issue = i
|
|
assert issue is not None
|
|
|
|
url = RepairsFlowIndexView.url
|
|
resp = await client.post(
|
|
url, json={"handler": DOMAIN, "issue_id": "process_sensor"}
|
|
)
|
|
assert resp.status == HTTPStatus.OK
|
|
data = await resp.json()
|
|
|
|
flow_id = data["flow_id"]
|
|
assert data["step_id"] == "migrate_process_sensor"
|
|
|
|
url = RepairsFlowResourceView.url.format(flow_id=flow_id)
|
|
resp = await client.post(url, json={})
|
|
assert resp.status == HTTPStatus.OK
|
|
data = await resp.json()
|
|
|
|
# Cannot use identity `is` check here as the value is parsed from JSON
|
|
assert data["type"] == FlowResultType.CREATE_ENTRY.value
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get("binary_sensor.system_monitor_process_python3")
|
|
assert state
|
|
|
|
await ws_client.send_json({"id": 2, "type": "repairs/list_issues"})
|
|
msg = await ws_client.receive_json()
|
|
|
|
assert msg["success"]
|
|
issue = None
|
|
for i in msg["result"]["issues"]:
|
|
if i["issue_id"] == "migrate_process_sensor":
|
|
issue = i
|
|
assert not issue
|
|
|
|
entity = "sensor.system_monitor_process_python3"
|
|
state = hass.states.get(entity)
|
|
assert not state
|
|
|
|
assert not entity_registry.async_get(entity)
|
|
|
|
assert hass.config_entries.async_entries(DOMAIN) == snapshot(name="after_migration")
|
|
|
|
|
|
async def test_other_fixable_issues(
|
|
hass: HomeAssistant,
|
|
hass_client: ClientSessionGenerator,
|
|
hass_ws_client: WebSocketGenerator,
|
|
entity_registry_enabled_by_default: None,
|
|
mock_added_config_entry: ConfigEntry,
|
|
) -> None:
|
|
"""Test fixing other issues."""
|
|
assert await async_setup_component(hass, "repairs", {})
|
|
await hass.async_block_till_done()
|
|
|
|
ws_client = await hass_ws_client(hass)
|
|
client = await hass_client()
|
|
|
|
await ws_client.send_json({"id": 1, "type": "repairs/list_issues"})
|
|
msg = await ws_client.receive_json()
|
|
|
|
assert msg["success"]
|
|
|
|
issue = {
|
|
"breaks_in_ha_version": "2022.9.0dev0",
|
|
"domain": DOMAIN,
|
|
"issue_id": "issue_1",
|
|
"is_fixable": True,
|
|
"learn_more_url": "",
|
|
"severity": "error",
|
|
"translation_key": "issue_1",
|
|
}
|
|
ir.async_create_issue(
|
|
hass,
|
|
issue["domain"],
|
|
issue["issue_id"],
|
|
breaks_in_ha_version=issue["breaks_in_ha_version"],
|
|
is_fixable=issue["is_fixable"],
|
|
is_persistent=False,
|
|
learn_more_url=None,
|
|
severity=issue["severity"],
|
|
translation_key=issue["translation_key"],
|
|
)
|
|
|
|
await ws_client.send_json({"id": 2, "type": "repairs/list_issues"})
|
|
msg = await ws_client.receive_json()
|
|
|
|
assert msg["success"]
|
|
results = msg["result"]["issues"]
|
|
assert {
|
|
"breaks_in_ha_version": "2022.9.0dev0",
|
|
"created": ANY,
|
|
"dismissed_version": None,
|
|
"domain": DOMAIN,
|
|
"is_fixable": True,
|
|
"issue_domain": None,
|
|
"issue_id": "issue_1",
|
|
"learn_more_url": None,
|
|
"severity": "error",
|
|
"translation_key": "issue_1",
|
|
"translation_placeholders": None,
|
|
"ignored": False,
|
|
} in results
|
|
|
|
url = RepairsFlowIndexView.url
|
|
resp = await client.post(url, json={"handler": DOMAIN, "issue_id": "issue_1"})
|
|
assert resp.status == HTTPStatus.OK
|
|
data = await resp.json()
|
|
|
|
flow_id = data["flow_id"]
|
|
assert data["step_id"] == "confirm"
|
|
|
|
url = RepairsFlowResourceView.url.format(flow_id=flow_id)
|
|
resp = await client.post(url)
|
|
assert resp.status == HTTPStatus.OK
|
|
data = await resp.json()
|
|
|
|
# Cannot use identity `is` check here as the value is parsed from JSON
|
|
assert data["type"] == FlowResultType.CREATE_ENTRY.value
|
|
await hass.async_block_till_done()
|