mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-04-24 13:17:16 +00:00

It seems that the codebase is not formatted with the latest ruff version. This PR reformats the codebase with ruff 0.5.7.
288 lines
7.5 KiB
Python
288 lines
7.5 KiB
Python
"""Validate Add-on configs."""
|
|
|
|
import pytest
|
|
import voluptuous as vol
|
|
|
|
from supervisor.addons import validate as vd
|
|
from supervisor.addons.const import AddonBackupMode
|
|
|
|
from ..common import load_json_fixture
|
|
|
|
|
|
def test_basic_config():
|
|
"""Validate basic config and check the default values."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
valid_config = vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
assert valid_config["name"] == "Test Add-on"
|
|
assert valid_config["image"] == "test/{arch}-my-custom-addon"
|
|
|
|
# Check defaults
|
|
assert not valid_config["host_network"]
|
|
assert not valid_config["host_ipc"]
|
|
assert not valid_config["host_dbus"]
|
|
assert not valid_config["host_pid"]
|
|
assert not valid_config["host_uts"]
|
|
|
|
assert not valid_config["hassio_api"]
|
|
assert not valid_config["homeassistant_api"]
|
|
assert not valid_config["docker_api"]
|
|
|
|
|
|
def test_migration_startup():
|
|
"""Migrate Startup Type."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
config["startup"] = "before"
|
|
|
|
valid_config = vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
assert valid_config["startup"] == "services"
|
|
|
|
config["startup"] = "after"
|
|
|
|
valid_config = vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
assert valid_config["startup"] == "application"
|
|
|
|
|
|
def test_migration_auto_uart():
|
|
"""Migrate auto uart Type."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
config["auto_uart"] = True
|
|
|
|
valid_config = vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
assert valid_config["uart"]
|
|
assert "auto_uart" not in valid_config
|
|
|
|
|
|
def test_migration_devices():
|
|
"""Migrate devices Type."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
config["devices"] = ["test:test:rw", "bla"]
|
|
|
|
valid_config = vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
assert valid_config["devices"] == ["test", "bla"]
|
|
|
|
|
|
def test_migration_tmpfs():
|
|
"""Migrate tmpfs Type."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
config["tmpfs"] = "test:test:rw"
|
|
|
|
valid_config = vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
assert valid_config["tmpfs"]
|
|
|
|
|
|
def test_migration_backup():
|
|
"""Migrate snapshot to backup."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
config["snapshot"] = AddonBackupMode.HOT
|
|
config["snapshot_pre"] = "pre_command"
|
|
config["snapshot_post"] = "post_command"
|
|
config["snapshot_exclude"] = ["excludeed"]
|
|
|
|
valid_config = vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
assert valid_config.get("snapshot") is None
|
|
assert valid_config.get("snapshot_pre") is None
|
|
assert valid_config.get("snapshot_post") is None
|
|
assert valid_config.get("snapshot_exclude") is None
|
|
|
|
assert valid_config["backup"] == AddonBackupMode.HOT
|
|
assert valid_config["backup_pre"] == "pre_command"
|
|
assert valid_config["backup_post"] == "post_command"
|
|
assert valid_config["backup_exclude"] == ["excludeed"]
|
|
|
|
|
|
def test_invalid_repository():
|
|
"""Validate basic config with invalid repositories."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
config["image"] = "-invalid-something"
|
|
with pytest.raises(vol.Invalid):
|
|
vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
config["image"] = "ghcr.io/home-assistant/no-valid-repo:no-tag-allow"
|
|
with pytest.raises(vol.Invalid):
|
|
vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
config["image"] = (
|
|
"registry.gitlab.com/company/add-ons/test-example/text-example:no-tag-allow"
|
|
)
|
|
with pytest.raises(vol.Invalid):
|
|
vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
|
|
def test_valid_repository():
|
|
"""Validate basic config with different valid repositories."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
custom_registry = "registry.gitlab.com/company/add-ons/core/test-example"
|
|
config["image"] = custom_registry
|
|
valid_config = vd.SCHEMA_ADDON_CONFIG(config)
|
|
assert valid_config["image"] == custom_registry
|
|
|
|
|
|
def test_valid_map():
|
|
"""Validate basic config with different valid maps."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
config["map"] = ["backup:rw", "ssl:ro", "config"]
|
|
vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
|
|
def test_valid_basic_build():
|
|
"""Validate basic build config."""
|
|
config = load_json_fixture("basic-build-config.json")
|
|
|
|
vd.SCHEMA_BUILD_CONFIG(config)
|
|
|
|
|
|
async def test_valid_manifest_build():
|
|
"""Validate build config with manifest build from."""
|
|
config = load_json_fixture("build-config-manifest.json")
|
|
|
|
vd.SCHEMA_BUILD_CONFIG(config)
|
|
|
|
|
|
def test_valid_machine():
|
|
"""Validate valid machine config."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
config["machine"] = [
|
|
"intel-nuc",
|
|
"odroid-c2",
|
|
"odroid-n2",
|
|
"odroid-xu",
|
|
"qemuarm-64",
|
|
"qemuarm",
|
|
"qemux86-64",
|
|
"qemux86",
|
|
"raspberrypi",
|
|
"raspberrypi2",
|
|
"raspberrypi3-64",
|
|
"raspberrypi3",
|
|
"raspberrypi4-64",
|
|
"raspberrypi4",
|
|
"raspberrypi5-64",
|
|
"tinker",
|
|
]
|
|
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
config["machine"] = [
|
|
"!intel-nuc",
|
|
"!odroid-c2",
|
|
"!odroid-n2",
|
|
"!odroid-xu",
|
|
"!qemuarm-64",
|
|
"!qemuarm",
|
|
"!qemux86-64",
|
|
"!qemux86",
|
|
"!raspberrypi",
|
|
"!raspberrypi2",
|
|
"!raspberrypi3-64",
|
|
"!raspberrypi3",
|
|
"!raspberrypi4-64",
|
|
"!raspberrypi4",
|
|
"!raspberrypi5-64",
|
|
"!tinker",
|
|
]
|
|
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
config["machine"] = [
|
|
"odroid-n2",
|
|
"!odroid-xu",
|
|
"qemuarm-64",
|
|
"!qemuarm",
|
|
"qemux86-64",
|
|
"qemux86",
|
|
"raspberrypi",
|
|
"raspberrypi4-64",
|
|
"raspberrypi4",
|
|
"raspberrypi5-64",
|
|
"!tinker",
|
|
]
|
|
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
|
|
def test_invalid_machine():
|
|
"""Validate invalid machine config."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
config["machine"] = [
|
|
"intel-nuc",
|
|
"raspberrypi3",
|
|
"raspberrypi4-64",
|
|
"raspberrypi4",
|
|
"tinkerxy",
|
|
]
|
|
|
|
with pytest.raises(vol.Invalid):
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
config["machine"] = [
|
|
"intel-nuc",
|
|
"intel-nuc",
|
|
]
|
|
|
|
with pytest.raises(vol.Invalid):
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
|
|
def test_watchdog_url():
|
|
"""Test Valid watchdog options."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
for test_options in (
|
|
"tcp://[HOST]:[PORT:8123]",
|
|
"http://[HOST]:[PORT:8080]/health",
|
|
"https://[HOST]:[PORT:80]/",
|
|
):
|
|
config["watchdog"] = test_options
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
|
|
def test_valid_slug():
|
|
"""Test valid and invalid addon slugs."""
|
|
config = load_json_fixture("basic-addon-config.json")
|
|
|
|
# All examples pulled from https://analytics.home-assistant.io/addons.json
|
|
config["slug"] = "uptime-kuma"
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
config["slug"] = "hassio_google_drive_backup"
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
config["slug"] = "paradox_alarm_interface_3.x"
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
config["slug"] = "Lupusec2Mqtt"
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
# No whitespace
|
|
config["slug"] = "my addon"
|
|
with pytest.raises(vol.Invalid):
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
# No url control chars (or other non-word ascii characters)
|
|
config["slug"] = "a/b_&_c\\d_@ddon$:_test=#2?"
|
|
with pytest.raises(vol.Invalid):
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|
|
|
|
# No unicode
|
|
config["slug"] = "complemento telefónico"
|
|
with pytest.raises(vol.Invalid):
|
|
assert vd.SCHEMA_ADDON_CONFIG(config)
|