"""Einmalige Firmware-Adressen und die Adresse, unter der Geraete HA erreichen.""" from __future__ import annotations from pathlib import Path from homeassistant.core import HomeAssistant from homeassistant.core_config import async_process_ha_core_config from homeassistant.exceptions import HomeAssistantError import pytest from pytest_homeassistant_custom_component.typing import ClientSessionGenerator from custom_components.ninstrip.const import CONF_DEVICE_BASE_URL from custom_components.ninstrip.http import OtaRegistry, device_base_url from custom_components.ninstrip.shared import DATA_SHARED from tests_unit.images import build_image def test_schluessel_sind_einmalig_und_43_zeichen_lang() -> None: registry = OtaRegistry() schluessel = {registry.create(b"nutzdaten") for _ in range(50)} assert len(schluessel) == 50 assert all(len(k) == 43 for k in schluessel) assert len(registry) == 50 async def test_die_ausgabe_liefert_nur_die_eigenen_bytes( hass: HomeAssistant, hass_client_no_auth: ClientSessionGenerator, init_integration, firmware_dir: Path, ) -> None: registry = hass.data[DATA_SHARED].registry meins = build_image() anderes = build_image(version="0.1.1-rc1") schluessel = registry.create(meins) anderer = registry.create(anderes) client = await hass_client_no_auth() antwort = await client.get(f"/api/ninstrip/firmware/{schluessel}") assert antwort.status == 200 assert await antwort.read() == meins andere_antwort = await client.get(f"/api/ninstrip/firmware/{anderer}") assert andere_antwort.status == 200 assert await andere_antwort.read() == anderes assert (await client.get("/api/ninstrip/firmware/" + "x" * 43)).status == 404 registry.revoke(schluessel) assert (await client.get(f"/api/ninstrip/firmware/{schluessel}")).status == 404 # Ein zurueckgezogener Schluessel zieht keinen anderen mit. assert (await client.get(f"/api/ninstrip/firmware/{anderer}")).status == 200 async def test_die_eingestellte_adresse_hat_vorrang(hass: HomeAssistant) -> None: await async_process_ha_core_config(hass, {"internal_url": "http://192.168.1.60:8123"}) assert ( device_base_url(hass, {CONF_DEVICE_BASE_URL: "http://192.168.1.50:8123"}) == "http://192.168.1.50:8123" ) async def test_sonst_gilt_die_interne_http_adresse(hass: HomeAssistant) -> None: await async_process_ha_core_config(hass, {"internal_url": "http://192.168.1.60:8123"}) assert device_base_url(hass, {}) == "http://192.168.1.60:8123" async def test_https_wird_abgelehnt(hass: HomeAssistant) -> None: """Die Firmware laedt nur ueber schlichtes http (esp_https_ota mit ALLOW_HTTP).""" await async_process_ha_core_config(hass, {"internal_url": "https://ha.local:8123"}) with pytest.raises(HomeAssistantError) as raised: device_base_url(hass, {}) assert raised.value.translation_key == "no_http_url" async def test_ohne_jede_adresse(hass: HomeAssistant) -> None: with pytest.raises(HomeAssistantError) as raised: device_base_url(hass, {}) assert raised.value.translation_key == "no_http_url"