82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
"""Tests de l'unique binary sensor Arkteos."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
from unittest.mock import Mock
|
|
|
|
from custom_components.arkteos.binary_sensor import ArkteosConnectionBinarySensor
|
|
from custom_components.arkteos.const import DOMAIN
|
|
|
|
|
|
class FakeClient:
|
|
def __init__(self, available: bool = False) -> None:
|
|
self.available = available
|
|
self.callbacks: list[object] = []
|
|
|
|
def add_availability_callback(self, callback) -> None:
|
|
self.callbacks.append(callback)
|
|
|
|
def remove_availability_callback(self, callback) -> None:
|
|
self.callbacks.remove(callback)
|
|
|
|
|
|
def test_binary_sensor_is_created() -> None:
|
|
assert ArkteosConnectionBinarySensor(FakeClient()) is not None
|
|
|
|
|
|
def test_unique_id_is_stable() -> None:
|
|
assert ArkteosConnectionBinarySensor(FakeClient()).unique_id == "arkteos_zuran4_connection"
|
|
|
|
|
|
def test_connectivity_translation_is_present_and_specific() -> None:
|
|
entity = ArkteosConnectionBinarySensor(FakeClient())
|
|
french = json.loads(
|
|
(Path(__file__).parents[1] / "custom_components" / "arkteos" / "translations" / "fr.json").read_text()
|
|
)
|
|
assert entity.has_entity_name
|
|
assert entity.translation_key == "connectivity"
|
|
assert french["entity"]["binary_sensor"]["connectivity"]["name"] == "Connexion"
|
|
|
|
|
|
def test_device_info_is_correct() -> None:
|
|
info = ArkteosConnectionBinarySensor(FakeClient()).device_info
|
|
assert info["identifiers"] == {(DOMAIN, "arkteos_zuran4")}
|
|
assert info["manufacturer"] == "Arkteos"
|
|
assert info["model"] == "Zuran 4"
|
|
|
|
|
|
def test_is_on_when_client_is_available() -> None:
|
|
assert ArkteosConnectionBinarySensor(FakeClient(True)).is_on
|
|
|
|
|
|
def test_is_off_when_client_is_unavailable() -> None:
|
|
assert not ArkteosConnectionBinarySensor(FakeClient(False)).is_on
|
|
|
|
|
|
def test_availability_callback_writes_state() -> None:
|
|
client = FakeClient()
|
|
entity = ArkteosConnectionBinarySensor(client)
|
|
entity.async_write_ha_state = Mock()
|
|
entity._handle_availability(True)
|
|
entity.async_write_ha_state.assert_called_once()
|
|
|
|
|
|
def test_callback_is_removed_before_entity_removal() -> None:
|
|
client = FakeClient()
|
|
entity = ArkteosConnectionBinarySensor(client)
|
|
client.add_availability_callback(entity._handle_availability)
|
|
client.remove_availability_callback(entity._handle_availability)
|
|
assert client.callbacks == []
|
|
|
|
|
|
def test_no_polling_method_is_declared() -> None:
|
|
entity = ArkteosConnectionBinarySensor(FakeClient())
|
|
assert not hasattr(entity, "async_update")
|
|
|
|
|
|
def test_binary_sensor_is_read_only() -> None:
|
|
source = ArkteosConnectionBinarySensor.__module__
|
|
assert source == "custom_components.arkteos.binary_sensor"
|