Files
core/tests/components/file/test_services.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

148 lines
4.3 KiB
Python
Raw Permalink Normal View History

"""The tests for the notify file platform."""
from unittest.mock import MagicMock
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.file import DOMAIN
from homeassistant.components.file.services import (
ATTR_FILE_ENCODING,
ATTR_FILE_NAME,
SERVICE_READ_FILE,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
@pytest.mark.parametrize(
("file_name", "file_encoding"),
[
("tests/components/file/fixtures/file_read.json", "json"),
("tests/components/file/fixtures/file_read.yaml", "yaml"),
("tests/components/file/fixtures/file_read_list.yaml", "yaml"),
],
)
async def test_read_file(
hass: HomeAssistant,
mock_is_allowed_path: MagicMock,
setup_ha_file_integration,
file_name: str,
file_encoding: str,
snapshot: SnapshotAssertion,
) -> None:
"""Test reading files in supported formats."""
result = await hass.services.async_call(
DOMAIN,
SERVICE_READ_FILE,
{
ATTR_FILE_NAME: file_name,
ATTR_FILE_ENCODING: file_encoding,
},
blocking=True,
return_response=True,
)
assert result == snapshot
async def test_read_file_disallowed_path(
hass: HomeAssistant,
setup_ha_file_integration,
) -> None:
"""Test reading in a disallowed path generates error."""
file_name = "tests/components/file/fixtures/file_read.json"
with pytest.raises(ServiceValidationError) as sve:
await hass.services.async_call(
DOMAIN,
SERVICE_READ_FILE,
{
ATTR_FILE_NAME: file_name,
ATTR_FILE_ENCODING: "json",
},
blocking=True,
return_response=True,
)
assert file_name in str(sve.value)
assert sve.value.translation_key == "no_access_to_path"
assert sve.value.translation_domain == DOMAIN
async def test_read_file_bad_encoding_option(
hass: HomeAssistant,
mock_is_allowed_path: MagicMock,
setup_ha_file_integration,
) -> None:
"""Test handling error if an invalid encoding is specified."""
file_name = "tests/components/file/fixtures/file_read.json"
with pytest.raises(ServiceValidationError) as sve:
await hass.services.async_call(
DOMAIN,
SERVICE_READ_FILE,
{
ATTR_FILE_NAME: file_name,
ATTR_FILE_ENCODING: "invalid",
},
blocking=True,
return_response=True,
)
assert file_name in str(sve.value)
assert "invalid" in str(sve.value)
assert sve.value.translation_key == "unsupported_file_encoding"
assert sve.value.translation_domain == DOMAIN
@pytest.mark.parametrize(
("file_name", "file_encoding"),
[
("tests/components/file/fixtures/file_read.not_json", "json"),
("tests/components/file/fixtures/file_read.not_yaml", "yaml"),
],
)
async def test_read_file_decoding_error(
hass: HomeAssistant,
mock_is_allowed_path: MagicMock,
setup_ha_file_integration,
file_name: str,
file_encoding: str,
) -> None:
"""Test decoding errors are handled correctly."""
with pytest.raises(HomeAssistantError) as hae:
await hass.services.async_call(
DOMAIN,
SERVICE_READ_FILE,
{
ATTR_FILE_NAME: file_name,
ATTR_FILE_ENCODING: file_encoding,
},
blocking=True,
return_response=True,
)
assert file_name in str(hae.value)
assert file_encoding in str(hae.value)
assert hae.value.translation_key == "file_decoding"
assert hae.value.translation_domain == DOMAIN
async def test_read_file_dne(
hass: HomeAssistant,
mock_is_allowed_path: MagicMock,
setup_ha_file_integration,
) -> None:
"""Test handling error if file does not exist."""
file_name = "tests/components/file/fixtures/file_dne.yaml"
with pytest.raises(HomeAssistantError) as hae:
_ = await hass.services.async_call(
DOMAIN,
SERVICE_READ_FILE,
{
ATTR_FILE_NAME: file_name,
ATTR_FILE_ENCODING: "yaml",
},
blocking=True,
return_response=True,
)
assert file_name in str(hae.value)