From 6e6ebb949528782731000e153ec89486980759cf Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 11 Apr 2020 11:17:57 -0500 Subject: [PATCH] Add tests for various NUT upses (#34034) --- tests/components/nut/test_config_flow.py | 11 ++-- tests/components/nut/test_sensor.py | 67 ++++++++++++++++++++++++ tests/components/nut/util.py | 47 +++++++++++++++++ tests/fixtures/nut/5E850I.json | 37 +++++++++++++ tests/fixtures/nut/CP1350C.json | 39 ++++++++++++++ tests/fixtures/nut/PR3000RT2U.json | 39 ++++++++++++++ 6 files changed, 232 insertions(+), 8 deletions(-) create mode 100644 tests/components/nut/test_sensor.py create mode 100644 tests/components/nut/util.py create mode 100644 tests/fixtures/nut/5E850I.json create mode 100644 tests/fixtures/nut/CP1350C.json create mode 100644 tests/fixtures/nut/PR3000RT2U.json diff --git a/tests/components/nut/test_config_flow.py b/tests/components/nut/test_config_flow.py index c110df0576a..360d97d13c4 100644 --- a/tests/components/nut/test_config_flow.py +++ b/tests/components/nut/test_config_flow.py @@ -1,10 +1,12 @@ """Test the Network UPS Tools (NUT) config flow.""" -from asynctest import MagicMock, patch +from asynctest import patch from homeassistant import config_entries, data_entry_flow, setup from homeassistant.components.nut.const import DOMAIN from homeassistant.const import CONF_RESOURCES +from .util import _get_mock_pynutclient + from tests.common import MockConfigEntry VALID_CONFIG = { @@ -15,13 +17,6 @@ VALID_CONFIG = { } -def _get_mock_pynutclient(list_vars=None, list_ups=None): - pynutclient = MagicMock() - type(pynutclient).list_ups = MagicMock(return_value=list_ups) - type(pynutclient).list_vars = MagicMock(return_value=list_vars) - return pynutclient - - async def test_form_user_one_ups(hass): """Test we get the form.""" await setup.async_setup_component(hass, "persistent_notification", {}) diff --git a/tests/components/nut/test_sensor.py b/tests/components/nut/test_sensor.py new file mode 100644 index 00000000000..2e461050507 --- /dev/null +++ b/tests/components/nut/test_sensor.py @@ -0,0 +1,67 @@ +"""The sensor tests for the nut platform.""" + + +from .util import async_init_integration + + +async def test_pr3000rt2u(hass): + """Test creation of PR3000RT2U sensors.""" + + await async_init_integration(hass, "PR3000RT2U", ["battery.charge"]) + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": "%", + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) + + +async def test_cp1350c(hass): + """Test creation of CP1350C sensors.""" + + await async_init_integration(hass, "CP1350C", ["battery.charge"]) + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": "%", + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) + + +async def test_5e850i(hass): + """Test creation of 5E850I sensors.""" + + await async_init_integration(hass, "5E850I", ["battery.charge"]) + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": "%", + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) diff --git a/tests/components/nut/util.py b/tests/components/nut/util.py new file mode 100644 index 00000000000..5bd29042ea8 --- /dev/null +++ b/tests/components/nut/util.py @@ -0,0 +1,47 @@ +"""Tests for the nut integration.""" + +import json + +from asynctest import MagicMock, patch + +from homeassistant.components.nut.const import DOMAIN +from homeassistant.const import CONF_HOST, CONF_PORT, CONF_RESOURCES +from homeassistant.core import HomeAssistant + +from tests.common import MockConfigEntry, load_fixture + + +def _get_mock_pynutclient(list_vars=None, list_ups=None): + pynutclient = MagicMock() + type(pynutclient).list_ups = MagicMock(return_value=list_ups) + type(pynutclient).list_vars = MagicMock(return_value=list_vars) + return pynutclient + + +async def async_init_integration( + hass: HomeAssistant, ups_fixture: str, resources: list +) -> MockConfigEntry: + """Set up the nexia integration in Home Assistant.""" + + ups_fixture = f"nut/{ups_fixture}.json" + list_vars = json.loads(load_fixture(ups_fixture)) + + import pprint + + pprint.pprint(list_vars) + + mock_pynut = _get_mock_pynutclient(list_ups={"ups1": "UPS 1"}, list_vars=list_vars) + + with patch( + "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, + ): + entry = MockConfigEntry( + domain=DOMAIN, + data={CONF_HOST: "mock", CONF_PORT: "mock", CONF_RESOURCES: resources}, + ) + entry.add_to_hass(hass) + + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + return entry diff --git a/tests/fixtures/nut/5E850I.json b/tests/fixtures/nut/5E850I.json new file mode 100644 index 00000000000..6488a5498bf --- /dev/null +++ b/tests/fixtures/nut/5E850I.json @@ -0,0 +1,37 @@ +{ + "driver.parameter.pollfreq" : "30", + "ups.power.nominal" : "850", + "battery.type" : "PbAc", + "driver.parameter.synchronous" : "no", + "driver.version" : "2.7.4", + "battery.runtime" : "1759", + "driver.version.internal" : "0.41", + "driver.name" : "usbhid-ups", + "outlet.desc" : "Main Outlet", + "ups.productid" : "ffff", + "ups.firmware" : "03.08.0018", + "output.frequency" : "50.0", + "device.model" : "5E 850i", + "output.voltage" : "238.0", + "ups.mfr" : "EATON", + "ups.load" : "21", + "outlet.id" : "1", + "device.type" : "ups", + "ups.timer.shutdown" : "-1", + "output.frequency.nominal" : "50", + "ups.delay.shutdown" : "20", + "input.voltage" : "240.0", + "ups.vendorid" : "0463", + "ups.model" : "5E 850i", + "driver.version.data" : "MGE HID 1.39", + "outlet.switchable" : "no", + "outlet.1.status" : "on", + "output.voltage.nominal" : "230", + "driver.parameter.port" : "auto", + "device.mfr" : "EATON", + "ups.start.battery" : "yes", + "ups.beeper.status" : "enabled", + "ups.status" : "OL", + "driver.parameter.pollinterval" : "2", + "battery.charge" : "100" +} diff --git a/tests/fixtures/nut/CP1350C.json b/tests/fixtures/nut/CP1350C.json new file mode 100644 index 00000000000..5f66883172c --- /dev/null +++ b/tests/fixtures/nut/CP1350C.json @@ -0,0 +1,39 @@ +{ + "device.model" : " CP 1350C", + "ups.model" : " CP 1350C", + "battery.voltage.nominal" : "12", + "ups.delay.start" : "30", + "ups.realpower.nominal" : "298", + "ups.vendorid" : "0764", + "ups.mfr" : "CPS", + "driver.version" : "2.7.4", + "ups.delay.shutdown" : "20", + "battery.type" : "PbAcid", + "battery.voltage" : "14.0", + "ups.load" : "27", + "battery.charge.low" : "10", + "ups.beeper.status" : "enabled", + "device.mfr" : "CPS", + "battery.runtime" : "1225", + "driver.version.internal" : "0.41", + "input.voltage.nominal" : "230", + "input.transfer.high" : "280", + "driver.version.data" : "CyberPower HID 0.4", + "driver.parameter.port" : "/dev/ttyS1", + "input.voltage" : "236.0", + "battery.runtime.low" : "300", + "driver.parameter.pollinterval" : "2", + "driver.parameter.pollfreq" : "30", + "ups.timer.shutdown" : "-60", + "input.transfer.low" : "180", + "device.type" : "ups", + "battery.mfr.date" : "CPS", + "battery.charge" : "100", + "battery.charge.warning" : "20", + "ups.productid" : "0501", + "driver.name" : "usbhid-ups", + "output.voltage" : "236.0", + "driver.parameter.synchronous" : "no", + "ups.timer.start" : "0", + "ups.status" : "OL" +} diff --git a/tests/fixtures/nut/PR3000RT2U.json b/tests/fixtures/nut/PR3000RT2U.json new file mode 100644 index 00000000000..22742366d18 --- /dev/null +++ b/tests/fixtures/nut/PR3000RT2U.json @@ -0,0 +1,39 @@ +{ + "ups.delay.shutdown" : "20", + "driver.parameter.pollfreq" : "30", + "ups.delay.start" : "30", + "ups.mfr" : "CPS", + "battery.charge.warning" : "35", + "battery.type" : "PbAcid", + "battery.charge" : "100", + "battery.mfr.date" : "CPS", + "output.voltage" : "264.0", + "ups.productid" : "0601", + "input.voltage.nominal" : "120", + "driver.parameter.port" : "auto", + "input.voltage" : "120.0", + "driver.version" : "DSM6-2-2-24922-broadwell-fmp-repack-24922-190507", + "ups.vendorid" : "0764", + "battery.voltage" : "1.2", + "device.model" : "PR3000RT2U", + "driver.parameter.pollinterval" : "5", + "device.type" : "ups", + "battery.charge.low" : "0", + "ups.model" : "PR3000RT2U", + "ups.test.result" : "No test initiated", + "driver.version.data" : "CyberPower HID 0.3", + "ups.serial" : "PYVJO2000034", + "battery.voltage.nominal" : "22", + "ups.beeper.status" : "enabled", + "battery.runtime.low" : "300", + "battery.runtime" : "2644", + "driver.version.internal" : "0.38", + "ups.realpower.nominal" : "3000", + "device.serial" : "PYVJO2000034", + "driver.name" : "usbhid-ups", + "device.mfr" : "CPS", + "ups.load" : "12", + "ups.timer.shutdown" : "0", + "ups.timer.start" : "0", + "ups.status" : "OL" +}