Files
core/tests/components/file/test_services.py
2025-09-23 22:25:56 +02:00

148 lines
4.3 KiB
Python

"""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)