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
This commit is contained in:
J. Nick Koston 2020-04-15 20:28:03 -05:00 committed by GitHub
parent 1f4cdda234
commit 188f3e35fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 198 additions and 4 deletions

View file

@ -21,6 +21,8 @@ from .const import (
DEFAULT_HOST, DEFAULT_HOST,
DEFAULT_PORT, DEFAULT_PORT,
DEFAULT_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL,
KEY_STATUS,
KEY_STATUS_DISPLAY,
SENSOR_NAME, SENSOR_NAME,
SENSOR_TYPES, SENSOR_TYPES,
) )
@ -53,6 +55,11 @@ def _resource_schema_base(available_resources, selected_resources):
if sensor_id in available_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 { return {
vol.Required(CONF_RESOURCES, default=selected_resources): cv.multi_select( vol.Required(CONF_RESOURCES, default=selected_resources): cv.multi_select(
known_available_resources known_available_resources

View file

@ -27,7 +27,7 @@ async def test_form_user_one_ups(hass):
assert result["errors"] == {} assert result["errors"] == {}
mock_pynut = _get_mock_pynutclient( 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( with patch(
@ -54,7 +54,8 @@ async def test_form_user_one_ups(hass):
"homeassistant.components.nut.async_setup_entry", return_value=True, "homeassistant.components.nut.async_setup_entry", return_value=True,
) as mock_setup_entry: ) as mock_setup_entry:
result3 = await hass.config_entries.flow.async_configure( 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" assert result3["type"] == "create_entry"
@ -63,7 +64,7 @@ async def test_form_user_one_ups(hass):
"host": "1.1.1.1", "host": "1.1.1.1",
"password": "test-password", "password": "test-password",
"port": 2222, "port": 2222,
"resources": ["battery.voltage"], "resources": ["battery.voltage", "ups.status", "ups.status.display"],
"username": "test-username", "username": "test-username",
} }
await hass.async_block_till_done() 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): async def test_form_user_multiple_ups(hass):
"""Test we get the form.""" """Test we get the form."""
await setup.async_setup_component(hass, "persistent_notification", {}) 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( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER} 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() await hass.async_block_till_done()
assert len(mock_setup.mock_calls) == 1 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): async def test_form_import(hass):

View file

@ -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): async def test_backupsses600m1(hass):
"""Test creation of BACKUPSES600M1 sensors.""" """Test creation of BACKUPSES600M1 sensors."""
@ -132,3 +157,53 @@ async def test_cp1500pfclcd(hass):
assert all( assert all(
state.attributes[key] == expected_attributes[key] for key in expected_attributes 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
)

36
tests/fixtures/nut/5E650I.json vendored Normal file
View file

@ -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"
}

39
tests/fixtures/nut/DL650ELCD.json vendored Normal file
View file

@ -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"
}

28
tests/fixtures/nut/blazer_usb.json vendored Normal file
View file

@ -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"
}