1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-13 08:42:18 +01:00
Files
esphome/tests/unit_tests/test_config_validation_paths.py
2025-09-10 08:17:34 -05:00

188 lines
5.9 KiB
Python

"""Tests for config_validation.py path-related functions."""
from pathlib import Path
import pytest
import voluptuous as vol
from esphome import config_validation as cv
def test_directory_valid_path(setup_core: Path) -> None:
"""Test directory validator with valid directory."""
test_dir = setup_core / "test_directory"
test_dir.mkdir()
result = cv.directory("test_directory")
assert result == "test_directory"
def test_directory_absolute_path(setup_core: Path) -> None:
"""Test directory validator with absolute path."""
test_dir = setup_core / "test_directory"
test_dir.mkdir()
result = cv.directory(str(test_dir))
assert result == str(test_dir)
def test_directory_nonexistent_path(setup_core: Path) -> None:
"""Test directory validator raises error for non-existent directory."""
with pytest.raises(
vol.Invalid, match="Could not find directory.*nonexistent_directory"
):
cv.directory("nonexistent_directory")
def test_directory_file_instead_of_directory(setup_core: Path) -> None:
"""Test directory validator raises error when path is a file."""
test_file = setup_core / "test_file.txt"
test_file.write_text("content")
with pytest.raises(vol.Invalid, match="is not a directory"):
cv.directory("test_file.txt")
def test_directory_with_parent_directory(setup_core: Path) -> None:
"""Test directory validator with nested directory structure."""
nested_dir = setup_core / "parent" / "child" / "grandchild"
nested_dir.mkdir(parents=True)
result = cv.directory("parent/child/grandchild")
assert result == "parent/child/grandchild"
def test_file_valid_path(setup_core: Path) -> None:
"""Test file_ validator with valid file."""
test_file = setup_core / "test_file.yaml"
test_file.write_text("test content")
result = cv.file_("test_file.yaml")
assert result == "test_file.yaml"
def test_file_absolute_path(setup_core: Path) -> None:
"""Test file_ validator with absolute path."""
test_file = setup_core / "test_file.yaml"
test_file.write_text("test content")
result = cv.file_(str(test_file))
assert result == str(test_file)
def test_file_nonexistent_path(setup_core: Path) -> None:
"""Test file_ validator raises error for non-existent file."""
with pytest.raises(vol.Invalid, match="Could not find file.*nonexistent_file.yaml"):
cv.file_("nonexistent_file.yaml")
def test_file_directory_instead_of_file(setup_core: Path) -> None:
"""Test file_ validator raises error when path is a directory."""
test_dir = setup_core / "test_directory"
test_dir.mkdir()
with pytest.raises(vol.Invalid, match="is not a file"):
cv.file_("test_directory")
def test_file_with_parent_directory(setup_core: Path) -> None:
"""Test file_ validator with file in nested directory."""
nested_dir = setup_core / "configs" / "sensors"
nested_dir.mkdir(parents=True)
test_file = nested_dir / "temperature.yaml"
test_file.write_text("sensor config")
result = cv.file_("configs/sensors/temperature.yaml")
assert result == "configs/sensors/temperature.yaml"
def test_directory_handles_trailing_slash(setup_core: Path) -> None:
"""Test directory validator handles trailing slashes correctly."""
test_dir = setup_core / "test_dir"
test_dir.mkdir()
result = cv.directory("test_dir/")
assert result == "test_dir/"
result = cv.directory("test_dir")
assert result == "test_dir"
def test_file_handles_various_extensions(setup_core: Path) -> None:
"""Test file_ validator works with different file extensions."""
yaml_file = setup_core / "config.yaml"
yaml_file.write_text("yaml content")
assert cv.file_("config.yaml") == "config.yaml"
yml_file = setup_core / "config.yml"
yml_file.write_text("yml content")
assert cv.file_("config.yml") == "config.yml"
txt_file = setup_core / "readme.txt"
txt_file.write_text("text content")
assert cv.file_("readme.txt") == "readme.txt"
no_ext_file = setup_core / "LICENSE"
no_ext_file.write_text("license content")
assert cv.file_("LICENSE") == "LICENSE"
def test_directory_with_symlink(setup_core: Path) -> None:
"""Test directory validator follows symlinks."""
actual_dir = setup_core / "actual_directory"
actual_dir.mkdir()
symlink_dir = setup_core / "symlink_directory"
symlink_dir.symlink_to(actual_dir)
result = cv.directory("symlink_directory")
assert result == "symlink_directory"
def test_file_with_symlink(setup_core: Path) -> None:
"""Test file_ validator follows symlinks."""
actual_file = setup_core / "actual_file.txt"
actual_file.write_text("content")
symlink_file = setup_core / "symlink_file.txt"
symlink_file.symlink_to(actual_file)
result = cv.file_("symlink_file.txt")
assert result == "symlink_file.txt"
def test_directory_error_shows_full_path(setup_core: Path) -> None:
"""Test directory validator error message includes full path."""
with pytest.raises(vol.Invalid, match=".*missing_dir.*full path:.*"):
cv.directory("missing_dir")
def test_file_error_shows_full_path(setup_core: Path) -> None:
"""Test file_ validator error message includes full path."""
with pytest.raises(vol.Invalid, match=".*missing_file.yaml.*full path:.*"):
cv.file_("missing_file.yaml")
def test_directory_with_spaces_in_name(setup_core: Path) -> None:
"""Test directory validator handles spaces in directory names."""
dir_with_spaces = setup_core / "my test directory"
dir_with_spaces.mkdir()
result = cv.directory("my test directory")
assert result == "my test directory"
def test_file_with_spaces_in_name(setup_core: Path) -> None:
"""Test file_ validator handles spaces in file names."""
file_with_spaces = setup_core / "my test file.yaml"
file_with_spaces.write_text("content")
result = cv.file_("my test file.yaml")
assert result == "my test file.yaml"