From 188f3e35fdab484f368fcb6c238fed8392022f57 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 15 Apr 2020 20:28:03 -0500 Subject: [PATCH] Add tests for additional nut ups models (#34240) * Add NUT tests for an Eaton 5E650I UPS * add a test to make sure multiple ups get setup * Add a few more upses * fix missing status key * cover * Force CI run --- homeassistant/components/nut/config_flow.py | 7 ++ tests/components/nut/test_config_flow.py | 17 +++-- tests/components/nut/test_sensor.py | 75 +++++++++++++++++++++ tests/fixtures/nut/5E650I.json | 36 ++++++++++ tests/fixtures/nut/DL650ELCD.json | 39 +++++++++++ tests/fixtures/nut/blazer_usb.json | 28 ++++++++ 6 files changed, 198 insertions(+), 4 deletions(-) create mode 100644 tests/fixtures/nut/5E650I.json create mode 100644 tests/fixtures/nut/DL650ELCD.json create mode 100644 tests/fixtures/nut/blazer_usb.json diff --git a/homeassistant/components/nut/config_flow.py b/homeassistant/components/nut/config_flow.py index f1066fe2899..ba005f04a6a 100644 --- a/homeassistant/components/nut/config_flow.py +++ b/homeassistant/components/nut/config_flow.py @@ -21,6 +21,8 @@ from .const import ( DEFAULT_HOST, DEFAULT_PORT, DEFAULT_SCAN_INTERVAL, + KEY_STATUS, + KEY_STATUS_DISPLAY, SENSOR_NAME, SENSOR_TYPES, ) @@ -53,6 +55,11 @@ def _resource_schema_base(available_resources, selected_resources): if sensor_id in available_resources } + if KEY_STATUS in known_available_resources: + known_available_resources[KEY_STATUS_DISPLAY] = SENSOR_TYPES[ + KEY_STATUS_DISPLAY + ][SENSOR_NAME] + return { vol.Required(CONF_RESOURCES, default=selected_resources): cv.multi_select( known_available_resources diff --git a/tests/components/nut/test_config_flow.py b/tests/components/nut/test_config_flow.py index 5833d06c8a9..ac20c989de9 100644 --- a/tests/components/nut/test_config_flow.py +++ b/tests/components/nut/test_config_flow.py @@ -27,7 +27,7 @@ async def test_form_user_one_ups(hass): assert result["errors"] == {} mock_pynut = _get_mock_pynutclient( - list_vars={"battery.voltage": "voltage"}, list_ups=["ups1"] + list_vars={"battery.voltage": "voltage", "ups.status": "OL"}, list_ups=["ups1"] ) with patch( @@ -54,7 +54,8 @@ async def test_form_user_one_ups(hass): "homeassistant.components.nut.async_setup_entry", return_value=True, ) as mock_setup_entry: result3 = await hass.config_entries.flow.async_configure( - result2["flow_id"], {"resources": ["battery.voltage"]}, + result2["flow_id"], + {"resources": ["battery.voltage", "ups.status", "ups.status.display"]}, ) assert result3["type"] == "create_entry" @@ -63,7 +64,7 @@ async def test_form_user_one_ups(hass): "host": "1.1.1.1", "password": "test-password", "port": 2222, - "resources": ["battery.voltage"], + "resources": ["battery.voltage", "ups.status", "ups.status.display"], "username": "test-username", } await hass.async_block_till_done() @@ -74,6 +75,14 @@ async def test_form_user_one_ups(hass): async def test_form_user_multiple_ups(hass): """Test we get the form.""" await setup.async_setup_component(hass, "persistent_notification", {}) + + config_entry = MockConfigEntry( + domain=DOMAIN, + data={"host": "2.2.2.2", "port": 123, "resources": ["battery.charge"]}, + options={CONF_RESOURCES: ["battery.charge"]}, + ) + config_entry.add_to_hass(hass) + result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} ) @@ -134,7 +143,7 @@ async def test_form_user_multiple_ups(hass): } await hass.async_block_till_done() assert len(mock_setup.mock_calls) == 1 - assert len(mock_setup_entry.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 2 async def test_form_import(hass): diff --git a/tests/components/nut/test_sensor.py b/tests/components/nut/test_sensor.py index 430720785ca..64585538948 100644 --- a/tests/components/nut/test_sensor.py +++ b/tests/components/nut/test_sensor.py @@ -80,6 +80,31 @@ async def test_5e850i(hass): ) +async def test_5e650i(hass): + """Test creation of 5E650I sensors.""" + + await async_init_integration(hass, "5E650I", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert not entry + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online Battery Charging", + "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_backupsses600m1(hass): """Test creation of BACKUPSES600M1 sensors.""" @@ -132,3 +157,53 @@ async def test_cp1500pfclcd(hass): assert all( state.attributes[key] == expected_attributes[key] for key in expected_attributes ) + + +async def test_dl650elcd(hass): + """Test creation of DL650ELCD sensors.""" + + await async_init_integration(hass, "DL650ELCD", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert not entry + + 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": UNIT_PERCENTAGE, + } + # 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_blazer_usb(hass): + """Test creation of blazer_usb sensors.""" + + await async_init_integration(hass, "blazer_usb", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert not entry + + 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": UNIT_PERCENTAGE, + } + # 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/fixtures/nut/5E650I.json b/tests/fixtures/nut/5E650I.json new file mode 100644 index 00000000000..2f5eae5a86a --- /dev/null +++ b/tests/fixtures/nut/5E650I.json @@ -0,0 +1,36 @@ +{ + "driver.version.internal" : "0.38", + "outlet.switchable" : "no", + "driver.parameter.port" : "auto", + "device.model" : "5E 650i", + "ups.model" : "5E 650i", + "driver.parameter.pollfreq" : "30", + "ups.timer.shutdown" : "-1", + "ups.productid" : "ffff", + "ups.load" : "28", + "ups.delay.shutdown" : "20", + "ups.power.nominal" : "650", + "output.voltage.nominal" : "230", + "outlet.1.status" : "on", + "battery.type" : "PbAc", + "driver.version.data" : "MGE HID 1.33", + "ups.vendorid" : "0463", + "driver.parameter.pollinterval" : "5", + "ups.status" : "OL CHRG", + "driver.version" : "DSM6-2-2-24922-broadwell-fmp-repack-24922-190507", + "ups.firmware" : "03.08.0018", + "ups.start.battery" : "yes", + "output.frequency.nominal" : "50", + "battery.charge" : "100", + "outlet.id" : "1", + "output.frequency" : "49.9", + "driver.name" : "usbhid-ups", + "battery.runtime" : "1032", + "input.voltage" : "239.0", + "ups.beeper.status" : "enabled", + "device.mfr" : "EATON", + "device.type" : "ups", + "ups.mfr" : "EATON", + "output.voltage" : "238.0", + "outlet.desc" : "Main Outlet" +} diff --git a/tests/fixtures/nut/DL650ELCD.json b/tests/fixtures/nut/DL650ELCD.json new file mode 100644 index 00000000000..fe6686e7f6f --- /dev/null +++ b/tests/fixtures/nut/DL650ELCD.json @@ -0,0 +1,39 @@ +{ + "ups.delay.shutdown" : "20", + "battery.charge.warning" : "20", + "battery.runtime.low" : "300", + "device.type" : "ups", + "ups.load" : "33", + "driver.parameter.port" : "auto", + "driver.name" : "usbhid-ups", + "input.transfer.high" : "0", + "ups.mfr" : "CPS", + "ups.test.result" : "No test initiated", + "output.voltage" : "229.0", + "ups.vendorid" : "0764", + "ups.realpower.nominal" : "360", + "device.model" : "DL650ELCD", + "battery.voltage.nominal" : "12", + "battery.type" : "PbAcid", + "ups.model" : "DL650ELCD", + "ups.beeper.status" : "enabled", + "driver.version.data" : "CyberPower HID 0.3", + "device.mfr" : "CPS", + "driver.parameter.pollinterval" : "5", + "ups.status" : "OL", + "battery.mfr.date" : "CPS", + "battery.charge.low" : "10", + "input.voltage" : "230.0", + "driver.version" : "SDS5-2-2015Q1branch-5619-150904", + "input.transfer.low" : "0", + "driver.parameter.pollfreq" : "30", + "driver.version.internal" : "0.38", + "ups.productid" : "0501", + "ups.timer.shutdown" : "-60", + "input.voltage.nominal" : "230", + "battery.voltage" : "9.1", + "battery.charge" : "100", + "ups.timer.start" : "-60", + "battery.runtime" : "850", + "ups.delay.start" : "30" +} diff --git a/tests/fixtures/nut/blazer_usb.json b/tests/fixtures/nut/blazer_usb.json new file mode 100644 index 00000000000..4f9acf2a6f0 --- /dev/null +++ b/tests/fixtures/nut/blazer_usb.json @@ -0,0 +1,28 @@ +{ + "input.voltage.fault" : "228.4", + "ups.status" : "OL", + "ups.productid" : "0000", + "ups.beeper.status" : "enabled", + "input.current.nominal" : "4.0", + "driver.name" : "blazer_usb", + "input.voltage" : "228.4", + "battery.voltage.low" : "20.80", + "battery.charge" : "100", + "driver.version.internal" : "0.11", + "input.frequency.nominal" : "50", + "battery.voltage.high" : "26.00", + "driver.parameter.port" : "auto", + "ups.type" : "offline / line interactive", + "driver.parameter.pollinterval" : "5", + "device.type" : "ups", + "output.voltage" : "228.4", + "input.frequency" : "50.1", + "input.voltage.nominal" : "230", + "ups.delay.shutdown" : "30", + "battery.voltage.nominal" : "24.0", + "ups.load" : "7", + "driver.version" : "DSM6-2-2-24922-broadwell-fmp-repack-24922-190507", + "ups.vendorid" : "0001", + "battery.voltage" : "27.00", + "ups.delay.start" : "180" +}