Aufgebaut wie ha-ninlight: die Abbilder liegen unter ninstrip_firmware im Konfigurationsverzeichnis, Home Assistant liefert sie selbst unter einer einmaligen Adresse aus, und zwar genau die Bytes, die vorher geprueft wurden. Dazu firmware.py (Anhaenger, Versionsreihenfolge, WLAN-Pruefung, Katalog), http.py, urls.py und shared.py. Drei Unterschiede zu ninlight, alle aus der Firmware heraus: * Verglichen wird device_type - die Platine -, nicht product. Letzteres ist bei allen Platinen 'ninstrip'; die Abbilder unterscheiden sich aber hart, die K1Y invertiert das Datensignal und die KL-RGBC3 nicht. Firmware ohne dieses Feld bekommt gar kein Angebot. * Die WLAN-Pruefung sucht die SSID unverpackt: ein ESP32-Abbild ist nicht gzip-verpackt wie das des W600. An einem mit sdkconfig.local gebauten Abbild gegengeprueft - die SSID steht genau einmal NUL-gerahmt drin. * Der Fehlerschluessel heisst device_url_too_long statt lamp_url_too_long. Dazu das Testgeruest, das es hier bisher gar nicht gab: 204 Tests in tests_unit/ (ohne HA-Instanz) und tests/ (mit), Abdeckung 97 %, dazu scripts/check.sh als Ersatz fuer die fehlende CI. Die Nutzdaten in tests_unit/samples.py sind an der Stehlampe abgefragt. Beim Gegenpruefen per Mutation fiel auf, dass die Platinenpruefung unmittelbar vor dem Senden ungeprueft war - der Test dazu ist jetzt da und faellt, wenn man die Pruefung entfernt.
60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
"""Einrichten, Entladen und das Geraet in der Registrierung."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from unittest.mock import MagicMock
|
|
|
|
from homeassistant.config_entries import ConfigEntryState
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import device_registry as dr
|
|
from pytest_homeassistant_custom_component.common import MockConfigEntry
|
|
|
|
from custom_components.ninstrip.api import NinstripAuthError, NinstripConnectionError
|
|
from custom_components.ninstrip.const import DOMAIN
|
|
from tests_unit.samples import MAC_K1Y
|
|
|
|
|
|
async def test_einrichten_und_entladen(
|
|
hass: HomeAssistant, init_integration: MockConfigEntry
|
|
) -> None:
|
|
assert init_integration.state is ConfigEntryState.LOADED
|
|
assert await hass.config_entries.async_unload(init_integration.entry_id)
|
|
await hass.async_block_till_done()
|
|
assert init_integration.state is ConfigEntryState.NOT_LOADED
|
|
|
|
|
|
async def test_geraet_traegt_mac_modell_und_version(
|
|
hass: HomeAssistant, init_integration: MockConfigEntry
|
|
) -> None:
|
|
geraet = dr.async_get(hass).async_get_device_by_identifier(
|
|
(DOMAIN, MAC_K1Y), init_integration.entry_id
|
|
)
|
|
assert geraet is not None
|
|
assert geraet.manufacturer == "ninstrip"
|
|
# Das Modell beschreibt den Strip, nicht das Produkt - das steht in model_id.
|
|
assert geraet.model == "sk6812_rgbw, 60 Pixel"
|
|
assert geraet.model_id == "ninstrip"
|
|
assert geraet.sw_version == "0.1.0-12-g71a57"
|
|
assert (dr.CONNECTION_NETWORK_MAC, MAC_K1Y) in geraet.connections
|
|
|
|
|
|
async def test_unerreichbares_geraet_wird_spaeter_erneut_versucht(
|
|
hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_client: MagicMock
|
|
) -> None:
|
|
mock_client.get_state.side_effect = NinstripConnectionError("weg")
|
|
mock_config_entry.add_to_hass(hass)
|
|
assert not await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY
|
|
|
|
|
|
async def test_abgelehntes_token_verlangt_neue_anmeldung(
|
|
hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_client: MagicMock
|
|
) -> None:
|
|
mock_client.get_state.side_effect = NinstripAuthError("abgelehnt")
|
|
mock_config_entry.add_to_hass(hass)
|
|
assert not await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
assert mock_config_entry.state is ConfigEntryState.SETUP_ERROR
|
|
assert any(
|
|
flow["context"]["source"] == "reauth" for flow in hass.config_entries.flow.async_progress()
|
|
)
|