mirror of
https://github.com/home-assistant/core.git
synced 2025-11-10 03:19:34 +00:00
148 lines
4.3 KiB
Python
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)
|