mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Add sync methods for create/deleting issues in repairs (#75557)
This commit is contained in:
parent
c861259749
commit
baeb55e313
@ -6,13 +6,20 @@ from homeassistant.helpers.typing import ConfigType
|
|||||||
|
|
||||||
from . import issue_handler, websocket_api
|
from . import issue_handler, websocket_api
|
||||||
from .const import DOMAIN
|
from .const import DOMAIN
|
||||||
from .issue_handler import async_create_issue, async_delete_issue
|
from .issue_handler import (
|
||||||
|
async_create_issue,
|
||||||
|
async_delete_issue,
|
||||||
|
create_issue,
|
||||||
|
delete_issue,
|
||||||
|
)
|
||||||
from .issue_registry import async_load as async_load_issue_registry
|
from .issue_registry import async_load as async_load_issue_registry
|
||||||
from .models import IssueSeverity, RepairsFlow
|
from .models import IssueSeverity, RepairsFlow
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"async_create_issue",
|
"async_create_issue",
|
||||||
"async_delete_issue",
|
"async_delete_issue",
|
||||||
|
"create_issue",
|
||||||
|
"delete_issue",
|
||||||
"DOMAIN",
|
"DOMAIN",
|
||||||
"IssueSeverity",
|
"IssueSeverity",
|
||||||
"RepairsFlow",
|
"RepairsFlow",
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
"""The repairs integration."""
|
"""The repairs integration."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import functools as ft
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from awesomeversion import AwesomeVersion, AwesomeVersionStrategy
|
from awesomeversion import AwesomeVersion, AwesomeVersionStrategy
|
||||||
@ -11,6 +12,7 @@ from homeassistant.exceptions import HomeAssistantError
|
|||||||
from homeassistant.helpers.integration_platform import (
|
from homeassistant.helpers.integration_platform import (
|
||||||
async_process_integration_platforms,
|
async_process_integration_platforms,
|
||||||
)
|
)
|
||||||
|
from homeassistant.util.async_ import run_callback_threadsafe
|
||||||
|
|
||||||
from .const import DOMAIN
|
from .const import DOMAIN
|
||||||
from .issue_registry import async_get as async_get_issue_registry
|
from .issue_registry import async_get as async_get_issue_registry
|
||||||
@ -113,6 +115,36 @@ def async_create_issue(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_issue(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
domain: str,
|
||||||
|
issue_id: str,
|
||||||
|
*,
|
||||||
|
breaks_in_ha_version: str | None = None,
|
||||||
|
is_fixable: bool,
|
||||||
|
learn_more_url: str | None = None,
|
||||||
|
severity: IssueSeverity,
|
||||||
|
translation_key: str,
|
||||||
|
translation_placeholders: dict[str, str] | None = None,
|
||||||
|
) -> None:
|
||||||
|
"""Create an issue, or replace an existing one."""
|
||||||
|
return run_callback_threadsafe(
|
||||||
|
hass.loop,
|
||||||
|
ft.partial(
|
||||||
|
async_create_issue,
|
||||||
|
hass,
|
||||||
|
domain,
|
||||||
|
issue_id,
|
||||||
|
breaks_in_ha_version=breaks_in_ha_version,
|
||||||
|
is_fixable=is_fixable,
|
||||||
|
learn_more_url=learn_more_url,
|
||||||
|
severity=severity,
|
||||||
|
translation_key=translation_key,
|
||||||
|
translation_placeholders=translation_placeholders,
|
||||||
|
),
|
||||||
|
).result()
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_delete_issue(hass: HomeAssistant, domain: str, issue_id: str) -> None:
|
def async_delete_issue(hass: HomeAssistant, domain: str, issue_id: str) -> None:
|
||||||
"""Delete an issue.
|
"""Delete an issue.
|
||||||
@ -123,6 +155,16 @@ def async_delete_issue(hass: HomeAssistant, domain: str, issue_id: str) -> None:
|
|||||||
issue_registry.async_delete(domain, issue_id)
|
issue_registry.async_delete(domain, issue_id)
|
||||||
|
|
||||||
|
|
||||||
|
def delete_issue(hass: HomeAssistant, domain: str, issue_id: str) -> None:
|
||||||
|
"""Delete an issue.
|
||||||
|
|
||||||
|
It is not an error to delete an issue that does not exist.
|
||||||
|
"""
|
||||||
|
return run_callback_threadsafe(
|
||||||
|
hass.loop, async_delete_issue, hass, domain, issue_id
|
||||||
|
).result()
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_ignore_issue(
|
def async_ignore_issue(
|
||||||
hass: HomeAssistant, domain: str, issue_id: str, ignore: bool
|
hass: HomeAssistant, domain: str, issue_id: str, ignore: bool
|
||||||
|
@ -1,15 +1,23 @@
|
|||||||
"""Test the repairs websocket API."""
|
"""Test the repairs websocket API."""
|
||||||
|
from collections.abc import Awaitable, Callable
|
||||||
from unittest.mock import AsyncMock, Mock
|
from unittest.mock import AsyncMock, Mock
|
||||||
|
|
||||||
|
from aiohttp import ClientWebSocketResponse
|
||||||
from freezegun import freeze_time
|
from freezegun import freeze_time
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components.repairs import async_create_issue, async_delete_issue
|
from homeassistant.components.repairs import (
|
||||||
|
async_create_issue,
|
||||||
|
async_delete_issue,
|
||||||
|
create_issue,
|
||||||
|
delete_issue,
|
||||||
|
)
|
||||||
from homeassistant.components.repairs.const import DOMAIN
|
from homeassistant.components.repairs.const import DOMAIN
|
||||||
from homeassistant.components.repairs.issue_handler import (
|
from homeassistant.components.repairs.issue_handler import (
|
||||||
async_ignore_issue,
|
async_ignore_issue,
|
||||||
async_process_repairs_platforms,
|
async_process_repairs_platforms,
|
||||||
)
|
)
|
||||||
|
from homeassistant.components.repairs.models import IssueSeverity
|
||||||
from homeassistant.const import __version__ as ha_version
|
from homeassistant.const import __version__ as ha_version
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
@ -446,3 +454,66 @@ async def test_non_compliant_platform(hass: HomeAssistant, hass_ws_client) -> No
|
|||||||
await async_process_repairs_platforms(hass)
|
await async_process_repairs_platforms(hass)
|
||||||
|
|
||||||
assert list(hass.data[DOMAIN]["platforms"].keys()) == ["fake_integration"]
|
assert list(hass.data[DOMAIN]["platforms"].keys()) == ["fake_integration"]
|
||||||
|
|
||||||
|
|
||||||
|
@freeze_time("2022-07-21 08:22:00")
|
||||||
|
async def test_sync_methods(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_ws_client: Callable[[HomeAssistant], Awaitable[ClientWebSocketResponse]],
|
||||||
|
) -> None:
|
||||||
|
"""Test sync method for creating and deleting an issue."""
|
||||||
|
|
||||||
|
assert await async_setup_component(hass, DOMAIN, {})
|
||||||
|
|
||||||
|
client = await hass_ws_client(hass)
|
||||||
|
|
||||||
|
await client.send_json({"id": 1, "type": "repairs/list_issues"})
|
||||||
|
msg = await client.receive_json()
|
||||||
|
|
||||||
|
assert msg["success"]
|
||||||
|
assert msg["result"] == {"issues": []}
|
||||||
|
|
||||||
|
def _create_issue() -> None:
|
||||||
|
create_issue(
|
||||||
|
hass,
|
||||||
|
"fake_integration",
|
||||||
|
"sync_issue",
|
||||||
|
breaks_in_ha_version="2022.9",
|
||||||
|
is_fixable=True,
|
||||||
|
learn_more_url="https://theuselessweb.com",
|
||||||
|
severity=IssueSeverity.ERROR,
|
||||||
|
translation_key="abc_123",
|
||||||
|
translation_placeholders={"abc": "123"},
|
||||||
|
)
|
||||||
|
|
||||||
|
await hass.async_add_executor_job(_create_issue)
|
||||||
|
await client.send_json({"id": 2, "type": "repairs/list_issues"})
|
||||||
|
msg = await client.receive_json()
|
||||||
|
|
||||||
|
assert msg["success"]
|
||||||
|
assert msg["result"] == {
|
||||||
|
"issues": [
|
||||||
|
{
|
||||||
|
"breaks_in_ha_version": "2022.9",
|
||||||
|
"created": "2022-07-21T08:22:00+00:00",
|
||||||
|
"dismissed_version": None,
|
||||||
|
"domain": "fake_integration",
|
||||||
|
"ignored": False,
|
||||||
|
"is_fixable": True,
|
||||||
|
"issue_id": "sync_issue",
|
||||||
|
"learn_more_url": "https://theuselessweb.com",
|
||||||
|
"severity": "error",
|
||||||
|
"translation_key": "abc_123",
|
||||||
|
"translation_placeholders": {"abc": "123"},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
await hass.async_add_executor_job(
|
||||||
|
delete_issue, hass, "fake_integration", "sync_issue"
|
||||||
|
)
|
||||||
|
await client.send_json({"id": 3, "type": "repairs/list_issues"})
|
||||||
|
msg = await client.receive_json()
|
||||||
|
|
||||||
|
assert msg["success"]
|
||||||
|
assert msg["result"] == {"issues": []}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user