Skip to content

Commit

Permalink
Add DSMR Reader tests (home-assistant#115808)
Browse files Browse the repository at this point in the history
* Add DSMR Reader sensor tests

* Change to paramatization

* Removing patch

* Emulate the test

* Go for 100% test coverage

* Adding defintions.py

* Add myself as code owner to keep improving
  • Loading branch information
erwindouna authored May 28, 2024
1 parent 98710e6 commit fb95b91
Show file tree
Hide file tree
Showing 5 changed files with 180 additions and 6 deletions.
3 changes: 0 additions & 3 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -256,9 +256,6 @@ omit =
homeassistant/components/dormakaba_dkey/sensor.py
homeassistant/components/dovado/*
homeassistant/components/downloader/__init__.py
homeassistant/components/dsmr_reader/__init__.py
homeassistant/components/dsmr_reader/definitions.py
homeassistant/components/dsmr_reader/sensor.py
homeassistant/components/dte_energy_bridge/sensor.py
homeassistant/components/dublin_bus_transport/sensor.py
homeassistant/components/dunehd/__init__.py
Expand Down
4 changes: 2 additions & 2 deletions CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -342,8 +342,8 @@ build.json @home-assistant/supervisor
/tests/components/drop_connect/ @ChandlerSystems @pfrazer
/homeassistant/components/dsmr/ @Robbie1221 @frenck
/tests/components/dsmr/ @Robbie1221 @frenck
/homeassistant/components/dsmr_reader/ @sorted-bits @glodenox
/tests/components/dsmr_reader/ @sorted-bits @glodenox
/homeassistant/components/dsmr_reader/ @sorted-bits @glodenox @erwindouna
/tests/components/dsmr_reader/ @sorted-bits @glodenox @erwindouna
/homeassistant/components/duotecno/ @cereal2nd
/tests/components/duotecno/ @cereal2nd
/homeassistant/components/dwd_weather_warnings/ @runningman84 @stephan192 @andarotajo
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/dsmr_reader/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"domain": "dsmr_reader",
"name": "DSMR Reader",
"codeowners": ["@sorted-bits", "@glodenox"],
"codeowners": ["@sorted-bits", "@glodenox", "@erwindouna"],
"config_flow": true,
"dependencies": ["mqtt"],
"documentation": "https://www.home-assistant.io/integrations/dsmr_reader",
Expand Down
111 changes: 111 additions & 0 deletions tests/components/dsmr_reader/test_definitions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
"""Test the DSMR Reader definitions."""

import pytest

from homeassistant.components.dsmr_reader.const import DOMAIN
from homeassistant.components.dsmr_reader.definitions import (
DSMRReaderSensorEntityDescription,
dsmr_transform,
tariff_transform,
)
from homeassistant.components.dsmr_reader.sensor import DSMRSensor
from homeassistant.const import STATE_UNKNOWN
from homeassistant.core import HomeAssistant

from tests.common import MockConfigEntry, async_fire_mqtt_message
from tests.typing import MqttMockHAClient


@pytest.mark.parametrize(
("input", "expected"),
[
("20", 2.0),
("version 5", "version 5"),
],
)
async def test_dsmr_transform(input, expected) -> None:
"""Test the dsmr_transform function."""
assert dsmr_transform(input) == expected


@pytest.mark.parametrize(
("input", "expected"),
[
("1", "low"),
("0", "high"),
],
)
async def test_tariff_transform(input, expected) -> None:
"""Test the tariff_transform function."""
assert tariff_transform(input) == expected


async def test_entity_tariff(
hass: HomeAssistant,
mqtt_mock: MqttMockHAClient,
):
"""Test the state attribute of DSMRReaderSensorEntityDescription when a tariff transform is needed."""
config_entry = MockConfigEntry(
domain=DOMAIN,
title=DOMAIN,
options={},
entry_id="TEST_ENTRY_ID",
unique_id="UNIQUE_TEST_ID",
)
config_entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()

# Test if the payload is empty
async_fire_mqtt_message(hass, "dsmr/meter-stats/electricity_tariff", "")
await hass.async_block_till_done()

electricity_tariff = "sensor.dsmr_meter_stats_electricity_tariff"
assert hass.states.get(electricity_tariff).state == STATE_UNKNOWN

# Test high tariff
async_fire_mqtt_message(hass, "dsmr/meter-stats/electricity_tariff", "0")
await hass.async_block_till_done()
assert hass.states.get(electricity_tariff).state == "high"

# Test low tariff
async_fire_mqtt_message(hass, "dsmr/meter-stats/electricity_tariff", "1")
await hass.async_block_till_done()
assert hass.states.get(electricity_tariff).state == "low"


async def test_entity_dsmr_transform(hass: HomeAssistant, mqtt_mock: MqttMockHAClient):
"""Test the state attribute of DSMRReaderSensorEntityDescription when a dsmr transform is needed."""
config_entry = MockConfigEntry(
domain=DOMAIN,
title=DOMAIN,
options={},
entry_id="TEST_ENTRY_ID",
unique_id="UNIQUE_TEST_ID",
)
config_entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()

# Create the entity, since it's not by default
description = DSMRReaderSensorEntityDescription(
key="dsmr/meter-stats/dsmr_version",
name="version_test",
state=dsmr_transform,
)
sensor = DSMRSensor(description, config_entry)
sensor.hass = hass
await sensor.async_added_to_hass()

# Test dsmr version, if it's a digit
async_fire_mqtt_message(hass, "dsmr/meter-stats/dsmr_version", "42")
await hass.async_block_till_done()

dsmr_version = "sensor.dsmr_meter_stats_dsmr_version"
assert hass.states.get(dsmr_version).state == "4.2"

# Test dsmr version, if it's not a digit
async_fire_mqtt_message(hass, "dsmr/meter-stats/dsmr_version", "version 5")
await hass.async_block_till_done()

assert hass.states.get(dsmr_version).state == "version 5"
66 changes: 66 additions & 0 deletions tests/components/dsmr_reader/test_sensor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
"""Tests for DSMR Reader sensor."""

from homeassistant.components.dsmr_reader.const import DOMAIN
from homeassistant.components.dsmr_reader.definitions import (
DSMRReaderSensorEntityDescription,
)
from homeassistant.components.dsmr_reader.sensor import DSMRSensor
from homeassistant.const import STATE_UNKNOWN
from homeassistant.core import HomeAssistant

from tests.common import MockConfigEntry, async_fire_mqtt_message
from tests.typing import MqttMockHAClient


async def test_dsmr_sensor_mqtt(
hass: HomeAssistant,
mqtt_mock: MqttMockHAClient,
) -> None:
"""Test the DSMRSensor class, via an emluated MQTT message."""
config_entry = MockConfigEntry(
domain=DOMAIN,
title=DOMAIN,
options={},
entry_id="TEST_ENTRY_ID",
unique_id="UNIQUE_TEST_ID",
)
config_entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()

electricity_delivered_1 = "sensor.dsmr_reading_electricity_delivered_1"
assert hass.states.get(electricity_delivered_1).state == STATE_UNKNOWN

electricity_delivered_2 = "sensor.dsmr_reading_electricity_delivered_2"
assert hass.states.get(electricity_delivered_2).state == STATE_UNKNOWN

# Test if the payload is empty
async_fire_mqtt_message(hass, "dsmr/reading/electricity_delivered_1", "")
await hass.async_block_till_done()
async_fire_mqtt_message(hass, "dsmr/reading/electricity_delivered_2", "")
await hass.async_block_till_done()

assert hass.states.get(electricity_delivered_1).state == STATE_UNKNOWN
assert hass.states.get(electricity_delivered_2).state == STATE_UNKNOWN

# Test if the payload is not empty
async_fire_mqtt_message(hass, "dsmr/reading/electricity_delivered_1", "1050.39")
await hass.async_block_till_done()
async_fire_mqtt_message(hass, "dsmr/reading/electricity_delivered_2", "2001.12")
await hass.async_block_till_done()

assert hass.states.get(electricity_delivered_1).state == "1050.39"
assert hass.states.get(electricity_delivered_2).state == "2001.12"

# Create a test entity to ensure the entity_description.state is not None
description = DSMRReaderSensorEntityDescription(
key="DSMR_TEST_KEY",
name="DSMR_TEST_NAME",
state=lambda x: x,
)
sensor = DSMRSensor(description, config_entry)
sensor.hass = hass
await sensor.async_added_to_hass()
async_fire_mqtt_message(hass, "DSMR_TEST_KEY", "192.8")
await hass.async_block_till_done()
assert sensor.native_value == "192.8"

0 comments on commit fb95b91

Please sign in to comment.