Skip to content
Snippets Groups Projects
Unverified Commit baeb55e3 authored by Franck Nijhof's avatar Franck Nijhof Committed by GitHub
Browse files

Add sync methods for create/deleting issues in repairs (#75557)

parent c8612597
No related branches found
No related tags found
No related merge requests found
...@@ -6,13 +6,20 @@ from homeassistant.helpers.typing import ConfigType ...@@ -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",
......
"""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 ...@@ -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( ...@@ -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: ...@@ -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
......
"""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 ...@@ -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": []}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment