Use http.HTTPStatus in components/s* (#58291)
This commit is contained in:
parent
05671557f0
commit
50e0c58310
29 changed files with 180 additions and 158 deletions
|
@ -1,4 +1,5 @@
|
||||||
"""SendGrid notification service."""
|
"""SendGrid notification service."""
|
||||||
|
from http import HTTPStatus
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from sendgrid import SendGridAPIClient
|
from sendgrid import SendGridAPIClient
|
||||||
|
@ -15,7 +16,6 @@ from homeassistant.const import (
|
||||||
CONF_RECIPIENT,
|
CONF_RECIPIENT,
|
||||||
CONF_SENDER,
|
CONF_SENDER,
|
||||||
CONTENT_TYPE_TEXT_PLAIN,
|
CONTENT_TYPE_TEXT_PLAIN,
|
||||||
HTTP_ACCEPTED,
|
|
||||||
)
|
)
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
|
||||||
|
@ -66,5 +66,5 @@ class SendgridNotificationService(BaseNotificationService):
|
||||||
}
|
}
|
||||||
|
|
||||||
response = self._sg.client.mail.send.post(request_body=data)
|
response = self._sg.client.mail.send.post(request_body=data)
|
||||||
if response.status_code != HTTP_ACCEPTED:
|
if response.status_code != HTTPStatus.ACCEPTED:
|
||||||
_LOGGER.error("Unable to send notification")
|
_LOGGER.error("Unable to send notification")
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from http import HTTPStatus
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Final
|
from typing import Any, Final
|
||||||
|
|
||||||
|
@ -13,12 +14,7 @@ import async_timeout
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.const import (
|
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
|
||||||
CONF_HOST,
|
|
||||||
CONF_PASSWORD,
|
|
||||||
CONF_USERNAME,
|
|
||||||
HTTP_UNAUTHORIZED,
|
|
||||||
)
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.data_entry_flow import FlowResult
|
from homeassistant.data_entry_flow import FlowResult
|
||||||
from homeassistant.helpers import aiohttp_client
|
from homeassistant.helpers import aiohttp_client
|
||||||
|
@ -155,7 +151,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||||
self.hass, self.host, self.info, user_input
|
self.hass, self.host, self.info, user_input
|
||||||
)
|
)
|
||||||
except aiohttp.ClientResponseError as error:
|
except aiohttp.ClientResponseError as error:
|
||||||
if error.status == HTTP_UNAUTHORIZED:
|
if error.status == HTTPStatus.UNAUTHORIZED:
|
||||||
errors["base"] = "invalid_auth"
|
errors["base"] = "invalid_auth"
|
||||||
else:
|
else:
|
||||||
errors["base"] = "cannot_connect"
|
errors["base"] = "cannot_connect"
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""Sensor for SigFox devices."""
|
"""Sensor for SigFox devices."""
|
||||||
import datetime
|
import datetime
|
||||||
|
from http import HTTPStatus
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
|
@ -8,7 +9,7 @@ import requests
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity
|
from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity
|
||||||
from homeassistant.const import CONF_NAME, HTTP_OK, HTTP_UNAUTHORIZED
|
from homeassistant.const import CONF_NAME
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -65,8 +66,8 @@ class SigfoxAPI:
|
||||||
"""Check API credentials are valid."""
|
"""Check API credentials are valid."""
|
||||||
url = urljoin(API_URL, "devicetypes")
|
url = urljoin(API_URL, "devicetypes")
|
||||||
response = requests.get(url, auth=self._auth, timeout=10)
|
response = requests.get(url, auth=self._auth, timeout=10)
|
||||||
if response.status_code != HTTP_OK:
|
if response.status_code != HTTPStatus.OK:
|
||||||
if response.status_code == HTTP_UNAUTHORIZED:
|
if response.status_code == HTTPStatus.UNAUTHORIZED:
|
||||||
_LOGGER.error("Invalid credentials for Sigfox API")
|
_LOGGER.error("Invalid credentials for Sigfox API")
|
||||||
else:
|
else:
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
|
|
|
@ -3,6 +3,7 @@ from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
|
from http import HTTPStatus
|
||||||
import importlib
|
import importlib
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -12,13 +13,7 @@ from pysmartthings import Attribute, Capability, SmartThings
|
||||||
from pysmartthings.device import DeviceEntity
|
from pysmartthings.device import DeviceEntity
|
||||||
|
|
||||||
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
||||||
from homeassistant.const import (
|
from homeassistant.const import CONF_ACCESS_TOKEN, CONF_CLIENT_ID, CONF_CLIENT_SECRET
|
||||||
CONF_ACCESS_TOKEN,
|
|
||||||
CONF_CLIENT_ID,
|
|
||||||
CONF_CLIENT_SECRET,
|
|
||||||
HTTP_FORBIDDEN,
|
|
||||||
HTTP_UNAUTHORIZED,
|
|
||||||
)
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.exceptions import ConfigEntryNotReady
|
from homeassistant.exceptions import ConfigEntryNotReady
|
||||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||||
|
@ -164,7 +159,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||||
hass.data[DOMAIN][DATA_BROKERS][entry.entry_id] = broker
|
hass.data[DOMAIN][DATA_BROKERS][entry.entry_id] = broker
|
||||||
|
|
||||||
except ClientResponseError as ex:
|
except ClientResponseError as ex:
|
||||||
if ex.status in (HTTP_UNAUTHORIZED, HTTP_FORBIDDEN):
|
if ex.status in (HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN):
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
"Unable to setup configuration entry '%s' - please reconfigure the integration",
|
"Unable to setup configuration entry '%s' - please reconfigure the integration",
|
||||||
entry.title,
|
entry.title,
|
||||||
|
@ -197,7 +192,7 @@ async def async_get_entry_scenes(entry: ConfigEntry, api):
|
||||||
try:
|
try:
|
||||||
return await api.scenes(location_id=entry.data[CONF_LOCATION_ID])
|
return await api.scenes(location_id=entry.data[CONF_LOCATION_ID])
|
||||||
except ClientResponseError as ex:
|
except ClientResponseError as ex:
|
||||||
if ex.status == HTTP_FORBIDDEN:
|
if ex.status == HTTPStatus.FORBIDDEN:
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
"Unable to load scenes for configuration entry '%s' because the access token does not have the required access",
|
"Unable to load scenes for configuration entry '%s' because the access token does not have the required access",
|
||||||
entry.title,
|
entry.title,
|
||||||
|
@ -220,12 +215,12 @@ async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
|
||||||
"""Perform clean-up when entry is being removed."""
|
"""Perform clean-up when entry is being removed."""
|
||||||
api = SmartThings(async_get_clientsession(hass), entry.data[CONF_ACCESS_TOKEN])
|
api = SmartThings(async_get_clientsession(hass), entry.data[CONF_ACCESS_TOKEN])
|
||||||
|
|
||||||
# Remove the installed_app, which if already removed raises a HTTP_FORBIDDEN error.
|
# Remove the installed_app, which if already removed raises a HTTPStatus.FORBIDDEN error.
|
||||||
installed_app_id = entry.data[CONF_INSTALLED_APP_ID]
|
installed_app_id = entry.data[CONF_INSTALLED_APP_ID]
|
||||||
try:
|
try:
|
||||||
await api.delete_installed_app(installed_app_id)
|
await api.delete_installed_app(installed_app_id)
|
||||||
except ClientResponseError as ex:
|
except ClientResponseError as ex:
|
||||||
if ex.status == HTTP_FORBIDDEN:
|
if ex.status == HTTPStatus.FORBIDDEN:
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Installed app %s has already been removed",
|
"Installed app %s has already been removed",
|
||||||
installed_app_id,
|
installed_app_id,
|
||||||
|
@ -236,7 +231,7 @@ async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
|
||||||
_LOGGER.debug("Removed installed app %s", installed_app_id)
|
_LOGGER.debug("Removed installed app %s", installed_app_id)
|
||||||
|
|
||||||
# Remove the app if not referenced by other entries, which if already
|
# Remove the app if not referenced by other entries, which if already
|
||||||
# removed raises a HTTP_FORBIDDEN error.
|
# removed raises a HTTPStatus.FORBIDDEN error.
|
||||||
all_entries = hass.config_entries.async_entries(DOMAIN)
|
all_entries = hass.config_entries.async_entries(DOMAIN)
|
||||||
app_id = entry.data[CONF_APP_ID]
|
app_id = entry.data[CONF_APP_ID]
|
||||||
app_count = sum(1 for entry in all_entries if entry.data[CONF_APP_ID] == app_id)
|
app_count = sum(1 for entry in all_entries if entry.data[CONF_APP_ID] == app_id)
|
||||||
|
@ -250,7 +245,7 @@ async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
|
||||||
try:
|
try:
|
||||||
await api.delete_app(app_id)
|
await api.delete_app(app_id)
|
||||||
except ClientResponseError as ex:
|
except ClientResponseError as ex:
|
||||||
if ex.status == HTTP_FORBIDDEN:
|
if ex.status == HTTPStatus.FORBIDDEN:
|
||||||
_LOGGER.debug("App %s has already been removed", app_id, exc_info=True)
|
_LOGGER.debug("App %s has already been removed", app_id, exc_info=True)
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
"""Config flow to configure SmartThings."""
|
"""Config flow to configure SmartThings."""
|
||||||
|
from http import HTTPStatus
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from aiohttp import ClientResponseError
|
from aiohttp import ClientResponseError
|
||||||
|
@ -7,13 +8,7 @@ from pysmartthings.installedapp import format_install_url
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.const import (
|
from homeassistant.const import CONF_ACCESS_TOKEN, CONF_CLIENT_ID, CONF_CLIENT_SECRET
|
||||||
CONF_ACCESS_TOKEN,
|
|
||||||
CONF_CLIENT_ID,
|
|
||||||
CONF_CLIENT_SECRET,
|
|
||||||
HTTP_FORBIDDEN,
|
|
||||||
HTTP_UNAUTHORIZED,
|
|
||||||
)
|
|
||||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
|
@ -142,12 +137,12 @@ class SmartThingsFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
||||||
)
|
)
|
||||||
return self._show_step_pat(errors)
|
return self._show_step_pat(errors)
|
||||||
except ClientResponseError as ex:
|
except ClientResponseError as ex:
|
||||||
if ex.status == HTTP_UNAUTHORIZED:
|
if ex.status == HTTPStatus.UNAUTHORIZED:
|
||||||
errors[CONF_ACCESS_TOKEN] = "token_unauthorized"
|
errors[CONF_ACCESS_TOKEN] = "token_unauthorized"
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Unauthorized error received setting up SmartApp", exc_info=True
|
"Unauthorized error received setting up SmartApp", exc_info=True
|
||||||
)
|
)
|
||||||
elif ex.status == HTTP_FORBIDDEN:
|
elif ex.status == HTTPStatus.FORBIDDEN:
|
||||||
errors[CONF_ACCESS_TOKEN] = "token_forbidden"
|
errors[CONF_ACCESS_TOKEN] = "token_forbidden"
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Forbidden error received setting up SmartApp", exc_info=True
|
"Forbidden error received setting up SmartApp", exc_info=True
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""Support to send data to a Splunk instance."""
|
"""Support to send data to a Splunk instance."""
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from http import HTTPStatus
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
|
@ -111,7 +112,7 @@ async def async_setup(hass, config):
|
||||||
try:
|
try:
|
||||||
await event_collector.queue(json.dumps(payload, cls=JSONEncoder), send=True)
|
await event_collector.queue(json.dumps(payload, cls=JSONEncoder), send=True)
|
||||||
except SplunkPayloadError as err:
|
except SplunkPayloadError as err:
|
||||||
if err.status == 401:
|
if err.status == HTTPStatus.UNAUTHORIZED:
|
||||||
_LOGGER.error(err)
|
_LOGGER.error(err)
|
||||||
else:
|
else:
|
||||||
_LOGGER.warning(err)
|
_LOGGER.warning(err)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""Config flow for Logitech Squeezebox integration."""
|
"""Config flow for Logitech Squeezebox integration."""
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from http import HTTPStatus
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from pysqueezebox import Server, async_discover
|
from pysqueezebox import Server, async_discover
|
||||||
|
@ -8,13 +9,7 @@ import voluptuous as vol
|
||||||
from homeassistant import config_entries, data_entry_flow
|
from homeassistant import config_entries, data_entry_flow
|
||||||
from homeassistant.components.dhcp import MAC_ADDRESS
|
from homeassistant.components.dhcp import MAC_ADDRESS
|
||||||
from homeassistant.components.media_player import DOMAIN as MP_DOMAIN
|
from homeassistant.components.media_player import DOMAIN as MP_DOMAIN
|
||||||
from homeassistant.const import (
|
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME
|
||||||
CONF_HOST,
|
|
||||||
CONF_PASSWORD,
|
|
||||||
CONF_PORT,
|
|
||||||
CONF_USERNAME,
|
|
||||||
HTTP_UNAUTHORIZED,
|
|
||||||
)
|
|
||||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||||
from homeassistant.helpers.device_registry import format_mac
|
from homeassistant.helpers.device_registry import format_mac
|
||||||
from homeassistant.helpers.entity_registry import async_get
|
from homeassistant.helpers.entity_registry import async_get
|
||||||
|
@ -115,7 +110,7 @@ class SqueezeboxConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||||
try:
|
try:
|
||||||
status = await server.async_query("serverstatus")
|
status = await server.async_query("serverstatus")
|
||||||
if not status:
|
if not status:
|
||||||
if server.http_status == HTTP_UNAUTHORIZED:
|
if server.http_status == HTTPStatus.UNAUTHORIZED:
|
||||||
return "invalid_auth"
|
return "invalid_auth"
|
||||||
return "cannot_connect"
|
return "cannot_connect"
|
||||||
except Exception: # pylint: disable=broad-except
|
except Exception: # pylint: disable=broad-except
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
from http import HTTPStatus
|
||||||
import logging
|
import logging
|
||||||
from xml.parsers.expat import ExpatError
|
from xml.parsers.expat import ExpatError
|
||||||
|
|
||||||
|
@ -19,7 +20,6 @@ from homeassistant.const import (
|
||||||
CONF_MONITORED_VARIABLES,
|
CONF_MONITORED_VARIABLES,
|
||||||
CONF_NAME,
|
CONF_NAME,
|
||||||
DATA_GIGABYTES,
|
DATA_GIGABYTES,
|
||||||
HTTP_OK,
|
|
||||||
PERCENTAGE,
|
PERCENTAGE,
|
||||||
)
|
)
|
||||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||||
|
@ -195,7 +195,7 @@ class StartcaData:
|
||||||
url = f"https://www.start.ca/support/usage/api?key={self.api_key}"
|
url = f"https://www.start.ca/support/usage/api?key={self.api_key}"
|
||||||
with async_timeout.timeout(REQUEST_TIMEOUT):
|
with async_timeout.timeout(REQUEST_TIMEOUT):
|
||||||
req = await self.websession.get(url)
|
req = await self.websession.get(url)
|
||||||
if req.status != HTTP_OK:
|
if req.status != HTTPStatus.OK:
|
||||||
_LOGGER.error("Request failed with status: %u", req.status)
|
_LOGGER.error("Request failed with status: %u", req.status)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
"""Provide functionality to stream HLS."""
|
"""Provide functionality to stream HLS."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from http import HTTPStatus
|
||||||
from typing import TYPE_CHECKING, cast
|
from typing import TYPE_CHECKING, cast
|
||||||
|
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
|
@ -193,7 +194,7 @@ class HlsPlaylistView(StreamView):
|
||||||
"""Return a HTTP Bad Request response."""
|
"""Return a HTTP Bad Request response."""
|
||||||
return web.Response(
|
return web.Response(
|
||||||
body=None,
|
body=None,
|
||||||
status=400,
|
status=HTTPStatus.BAD_REQUEST,
|
||||||
# From Appendix B.1 of the RFC:
|
# From Appendix B.1 of the RFC:
|
||||||
# Successful responses to blocking Playlist requests should be cached
|
# Successful responses to blocking Playlist requests should be cached
|
||||||
# for six Target Durations. Unsuccessful responses (such as 404s) should
|
# for six Target Durations. Unsuccessful responses (such as 404s) should
|
||||||
|
@ -211,7 +212,7 @@ class HlsPlaylistView(StreamView):
|
||||||
"""Return a HTTP Not Found response."""
|
"""Return a HTTP Not Found response."""
|
||||||
return web.Response(
|
return web.Response(
|
||||||
body=None,
|
body=None,
|
||||||
status=404,
|
status=HTTPStatus.NOT_FOUND,
|
||||||
headers={
|
headers={
|
||||||
"Cache-Control": f"max-age={(4 if blocking else 1)*target_duration:.0f}"
|
"Cache-Control": f"max-age={(4 if blocking else 1)*target_duration:.0f}"
|
||||||
},
|
},
|
||||||
|
@ -351,7 +352,7 @@ class HlsPartView(StreamView):
|
||||||
):
|
):
|
||||||
return web.Response(
|
return web.Response(
|
||||||
body=None,
|
body=None,
|
||||||
status=404,
|
status=HTTPStatus.NOT_FOUND,
|
||||||
headers={"Cache-Control": f"max-age={track.target_duration:.0f}"},
|
headers={"Cache-Control": f"max-age={track.target_duration:.0f}"},
|
||||||
)
|
)
|
||||||
# If the part is ready or has been hinted,
|
# If the part is ready or has been hinted,
|
||||||
|
@ -399,7 +400,7 @@ class HlsSegmentView(StreamView):
|
||||||
):
|
):
|
||||||
return web.Response(
|
return web.Response(
|
||||||
body=None,
|
body=None,
|
||||||
status=404,
|
status=HTTPStatus.NOT_FOUND,
|
||||||
headers={"Cache-Control": f"max-age={track.target_duration:.0f}"},
|
headers={"Cache-Control": f"max-age={track.target_duration:.0f}"},
|
||||||
)
|
)
|
||||||
return web.Response(
|
return web.Response(
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
"""SynologyChat platform for notify component."""
|
"""SynologyChat platform for notify component."""
|
||||||
|
from http import HTTPStatus
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -10,7 +11,7 @@ from homeassistant.components.notify import (
|
||||||
PLATFORM_SCHEMA,
|
PLATFORM_SCHEMA,
|
||||||
BaseNotificationService,
|
BaseNotificationService,
|
||||||
)
|
)
|
||||||
from homeassistant.const import CONF_RESOURCE, CONF_VERIFY_SSL, HTTP_CREATED, HTTP_OK
|
from homeassistant.const import CONF_RESOURCE, CONF_VERIFY_SSL
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
|
||||||
ATTR_FILE_URL = "file_url"
|
ATTR_FILE_URL = "file_url"
|
||||||
|
@ -57,7 +58,7 @@ class SynologyChatNotificationService(BaseNotificationService):
|
||||||
self._resource, data=to_send, timeout=10, verify=self._verify_ssl
|
self._resource, data=to_send, timeout=10, verify=self._verify_ssl
|
||||||
)
|
)
|
||||||
|
|
||||||
if response.status_code not in (HTTP_OK, HTTP_CREATED):
|
if response.status_code not in (HTTPStatus.OK, HTTPStatus.CREATED):
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
"Error sending message. Response %d: %s:",
|
"Error sending message. Response %d: %s:",
|
||||||
response.status_code,
|
response.status_code,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""Test the Shelly config flow."""
|
"""Test the Shelly config flow."""
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from http import HTTPStatus
|
||||||
from unittest.mock import AsyncMock, Mock, patch
|
from unittest.mock import AsyncMock, Mock, patch
|
||||||
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
|
@ -325,8 +326,14 @@ async def test_form_firmware_unsupported(hass):
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"error",
|
"error",
|
||||||
[
|
[
|
||||||
(aiohttp.ClientResponseError(Mock(), (), status=400), "cannot_connect"),
|
(
|
||||||
(aiohttp.ClientResponseError(Mock(), (), status=401), "invalid_auth"),
|
aiohttp.ClientResponseError(Mock(), (), status=HTTPStatus.BAD_REQUEST),
|
||||||
|
"cannot_connect",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
aiohttp.ClientResponseError(Mock(), (), status=HTTPStatus.UNAUTHORIZED),
|
||||||
|
"invalid_auth",
|
||||||
|
),
|
||||||
(asyncio.TimeoutError, "cannot_connect"),
|
(asyncio.TimeoutError, "cannot_connect"),
|
||||||
(ValueError, "unknown"),
|
(ValueError, "unknown"),
|
||||||
],
|
],
|
||||||
|
@ -480,7 +487,10 @@ async def test_zeroconf_sleeping_device(hass):
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"error",
|
"error",
|
||||||
[
|
[
|
||||||
(aiohttp.ClientResponseError(Mock(), (), status=400), "cannot_connect"),
|
(
|
||||||
|
aiohttp.ClientResponseError(Mock(), (), status=HTTPStatus.BAD_REQUEST),
|
||||||
|
"cannot_connect",
|
||||||
|
),
|
||||||
(asyncio.TimeoutError, "cannot_connect"),
|
(asyncio.TimeoutError, "cannot_connect"),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
"""Test shopping list component."""
|
"""Test shopping list component."""
|
||||||
|
from http import HTTPStatus
|
||||||
|
|
||||||
from homeassistant.components.shopping_list.const import (
|
from homeassistant.components.shopping_list.const import (
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
|
@ -11,7 +12,7 @@ from homeassistant.components.websocket_api.const import (
|
||||||
ERR_NOT_FOUND,
|
ERR_NOT_FOUND,
|
||||||
TYPE_RESULT,
|
TYPE_RESULT,
|
||||||
)
|
)
|
||||||
from homeassistant.const import ATTR_NAME, HTTP_NOT_FOUND
|
from homeassistant.const import ATTR_NAME
|
||||||
from homeassistant.helpers import intent
|
from homeassistant.helpers import intent
|
||||||
|
|
||||||
|
|
||||||
|
@ -115,7 +116,7 @@ async def test_deprecated_api_get_all(hass, hass_client, sl_setup):
|
||||||
client = await hass_client()
|
client = await hass_client()
|
||||||
resp = await client.get("/api/shopping_list")
|
resp = await client.get("/api/shopping_list")
|
||||||
|
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
data = await resp.json()
|
data = await resp.json()
|
||||||
assert len(data) == 2
|
assert len(data) == 2
|
||||||
assert data[0]["name"] == "beer"
|
assert data[0]["name"] == "beer"
|
||||||
|
@ -169,7 +170,7 @@ async def test_deprecated_api_update(hass, hass_client, sl_setup):
|
||||||
f"/api/shopping_list/item/{beer_id}", json={"name": "soda"}
|
f"/api/shopping_list/item/{beer_id}", json={"name": "soda"}
|
||||||
)
|
)
|
||||||
|
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
data = await resp.json()
|
data = await resp.json()
|
||||||
assert data == {"id": beer_id, "name": "soda", "complete": False}
|
assert data == {"id": beer_id, "name": "soda", "complete": False}
|
||||||
|
|
||||||
|
@ -177,7 +178,7 @@ async def test_deprecated_api_update(hass, hass_client, sl_setup):
|
||||||
f"/api/shopping_list/item/{wine_id}", json={"complete": True}
|
f"/api/shopping_list/item/{wine_id}", json={"complete": True}
|
||||||
)
|
)
|
||||||
|
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
data = await resp.json()
|
data = await resp.json()
|
||||||
assert data == {"id": wine_id, "name": "wine", "complete": True}
|
assert data == {"id": wine_id, "name": "wine", "complete": True}
|
||||||
|
|
||||||
|
@ -238,12 +239,12 @@ async def test_api_update_fails(hass, hass_client, sl_setup):
|
||||||
client = await hass_client()
|
client = await hass_client()
|
||||||
resp = await client.post("/api/shopping_list/non_existing", json={"name": "soda"})
|
resp = await client.post("/api/shopping_list/non_existing", json={"name": "soda"})
|
||||||
|
|
||||||
assert resp.status == HTTP_NOT_FOUND
|
assert resp.status == HTTPStatus.NOT_FOUND
|
||||||
|
|
||||||
beer_id = hass.data["shopping_list"].items[0]["id"]
|
beer_id = hass.data["shopping_list"].items[0]["id"]
|
||||||
resp = await client.post(f"/api/shopping_list/item/{beer_id}", json={"name": 123})
|
resp = await client.post(f"/api/shopping_list/item/{beer_id}", json={"name": 123})
|
||||||
|
|
||||||
assert resp.status == 400
|
assert resp.status == HTTPStatus.BAD_REQUEST
|
||||||
|
|
||||||
|
|
||||||
async def test_ws_update_item_fail(hass, hass_ws_client, sl_setup):
|
async def test_ws_update_item_fail(hass, hass_ws_client, sl_setup):
|
||||||
|
@ -288,10 +289,10 @@ async def test_deprecated_api_clear_completed(hass, hass_client, sl_setup):
|
||||||
resp = await client.post(
|
resp = await client.post(
|
||||||
f"/api/shopping_list/item/{beer_id}", json={"complete": True}
|
f"/api/shopping_list/item/{beer_id}", json={"complete": True}
|
||||||
)
|
)
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
|
|
||||||
resp = await client.post("/api/shopping_list/clear_completed")
|
resp = await client.post("/api/shopping_list/clear_completed")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
|
|
||||||
items = hass.data["shopping_list"].items
|
items = hass.data["shopping_list"].items
|
||||||
assert len(items) == 1
|
assert len(items) == 1
|
||||||
|
@ -334,7 +335,7 @@ async def test_deprecated_api_create(hass, hass_client, sl_setup):
|
||||||
client = await hass_client()
|
client = await hass_client()
|
||||||
resp = await client.post("/api/shopping_list/item", json={"name": "soda"})
|
resp = await client.post("/api/shopping_list/item", json={"name": "soda"})
|
||||||
|
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
data = await resp.json()
|
data = await resp.json()
|
||||||
assert data["name"] == "soda"
|
assert data["name"] == "soda"
|
||||||
assert data["complete"] is False
|
assert data["complete"] is False
|
||||||
|
@ -351,7 +352,7 @@ async def test_deprecated_api_create_fail(hass, hass_client, sl_setup):
|
||||||
client = await hass_client()
|
client = await hass_client()
|
||||||
resp = await client.post("/api/shopping_list/item", json={"name": 1234})
|
resp = await client.post("/api/shopping_list/item", json={"name": 1234})
|
||||||
|
|
||||||
assert resp.status == 400
|
assert resp.status == HTTPStatus.BAD_REQUEST
|
||||||
assert len(hass.data["shopping_list"].items) == 0
|
assert len(hass.data["shopping_list"].items) == 0
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
"""Tests for the sigfox sensor."""
|
"""Tests for the sigfox sensor."""
|
||||||
|
from http import HTTPStatus
|
||||||
import re
|
import re
|
||||||
|
|
||||||
import requests_mock
|
import requests_mock
|
||||||
|
@ -34,7 +35,7 @@ async def test_invalid_credentials(hass):
|
||||||
"""Test for invalid credentials."""
|
"""Test for invalid credentials."""
|
||||||
with requests_mock.Mocker() as mock_req:
|
with requests_mock.Mocker() as mock_req:
|
||||||
url = re.compile(API_URL + "devicetypes")
|
url = re.compile(API_URL + "devicetypes")
|
||||||
mock_req.get(url, text="{}", status_code=401)
|
mock_req.get(url, text="{}", status_code=HTTPStatus.UNAUTHORIZED)
|
||||||
assert await async_setup_component(hass, "sensor", VALID_CONFIG)
|
assert await async_setup_component(hass, "sensor", VALID_CONFIG)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert len(hass.states.async_entity_ids()) == 0
|
assert len(hass.states.async_entity_ids()) == 0
|
||||||
|
@ -44,7 +45,9 @@ async def test_valid_credentials(hass):
|
||||||
"""Test for valid credentials."""
|
"""Test for valid credentials."""
|
||||||
with requests_mock.Mocker() as mock_req:
|
with requests_mock.Mocker() as mock_req:
|
||||||
url1 = re.compile(API_URL + "devicetypes")
|
url1 = re.compile(API_URL + "devicetypes")
|
||||||
mock_req.get(url1, text='{"data":[{"id":"fake_type"}]}', status_code=200)
|
mock_req.get(
|
||||||
|
url1, text='{"data":[{"id":"fake_type"}]}', status_code=HTTPStatus.OK
|
||||||
|
)
|
||||||
|
|
||||||
url2 = re.compile(API_URL + "devicetypes/fake_type/devices")
|
url2 = re.compile(API_URL + "devicetypes/fake_type/devices")
|
||||||
mock_req.get(url2, text='{"data":[{"id":"fake_id"}]}')
|
mock_req.get(url2, text='{"data":[{"id":"fake_id"}]}')
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
"""The tests for the signal_messenger platform."""
|
"""The tests for the signal_messenger platform."""
|
||||||
|
from http import HTTPStatus
|
||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
|
@ -54,12 +54,12 @@ class TestSignalMesssenger(unittest.TestCase):
|
||||||
mock.register_uri(
|
mock.register_uri(
|
||||||
"POST",
|
"POST",
|
||||||
"http://127.0.0.1:8080/v2/send",
|
"http://127.0.0.1:8080/v2/send",
|
||||||
status_code=201,
|
status_code=HTTPStatus.CREATED,
|
||||||
)
|
)
|
||||||
mock.register_uri(
|
mock.register_uri(
|
||||||
"GET",
|
"GET",
|
||||||
"http://127.0.0.1:8080/v1/about",
|
"http://127.0.0.1:8080/v1/about",
|
||||||
status_code=200,
|
status_code=HTTPStatus.OK,
|
||||||
json={"versions": ["v1", "v2"]},
|
json={"versions": ["v1", "v2"]},
|
||||||
)
|
)
|
||||||
with self.assertLogs(
|
with self.assertLogs(
|
||||||
|
@ -77,12 +77,12 @@ class TestSignalMesssenger(unittest.TestCase):
|
||||||
mock.register_uri(
|
mock.register_uri(
|
||||||
"POST",
|
"POST",
|
||||||
"http://127.0.0.1:8080/v2/send",
|
"http://127.0.0.1:8080/v2/send",
|
||||||
status_code=201,
|
status_code=HTTPStatus.CREATED,
|
||||||
)
|
)
|
||||||
mock.register_uri(
|
mock.register_uri(
|
||||||
"GET",
|
"GET",
|
||||||
"http://127.0.0.1:8080/v1/about",
|
"http://127.0.0.1:8080/v1/about",
|
||||||
status_code=200,
|
status_code=HTTPStatus.OK,
|
||||||
json={"versions": ["v1", "v2"]},
|
json={"versions": ["v1", "v2"]},
|
||||||
)
|
)
|
||||||
with self.assertLogs(
|
with self.assertLogs(
|
||||||
|
@ -106,12 +106,12 @@ class TestSignalMesssenger(unittest.TestCase):
|
||||||
mock.register_uri(
|
mock.register_uri(
|
||||||
"POST",
|
"POST",
|
||||||
"http://127.0.0.1:8080/v2/send",
|
"http://127.0.0.1:8080/v2/send",
|
||||||
status_code=201,
|
status_code=HTTPStatus.CREATED,
|
||||||
)
|
)
|
||||||
mock.register_uri(
|
mock.register_uri(
|
||||||
"GET",
|
"GET",
|
||||||
"http://127.0.0.1:8080/v1/about",
|
"http://127.0.0.1:8080/v1/about",
|
||||||
status_code=200,
|
status_code=HTTPStatus.OK,
|
||||||
json={"versions": ["v1", "v2"]},
|
json={"versions": ["v1", "v2"]},
|
||||||
)
|
)
|
||||||
with self.assertLogs(
|
with self.assertLogs(
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
"""The tests for the SleepIQ component."""
|
"""The tests for the SleepIQ component."""
|
||||||
|
from http import HTTPStatus
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
from homeassistant import setup
|
from homeassistant import setup
|
||||||
|
@ -41,7 +42,7 @@ async def test_setup_login_failed(hass, requests_mock):
|
||||||
mock_responses(requests_mock)
|
mock_responses(requests_mock)
|
||||||
requests_mock.put(
|
requests_mock.put(
|
||||||
"https://prod-api.sleepiq.sleepnumber.com/rest/login",
|
"https://prod-api.sleepiq.sleepnumber.com/rest/login",
|
||||||
status_code=401,
|
status_code=HTTPStatus.UNAUTHORIZED,
|
||||||
json=load_fixture("sleepiq-login-failed.json"),
|
json=load_fixture("sleepiq-login-failed.json"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
"""Test the Smappee component config flow module."""
|
"""Test the Smappee component config flow module."""
|
||||||
|
from http import HTTPStatus
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
from homeassistant import data_entry_flow, setup
|
from homeassistant import data_entry_flow, setup
|
||||||
|
@ -424,7 +425,7 @@ async def test_full_user_flow(
|
||||||
|
|
||||||
client = await hass_client_no_auth()
|
client = await hass_client_no_auth()
|
||||||
resp = await client.get(f"/auth/external/callback?code=abcd&state={state}")
|
resp = await client.get(f"/auth/external/callback?code=abcd&state={state}")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
assert resp.headers["content-type"] == "text/html; charset=utf-8"
|
assert resp.headers["content-type"] == "text/html; charset=utf-8"
|
||||||
|
|
||||||
aioclient_mock.post(
|
aioclient_mock.post(
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""Test configuration and mocks for Smart Meter Texas."""
|
"""Test configuration and mocks for Smart Meter Texas."""
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from http import HTTPStatus
|
||||||
import json
|
import json
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
@ -67,7 +68,7 @@ def mock_connection(
|
||||||
elif auth_fail:
|
elif auth_fail:
|
||||||
aioclient_mock.post(
|
aioclient_mock.post(
|
||||||
auth_endpoint,
|
auth_endpoint,
|
||||||
status=400,
|
status=HTTPStatus.BAD_REQUEST,
|
||||||
json={"errormessage": "ERR-USR-INVALIDPASSWORDERROR"},
|
json={"errormessage": "ERR-USR-INVALIDPASSWORDERROR"},
|
||||||
)
|
)
|
||||||
else: # auth_timeout
|
else: # auth_timeout
|
||||||
|
|
|
@ -551,7 +551,10 @@ async def test_webhook_problem_shows_error(hass, smartthings_mock):
|
||||||
data = {"error": {}}
|
data = {"error": {}}
|
||||||
request_info = Mock(real_url="http://example.com")
|
request_info = Mock(real_url="http://example.com")
|
||||||
error = APIResponseError(
|
error = APIResponseError(
|
||||||
request_info=request_info, history=None, data=data, status=422
|
request_info=request_info,
|
||||||
|
history=None,
|
||||||
|
data=data,
|
||||||
|
status=HTTPStatus.UNPROCESSABLE_ENTITY,
|
||||||
)
|
)
|
||||||
error.is_target_error = Mock(return_value=True)
|
error.is_target_error = Mock(return_value=True)
|
||||||
smartthings_mock.apps.side_effect = error
|
smartthings_mock.apps.side_effect = error
|
||||||
|
@ -591,7 +594,10 @@ async def test_api_error_shows_error(hass, smartthings_mock):
|
||||||
data = {"error": {}}
|
data = {"error": {}}
|
||||||
request_info = Mock(real_url="http://example.com")
|
request_info = Mock(real_url="http://example.com")
|
||||||
error = APIResponseError(
|
error = APIResponseError(
|
||||||
request_info=request_info, history=None, data=data, status=400
|
request_info=request_info,
|
||||||
|
history=None,
|
||||||
|
data=data,
|
||||||
|
status=HTTPStatus.BAD_REQUEST,
|
||||||
)
|
)
|
||||||
smartthings_mock.apps.side_effect = error
|
smartthings_mock.apps.side_effect = error
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ async def test_unrecoverable_api_errors_create_new_flow(
|
||||||
config_entry.add_to_hass(hass)
|
config_entry.add_to_hass(hass)
|
||||||
request_info = Mock(real_url="http://example.com")
|
request_info = Mock(real_url="http://example.com")
|
||||||
smartthings_mock.app.side_effect = ClientResponseError(
|
smartthings_mock.app.side_effect = ClientResponseError(
|
||||||
request_info=request_info, history=None, status=401
|
request_info=request_info, history=None, status=HTTPStatus.UNAUTHORIZED
|
||||||
)
|
)
|
||||||
|
|
||||||
# Assert setup returns false
|
# Assert setup returns false
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""Tests for the Somfy config flow."""
|
"""Tests for the Somfy config flow."""
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from http import HTTPStatus
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
from homeassistant import config_entries, data_entry_flow, setup
|
from homeassistant import config_entries, data_entry_flow, setup
|
||||||
|
@ -69,7 +70,7 @@ async def test_full_flow(
|
||||||
|
|
||||||
client = await hass_client_no_auth()
|
client = await hass_client_no_auth()
|
||||||
resp = await client.get(f"/auth/external/callback?code=abcd&state={state}")
|
resp = await client.get(f"/auth/external/callback?code=abcd&state={state}")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
assert resp.headers["content-type"] == "text/html; charset=utf-8"
|
assert resp.headers["content-type"] == "text/html; charset=utf-8"
|
||||||
|
|
||||||
aioclient_mock.post(
|
aioclient_mock.post(
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
"""Tests for the Sonarr component."""
|
"""Tests for the Sonarr component."""
|
||||||
|
from http import HTTPStatus
|
||||||
from socket import gaierror as SocketGIAError
|
from socket import gaierror as SocketGIAError
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
@ -148,13 +149,13 @@ def mock_connection_invalid_auth(
|
||||||
"""Mock Sonarr invalid auth errors."""
|
"""Mock Sonarr invalid auth errors."""
|
||||||
sonarr_url = f"http://{host}:{port}{base_path}"
|
sonarr_url = f"http://{host}:{port}{base_path}"
|
||||||
|
|
||||||
aioclient_mock.get(f"{sonarr_url}/system/status", status=403)
|
aioclient_mock.get(f"{sonarr_url}/system/status", status=HTTPStatus.FORBIDDEN)
|
||||||
aioclient_mock.get(f"{sonarr_url}/diskspace", status=403)
|
aioclient_mock.get(f"{sonarr_url}/diskspace", status=HTTPStatus.FORBIDDEN)
|
||||||
aioclient_mock.get(f"{sonarr_url}/calendar", status=403)
|
aioclient_mock.get(f"{sonarr_url}/calendar", status=HTTPStatus.FORBIDDEN)
|
||||||
aioclient_mock.get(f"{sonarr_url}/command", status=403)
|
aioclient_mock.get(f"{sonarr_url}/command", status=HTTPStatus.FORBIDDEN)
|
||||||
aioclient_mock.get(f"{sonarr_url}/queue", status=403)
|
aioclient_mock.get(f"{sonarr_url}/queue", status=HTTPStatus.FORBIDDEN)
|
||||||
aioclient_mock.get(f"{sonarr_url}/series", status=403)
|
aioclient_mock.get(f"{sonarr_url}/series", status=HTTPStatus.FORBIDDEN)
|
||||||
aioclient_mock.get(f"{sonarr_url}/missing/wanted", status=403)
|
aioclient_mock.get(f"{sonarr_url}/missing/wanted", status=HTTPStatus.FORBIDDEN)
|
||||||
|
|
||||||
|
|
||||||
def mock_connection_server_error(
|
def mock_connection_server_error(
|
||||||
|
@ -166,13 +167,21 @@ def mock_connection_server_error(
|
||||||
"""Mock Sonarr server errors."""
|
"""Mock Sonarr server errors."""
|
||||||
sonarr_url = f"http://{host}:{port}{base_path}"
|
sonarr_url = f"http://{host}:{port}{base_path}"
|
||||||
|
|
||||||
aioclient_mock.get(f"{sonarr_url}/system/status", status=500)
|
aioclient_mock.get(
|
||||||
aioclient_mock.get(f"{sonarr_url}/diskspace", status=500)
|
f"{sonarr_url}/system/status", status=HTTPStatus.INTERNAL_SERVER_ERROR
|
||||||
aioclient_mock.get(f"{sonarr_url}/calendar", status=500)
|
)
|
||||||
aioclient_mock.get(f"{sonarr_url}/command", status=500)
|
aioclient_mock.get(
|
||||||
aioclient_mock.get(f"{sonarr_url}/queue", status=500)
|
f"{sonarr_url}/diskspace", status=HTTPStatus.INTERNAL_SERVER_ERROR
|
||||||
aioclient_mock.get(f"{sonarr_url}/series", status=500)
|
)
|
||||||
aioclient_mock.get(f"{sonarr_url}/missing/wanted", status=500)
|
aioclient_mock.get(
|
||||||
|
f"{sonarr_url}/calendar", status=HTTPStatus.INTERNAL_SERVER_ERROR
|
||||||
|
)
|
||||||
|
aioclient_mock.get(f"{sonarr_url}/command", status=HTTPStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
aioclient_mock.get(f"{sonarr_url}/queue", status=HTTPStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
aioclient_mock.get(f"{sonarr_url}/series", status=HTTPStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
aioclient_mock.get(
|
||||||
|
f"{sonarr_url}/missing/wanted", status=HTTPStatus.INTERNAL_SERVER_ERROR
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def setup_integration(
|
async def setup_integration(
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
"""The tests for the Home Assistant SpaceAPI component."""
|
"""The tests for the Home Assistant SpaceAPI component."""
|
||||||
|
from http import HTTPStatus
|
||||||
|
|
||||||
# pylint: disable=protected-access
|
# pylint: disable=protected-access
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
@ -91,7 +93,7 @@ def mock_client(hass, hass_client):
|
||||||
async def test_spaceapi_get(hass, mock_client):
|
async def test_spaceapi_get(hass, mock_client):
|
||||||
"""Test response after start-up Home Assistant."""
|
"""Test response after start-up Home Assistant."""
|
||||||
resp = await mock_client.get(URL_API_SPACEAPI)
|
resp = await mock_client.get(URL_API_SPACEAPI)
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
|
|
||||||
data = await resp.json()
|
data = await resp.json()
|
||||||
|
|
||||||
|
@ -137,7 +139,7 @@ async def test_spaceapi_state_get(hass, mock_client):
|
||||||
hass.states.async_set("test.test_door", True)
|
hass.states.async_set("test.test_door", True)
|
||||||
|
|
||||||
resp = await mock_client.get(URL_API_SPACEAPI)
|
resp = await mock_client.get(URL_API_SPACEAPI)
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
|
|
||||||
data = await resp.json()
|
data = await resp.json()
|
||||||
assert data["state"]["open"] == bool(1)
|
assert data["state"]["open"] == bool(1)
|
||||||
|
@ -146,7 +148,7 @@ async def test_spaceapi_state_get(hass, mock_client):
|
||||||
async def test_spaceapi_sensors_get(hass, mock_client):
|
async def test_spaceapi_sensors_get(hass, mock_client):
|
||||||
"""Test the response for the sensors."""
|
"""Test the response for the sensors."""
|
||||||
resp = await mock_client.get(URL_API_SPACEAPI)
|
resp = await mock_client.get(URL_API_SPACEAPI)
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
|
|
||||||
data = await resp.json()
|
data = await resp.json()
|
||||||
assert data["sensors"] == SENSOR_OUTPUT
|
assert data["sensors"] == SENSOR_OUTPUT
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
"""Tests for the Spotify config flow."""
|
"""Tests for the Spotify config flow."""
|
||||||
|
from http import HTTPStatus
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
from spotipy import SpotifyException
|
from spotipy import SpotifyException
|
||||||
|
@ -80,7 +81,7 @@ async def test_full_flow(
|
||||||
|
|
||||||
client = await hass_client_no_auth()
|
client = await hass_client_no_auth()
|
||||||
resp = await client.get(f"/auth/external/callback?code=abcd&state={state}")
|
resp = await client.get(f"/auth/external/callback?code=abcd&state={state}")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
assert resp.headers["content-type"] == "text/html; charset=utf-8"
|
assert resp.headers["content-type"] == "text/html; charset=utf-8"
|
||||||
|
|
||||||
aioclient_mock.post(
|
aioclient_mock.post(
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
"""Test the Logitech Squeezebox config flow."""
|
"""Test the Logitech Squeezebox config flow."""
|
||||||
|
from http import HTTPStatus
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
from pysqueezebox import Server
|
from pysqueezebox import Server
|
||||||
|
@ -6,13 +7,7 @@ from pysqueezebox import Server
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.components.dhcp import HOSTNAME, IP_ADDRESS, MAC_ADDRESS
|
from homeassistant.components.dhcp import HOSTNAME, IP_ADDRESS, MAC_ADDRESS
|
||||||
from homeassistant.components.squeezebox.const import DOMAIN
|
from homeassistant.components.squeezebox.const import DOMAIN
|
||||||
from homeassistant.const import (
|
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME
|
||||||
CONF_HOST,
|
|
||||||
CONF_PASSWORD,
|
|
||||||
CONF_PORT,
|
|
||||||
CONF_USERNAME,
|
|
||||||
HTTP_UNAUTHORIZED,
|
|
||||||
)
|
|
||||||
from homeassistant.data_entry_flow import (
|
from homeassistant.data_entry_flow import (
|
||||||
RESULT_TYPE_ABORT,
|
RESULT_TYPE_ABORT,
|
||||||
RESULT_TYPE_CREATE_ENTRY,
|
RESULT_TYPE_CREATE_ENTRY,
|
||||||
|
@ -39,7 +34,7 @@ async def mock_failed_discover(_discovery_callback):
|
||||||
|
|
||||||
async def patch_async_query_unauthorized(self, *args):
|
async def patch_async_query_unauthorized(self, *args):
|
||||||
"""Mock an unauthorized query."""
|
"""Mock an unauthorized query."""
|
||||||
self.http_status = HTTP_UNAUTHORIZED
|
self.http_status = HTTPStatus.UNAUTHORIZED
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
@ -128,7 +123,7 @@ async def test_form_invalid_auth(hass):
|
||||||
)
|
)
|
||||||
|
|
||||||
async def patch_async_query(self, *args):
|
async def patch_async_query(self, *args):
|
||||||
self.http_status = HTTP_UNAUTHORIZED
|
self.http_status = HTTPStatus.UNAUTHORIZED
|
||||||
return False
|
return False
|
||||||
|
|
||||||
with patch("pysqueezebox.Server.async_query", new=patch_async_query):
|
with patch("pysqueezebox.Server.async_query", new=patch_async_query):
|
||||||
|
|
|
@ -13,6 +13,7 @@ from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
from http import HTTPStatus
|
||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
@ -171,7 +172,7 @@ class HLSSync:
|
||||||
self.check_requests_ready()
|
self.check_requests_ready()
|
||||||
return self._original_not_found()
|
return self._original_not_found()
|
||||||
|
|
||||||
def response(self, body, headers, status=200):
|
def response(self, body, headers, status=HTTPStatus.OK):
|
||||||
"""Intercept the Response call so we know when the web handler is finished."""
|
"""Intercept the Response call so we know when the web handler is finished."""
|
||||||
self._num_finished += 1
|
self._num_finished += 1
|
||||||
self.check_requests_ready()
|
self.check_requests_ready()
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""The tests for hls streams."""
|
"""The tests for hls streams."""
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
from http import HTTPStatus
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
|
@ -15,7 +16,6 @@ from homeassistant.components.stream.const import (
|
||||||
NUM_PLAYLIST_SEGMENTS,
|
NUM_PLAYLIST_SEGMENTS,
|
||||||
)
|
)
|
||||||
from homeassistant.components.stream.core import Part
|
from homeassistant.components.stream.core import Part
|
||||||
from homeassistant.const import HTTP_NOT_FOUND
|
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
|
@ -138,23 +138,23 @@ async def test_hls_stream(hass, hls_stream, stream_worker_sync):
|
||||||
|
|
||||||
# Fetch master playlist
|
# Fetch master playlist
|
||||||
master_playlist_response = await hls_client.get()
|
master_playlist_response = await hls_client.get()
|
||||||
assert master_playlist_response.status == 200
|
assert master_playlist_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
# Fetch init
|
# Fetch init
|
||||||
master_playlist = await master_playlist_response.text()
|
master_playlist = await master_playlist_response.text()
|
||||||
init_response = await hls_client.get("/init.mp4")
|
init_response = await hls_client.get("/init.mp4")
|
||||||
assert init_response.status == 200
|
assert init_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
# Fetch playlist
|
# Fetch playlist
|
||||||
playlist_url = "/" + master_playlist.splitlines()[-1]
|
playlist_url = "/" + master_playlist.splitlines()[-1]
|
||||||
playlist_response = await hls_client.get(playlist_url)
|
playlist_response = await hls_client.get(playlist_url)
|
||||||
assert playlist_response.status == 200
|
assert playlist_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
# Fetch segment
|
# Fetch segment
|
||||||
playlist = await playlist_response.text()
|
playlist = await playlist_response.text()
|
||||||
segment_url = "/" + [line for line in playlist.splitlines() if line][-1]
|
segment_url = "/" + [line for line in playlist.splitlines() if line][-1]
|
||||||
segment_response = await hls_client.get(segment_url)
|
segment_response = await hls_client.get(segment_url)
|
||||||
assert segment_response.status == 200
|
assert segment_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
stream_worker_sync.resume()
|
stream_worker_sync.resume()
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@ async def test_hls_stream(hass, hls_stream, stream_worker_sync):
|
||||||
|
|
||||||
# Ensure playlist not accessible after stream ends
|
# Ensure playlist not accessible after stream ends
|
||||||
fail_response = await hls_client.get()
|
fail_response = await hls_client.get()
|
||||||
assert fail_response.status == HTTP_NOT_FOUND
|
assert fail_response.status == HTTPStatus.NOT_FOUND
|
||||||
|
|
||||||
|
|
||||||
async def test_stream_timeout(hass, hass_client, stream_worker_sync):
|
async def test_stream_timeout(hass, hass_client, stream_worker_sync):
|
||||||
|
@ -186,7 +186,7 @@ async def test_stream_timeout(hass, hass_client, stream_worker_sync):
|
||||||
# Fetch playlist
|
# Fetch playlist
|
||||||
parsed_url = urlparse(url)
|
parsed_url = urlparse(url)
|
||||||
playlist_response = await http_client.get(parsed_url.path)
|
playlist_response = await http_client.get(parsed_url.path)
|
||||||
assert playlist_response.status == 200
|
assert playlist_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
# Wait a minute
|
# Wait a minute
|
||||||
future = dt_util.utcnow() + timedelta(minutes=1)
|
future = dt_util.utcnow() + timedelta(minutes=1)
|
||||||
|
@ -194,7 +194,7 @@ async def test_stream_timeout(hass, hass_client, stream_worker_sync):
|
||||||
|
|
||||||
# Fetch again to reset timer
|
# Fetch again to reset timer
|
||||||
playlist_response = await http_client.get(parsed_url.path)
|
playlist_response = await http_client.get(parsed_url.path)
|
||||||
assert playlist_response.status == 200
|
assert playlist_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
stream_worker_sync.resume()
|
stream_worker_sync.resume()
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ async def test_stream_timeout(hass, hass_client, stream_worker_sync):
|
||||||
|
|
||||||
# Ensure playlist not accessible
|
# Ensure playlist not accessible
|
||||||
fail_response = await http_client.get(parsed_url.path)
|
fail_response = await http_client.get(parsed_url.path)
|
||||||
assert fail_response.status == HTTP_NOT_FOUND
|
assert fail_response.status == HTTPStatus.NOT_FOUND
|
||||||
|
|
||||||
|
|
||||||
async def test_stream_timeout_after_stop(hass, hass_client, stream_worker_sync):
|
async def test_stream_timeout_after_stop(hass, hass_client, stream_worker_sync):
|
||||||
|
@ -280,7 +280,7 @@ async def test_hls_playlist_view_no_output(hass, hls_stream):
|
||||||
|
|
||||||
# Fetch playlist
|
# Fetch playlist
|
||||||
resp = await hls_client.get("/playlist.m3u8")
|
resp = await hls_client.get("/playlist.m3u8")
|
||||||
assert resp.status == 404
|
assert resp.status == HTTPStatus.NOT_FOUND
|
||||||
|
|
||||||
|
|
||||||
async def test_hls_playlist_view(hass, hls_stream, stream_worker_sync):
|
async def test_hls_playlist_view(hass, hls_stream, stream_worker_sync):
|
||||||
|
@ -298,7 +298,7 @@ async def test_hls_playlist_view(hass, hls_stream, stream_worker_sync):
|
||||||
hls_client = await hls_stream(stream)
|
hls_client = await hls_stream(stream)
|
||||||
|
|
||||||
resp = await hls_client.get("/playlist.m3u8")
|
resp = await hls_client.get("/playlist.m3u8")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
assert await resp.text() == make_playlist(
|
assert await resp.text() == make_playlist(
|
||||||
sequence=0, segments=[make_segment(0), make_segment(1)]
|
sequence=0, segments=[make_segment(0), make_segment(1)]
|
||||||
)
|
)
|
||||||
|
@ -307,7 +307,7 @@ async def test_hls_playlist_view(hass, hls_stream, stream_worker_sync):
|
||||||
hls.put(segment)
|
hls.put(segment)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
resp = await hls_client.get("/playlist.m3u8")
|
resp = await hls_client.get("/playlist.m3u8")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
assert await resp.text() == make_playlist(
|
assert await resp.text() == make_playlist(
|
||||||
sequence=0, segments=[make_segment(0), make_segment(1), make_segment(2)]
|
sequence=0, segments=[make_segment(0), make_segment(1), make_segment(2)]
|
||||||
)
|
)
|
||||||
|
@ -333,7 +333,7 @@ async def test_hls_max_segments(hass, hls_stream, stream_worker_sync):
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
resp = await hls_client.get("/playlist.m3u8")
|
resp = await hls_client.get("/playlist.m3u8")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
|
|
||||||
# Only NUM_PLAYLIST_SEGMENTS are returned in the playlist.
|
# Only NUM_PLAYLIST_SEGMENTS are returned in the playlist.
|
||||||
start = MAX_SEGMENTS + 1 - NUM_PLAYLIST_SEGMENTS
|
start = MAX_SEGMENTS + 1 - NUM_PLAYLIST_SEGMENTS
|
||||||
|
@ -356,12 +356,12 @@ async def test_hls_max_segments(hass, hls_stream, stream_worker_sync):
|
||||||
# The segment that fell off the buffer is not accessible
|
# The segment that fell off the buffer is not accessible
|
||||||
with patch.object(hls.stream_settings, "hls_part_timeout", 0.1):
|
with patch.object(hls.stream_settings, "hls_part_timeout", 0.1):
|
||||||
segment_response = await hls_client.get("/segment/0.m4s")
|
segment_response = await hls_client.get("/segment/0.m4s")
|
||||||
assert segment_response.status == 404
|
assert segment_response.status == HTTPStatus.NOT_FOUND
|
||||||
|
|
||||||
# However all segments in the buffer are accessible, even those that were not in the playlist.
|
# However all segments in the buffer are accessible, even those that were not in the playlist.
|
||||||
for sequence in range(1, MAX_SEGMENTS + 1):
|
for sequence in range(1, MAX_SEGMENTS + 1):
|
||||||
segment_response = await hls_client.get(f"/segment/{sequence}.m4s")
|
segment_response = await hls_client.get(f"/segment/{sequence}.m4s")
|
||||||
assert segment_response.status == 200
|
assert segment_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
stream_worker_sync.resume()
|
stream_worker_sync.resume()
|
||||||
stream.stop()
|
stream.stop()
|
||||||
|
@ -390,7 +390,7 @@ async def test_hls_playlist_view_discontinuity(hass, hls_stream, stream_worker_s
|
||||||
hls_client = await hls_stream(stream)
|
hls_client = await hls_stream(stream)
|
||||||
|
|
||||||
resp = await hls_client.get("/playlist.m3u8")
|
resp = await hls_client.get("/playlist.m3u8")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
assert await resp.text() == make_playlist(
|
assert await resp.text() == make_playlist(
|
||||||
sequence=0,
|
sequence=0,
|
||||||
segments=[
|
segments=[
|
||||||
|
@ -428,7 +428,7 @@ async def test_hls_max_segments_discontinuity(hass, hls_stream, stream_worker_sy
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
resp = await hls_client.get("/playlist.m3u8")
|
resp = await hls_client.get("/playlist.m3u8")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
|
|
||||||
# Only NUM_PLAYLIST_SEGMENTS are returned in the playlist causing the
|
# Only NUM_PLAYLIST_SEGMENTS are returned in the playlist causing the
|
||||||
# EXT-X-DISCONTINUITY tag to be omitted and EXT-X-DISCONTINUITY-SEQUENCE
|
# EXT-X-DISCONTINUITY tag to be omitted and EXT-X-DISCONTINUITY-SEQUENCE
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""The tests for hls streams."""
|
"""The tests for hls streams."""
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from http import HTTPStatus
|
||||||
import itertools
|
import itertools
|
||||||
import re
|
import re
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
@ -16,7 +17,6 @@ from homeassistant.components.stream.const import (
|
||||||
HLS_PROVIDER,
|
HLS_PROVIDER,
|
||||||
)
|
)
|
||||||
from homeassistant.components.stream.core import Part
|
from homeassistant.components.stream.core import Part
|
||||||
from homeassistant.const import HTTP_NOT_FOUND
|
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
|
|
||||||
from .test_hls import SEGMENT_DURATION, STREAM_SOURCE, HlsClient, make_playlist
|
from .test_hls import SEGMENT_DURATION, STREAM_SOURCE, HlsClient, make_playlist
|
||||||
|
@ -143,17 +143,17 @@ async def test_ll_hls_stream(hass, hls_stream, stream_worker_sync):
|
||||||
|
|
||||||
# Fetch playlist
|
# Fetch playlist
|
||||||
master_playlist_response = await hls_client.get()
|
master_playlist_response = await hls_client.get()
|
||||||
assert master_playlist_response.status == 200
|
assert master_playlist_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
# Fetch init
|
# Fetch init
|
||||||
master_playlist = await master_playlist_response.text()
|
master_playlist = await master_playlist_response.text()
|
||||||
init_response = await hls_client.get("/init.mp4")
|
init_response = await hls_client.get("/init.mp4")
|
||||||
assert init_response.status == 200
|
assert init_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
# Fetch playlist
|
# Fetch playlist
|
||||||
playlist_url = "/" + master_playlist.splitlines()[-1]
|
playlist_url = "/" + master_playlist.splitlines()[-1]
|
||||||
playlist_response = await hls_client.get(playlist_url)
|
playlist_response = await hls_client.get(playlist_url)
|
||||||
assert playlist_response.status == 200
|
assert playlist_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
# Fetch segments
|
# Fetch segments
|
||||||
playlist = await playlist_response.text()
|
playlist = await playlist_response.text()
|
||||||
|
@ -163,7 +163,7 @@ async def test_ll_hls_stream(hass, hls_stream, stream_worker_sync):
|
||||||
if match:
|
if match:
|
||||||
segment_url = "/" + match.group("segment_url")
|
segment_url = "/" + match.group("segment_url")
|
||||||
segment_response = await hls_client.get(segment_url)
|
segment_response = await hls_client.get(segment_url)
|
||||||
assert segment_response.status == 200
|
assert segment_response.status == HTTPStatus.OK
|
||||||
|
|
||||||
def check_part_is_moof_mdat(data: bytes):
|
def check_part_is_moof_mdat(data: bytes):
|
||||||
if len(data) < 8 or data[4:8] != b"moof":
|
if len(data) < 8 or data[4:8] != b"moof":
|
||||||
|
@ -200,7 +200,7 @@ async def test_ll_hls_stream(hass, hls_stream, stream_worker_sync):
|
||||||
"Range": f'bytes={match.group("byterange_start")}-{byterange_end}'
|
"Range": f'bytes={match.group("byterange_start")}-{byterange_end}'
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
assert part_segment_response.status == 206
|
assert part_segment_response.status == HTTPStatus.PARTIAL_CONTENT
|
||||||
assert check_part_is_moof_mdat(await part_segment_response.read())
|
assert check_part_is_moof_mdat(await part_segment_response.read())
|
||||||
|
|
||||||
stream_worker_sync.resume()
|
stream_worker_sync.resume()
|
||||||
|
@ -210,7 +210,7 @@ async def test_ll_hls_stream(hass, hls_stream, stream_worker_sync):
|
||||||
|
|
||||||
# Ensure playlist not accessible after stream ends
|
# Ensure playlist not accessible after stream ends
|
||||||
fail_response = await hls_client.get()
|
fail_response = await hls_client.get()
|
||||||
assert fail_response.status == HTTP_NOT_FOUND
|
assert fail_response.status == HTTPStatus.NOT_FOUND
|
||||||
|
|
||||||
|
|
||||||
async def test_ll_hls_playlist_view(hass, hls_stream, stream_worker_sync):
|
async def test_ll_hls_playlist_view(hass, hls_stream, stream_worker_sync):
|
||||||
|
@ -244,7 +244,7 @@ async def test_ll_hls_playlist_view(hass, hls_stream, stream_worker_sync):
|
||||||
hls_client = await hls_stream(stream)
|
hls_client = await hls_stream(stream)
|
||||||
|
|
||||||
resp = await hls_client.get("/playlist.m3u8")
|
resp = await hls_client.get("/playlist.m3u8")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
assert await resp.text() == make_playlist(
|
assert await resp.text() == make_playlist(
|
||||||
sequence=0,
|
sequence=0,
|
||||||
segments=[
|
segments=[
|
||||||
|
@ -265,7 +265,7 @@ async def test_ll_hls_playlist_view(hass, hls_stream, stream_worker_sync):
|
||||||
|
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
resp = await hls_client.get("/playlist.m3u8")
|
resp = await hls_client.get("/playlist.m3u8")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
assert await resp.text() == make_playlist(
|
assert await resp.text() == make_playlist(
|
||||||
sequence=0,
|
sequence=0,
|
||||||
segments=[
|
segments=[
|
||||||
|
@ -316,10 +316,10 @@ async def test_ll_hls_msn(hass, hls_stream, stream_worker_sync, hls_sync):
|
||||||
|
|
||||||
msn_responses = await msn_requests
|
msn_responses = await msn_requests
|
||||||
|
|
||||||
assert msn_responses[0].status == 200
|
assert msn_responses[0].status == HTTPStatus.OK
|
||||||
assert msn_responses[1].status == 200
|
assert msn_responses[1].status == HTTPStatus.OK
|
||||||
assert msn_responses[2].status == 400
|
assert msn_responses[2].status == HTTPStatus.BAD_REQUEST
|
||||||
assert msn_responses[3].status == 400
|
assert msn_responses[3].status == HTTPStatus.BAD_REQUEST
|
||||||
|
|
||||||
# Sequence number is now 2. Create six more requests for sequences 0 through 5.
|
# Sequence number is now 2. Create six more requests for sequences 0 through 5.
|
||||||
# Calls for msn 0 through 4 should work, 5 should fail.
|
# Calls for msn 0 through 4 should work, 5 should fail.
|
||||||
|
@ -334,12 +334,12 @@ async def test_ll_hls_msn(hass, hls_stream, stream_worker_sync, hls_sync):
|
||||||
hls.put(segment)
|
hls.put(segment)
|
||||||
|
|
||||||
msn_responses = await msn_requests
|
msn_responses = await msn_requests
|
||||||
assert msn_responses[0].status == 200
|
assert msn_responses[0].status == HTTPStatus.OK
|
||||||
assert msn_responses[1].status == 200
|
assert msn_responses[1].status == HTTPStatus.OK
|
||||||
assert msn_responses[2].status == 200
|
assert msn_responses[2].status == HTTPStatus.OK
|
||||||
assert msn_responses[3].status == 200
|
assert msn_responses[3].status == HTTPStatus.OK
|
||||||
assert msn_responses[4].status == 200
|
assert msn_responses[4].status == HTTPStatus.OK
|
||||||
assert msn_responses[5].status == 400
|
assert msn_responses[5].status == HTTPStatus.BAD_REQUEST
|
||||||
|
|
||||||
stream_worker_sync.resume()
|
stream_worker_sync.resume()
|
||||||
|
|
||||||
|
@ -369,7 +369,9 @@ async def test_ll_hls_playlist_bad_msn_part(hass, hls_stream, stream_worker_sync
|
||||||
# If the Playlist URI contains an _HLS_part directive but no _HLS_msn
|
# If the Playlist URI contains an _HLS_part directive but no _HLS_msn
|
||||||
# directive, the Server MUST return Bad Request, such as HTTP 400.
|
# directive, the Server MUST return Bad Request, such as HTTP 400.
|
||||||
|
|
||||||
assert (await hls_client.get("/playlist.m3u8?_HLS_part=1")).status == 400
|
assert (
|
||||||
|
await hls_client.get("/playlist.m3u8?_HLS_part=1")
|
||||||
|
).status == HTTPStatus.BAD_REQUEST
|
||||||
|
|
||||||
# Seed hls with 1 complete segment and 1 in process segment
|
# Seed hls with 1 complete segment and 1 in process segment
|
||||||
segment = create_segment(sequence=0)
|
segment = create_segment(sequence=0)
|
||||||
|
@ -398,12 +400,14 @@ async def test_ll_hls_playlist_bad_msn_part(hass, hls_stream, stream_worker_sync
|
||||||
# The following two tests should fail immediately:
|
# The following two tests should fail immediately:
|
||||||
# - request with a _HLS_msn of 4
|
# - request with a _HLS_msn of 4
|
||||||
# - request with a _HLS_msn of 1 and a _HLS_part of num_completed_parts-1+advance_part_limit
|
# - request with a _HLS_msn of 1 and a _HLS_part of num_completed_parts-1+advance_part_limit
|
||||||
assert (await hls_client.get("/playlist.m3u8?_HLS_msn=4")).status == 400
|
assert (
|
||||||
|
await hls_client.get("/playlist.m3u8?_HLS_msn=4")
|
||||||
|
).status == HTTPStatus.BAD_REQUEST
|
||||||
assert (
|
assert (
|
||||||
await hls_client.get(
|
await hls_client.get(
|
||||||
f"/playlist.m3u8?_HLS_msn=1&_HLS_part={num_completed_parts-1+hass.data[DOMAIN][ATTR_SETTINGS].hls_advance_part_limit}"
|
f"/playlist.m3u8?_HLS_msn=1&_HLS_part={num_completed_parts-1+hass.data[DOMAIN][ATTR_SETTINGS].hls_advance_part_limit}"
|
||||||
)
|
)
|
||||||
).status == 400
|
).status == HTTPStatus.BAD_REQUEST
|
||||||
stream_worker_sync.resume()
|
stream_worker_sync.resume()
|
||||||
|
|
||||||
|
|
||||||
|
@ -478,8 +482,8 @@ async def test_ll_hls_playlist_rollover_part(
|
||||||
|
|
||||||
different_response, *same_responses = await requests
|
different_response, *same_responses = await requests
|
||||||
|
|
||||||
assert different_response.status == 200
|
assert different_response.status == HTTPStatus.OK
|
||||||
assert all(response.status == 200 for response in same_responses)
|
assert all(response.status == HTTPStatus.OK for response in same_responses)
|
||||||
different_playlist = await different_response.read()
|
different_playlist = await different_response.read()
|
||||||
same_playlists = [await response.read() for response in same_responses]
|
same_playlists = [await response.read() for response in same_responses]
|
||||||
assert different_playlist != same_playlists[0]
|
assert different_playlist != same_playlists[0]
|
||||||
|
@ -549,8 +553,8 @@ async def test_ll_hls_playlist_msn_part(hass, hls_stream, stream_worker_sync, hl
|
||||||
msn_responses = await msn_requests
|
msn_responses = await msn_requests
|
||||||
|
|
||||||
# All the responses should succeed except the last one which fails
|
# All the responses should succeed except the last one which fails
|
||||||
assert all(response.status == 200 for response in msn_responses[:-1])
|
assert all(response.status == HTTPStatus.OK for response in msn_responses[:-1])
|
||||||
assert msn_responses[-1].status == 400
|
assert msn_responses[-1].status == HTTPStatus.BAD_REQUEST
|
||||||
|
|
||||||
stream_worker_sync.resume()
|
stream_worker_sync.resume()
|
||||||
|
|
||||||
|
@ -600,7 +604,7 @@ async def test_get_part_segments(hass, hls_stream, stream_worker_sync, hls_sync)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
responses = await requests
|
responses = await requests
|
||||||
assert all(response.status == 200 for response in responses)
|
assert all(response.status == HTTPStatus.OK for response in responses)
|
||||||
assert all(
|
assert all(
|
||||||
[
|
[
|
||||||
await responses[i].read() == segment.parts[i].data
|
await responses[i].read() == segment.parts[i].data
|
||||||
|
@ -616,7 +620,7 @@ async def test_get_part_segments(hass, hls_stream, stream_worker_sync, hls_sync)
|
||||||
await hls_sync.wait_for_handler()
|
await hls_sync.wait_for_handler()
|
||||||
hls.part_put()
|
hls.part_put()
|
||||||
response = await request
|
response = await request
|
||||||
assert response.status == 404
|
assert response.status == HTTPStatus.NOT_FOUND
|
||||||
|
|
||||||
# Put the remaining parts and complete the segment
|
# Put the remaining parts and complete the segment
|
||||||
while remaining_parts:
|
while remaining_parts:
|
||||||
|
@ -641,7 +645,7 @@ async def test_get_part_segments(hass, hls_stream, stream_worker_sync, hls_sync)
|
||||||
complete_segment(segment)
|
complete_segment(segment)
|
||||||
# Check the response
|
# Check the response
|
||||||
response = await request
|
response = await request
|
||||||
assert response.status == 200
|
assert response.status == HTTPStatus.OK
|
||||||
assert (
|
assert (
|
||||||
await response.read()
|
await response.read()
|
||||||
== ALT_SEQUENCE_BYTES[: len(hls.get_segment(2).parts[0].data)]
|
== ALT_SEQUENCE_BYTES[: len(hls.get_segment(2).parts[0].data)]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
"""Test STT component setup."""
|
"""Test STT component setup."""
|
||||||
|
from http import HTTPStatus
|
||||||
|
|
||||||
from homeassistant.components import stt
|
from homeassistant.components import stt
|
||||||
from homeassistant.const import HTTP_NOT_FOUND
|
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ async def test_demo_settings_not_exists(hass, hass_client):
|
||||||
|
|
||||||
response = await client.get("/api/stt/beer")
|
response = await client.get("/api/stt/beer")
|
||||||
|
|
||||||
assert response.status == HTTP_NOT_FOUND
|
assert response.status == HTTPStatus.NOT_FOUND
|
||||||
|
|
||||||
|
|
||||||
async def test_demo_speech_not_exists(hass, hass_client):
|
async def test_demo_speech_not_exists(hass, hass_client):
|
||||||
|
@ -27,4 +27,4 @@ async def test_demo_speech_not_exists(hass, hass_client):
|
||||||
|
|
||||||
response = await client.post("/api/stt/beer", data=b"test")
|
response = await client.post("/api/stt/beer", data=b"test")
|
||||||
|
|
||||||
assert response.status == HTTP_NOT_FOUND
|
assert response.status == HTTPStatus.NOT_FOUND
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""Test system log component."""
|
"""Test system log component."""
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from http import HTTPStatus
|
||||||
import logging
|
import logging
|
||||||
import queue
|
import queue
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
@ -40,7 +41,7 @@ async def get_error_log(hass, hass_client, expected_count):
|
||||||
|
|
||||||
client = await hass_client()
|
client = await hass_client()
|
||||||
resp = await client.get("/api/error/all")
|
resp = await client.get("/api/error/all")
|
||||||
assert resp.status == 200
|
assert resp.status == HTTPStatus.OK
|
||||||
|
|
||||||
data = await resp.json()
|
data = await resp.json()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue