-
-
Notifications
You must be signed in to change notification settings - Fork 37.7k
Add additional sensors for Arlo Baby camera #15074
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 17 commits
88a0a43
ac179ca
a6ce54f
35e7541
9c07039
fe94826
5890a18
fe532ed
c15964a
597904a
046c62b
273909b
f9b793d
4178527
61a5821
7f3a096
39c8639
d4610af
07a1ebf
b994e56
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,218 @@ | ||
| """The tests for the Netgear Arlo sensors.""" | ||
| from collections import namedtuple | ||
| from unittest.mock import patch, MagicMock | ||
| import pytest | ||
| from homeassistant.const import ( | ||
| DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_HUMIDITY, ATTR_ATTRIBUTION) | ||
| from homeassistant.components.sensor import arlo | ||
| from homeassistant.components.arlo import DATA_ARLO | ||
|
|
||
|
|
||
| def _get_named_tuple(input_dict): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| return namedtuple('Struct', input_dict.keys())(*input_dict.values()) | ||
|
|
||
|
|
||
| def _get_sensor(name='Last', sensor_type='last_capture', data=None): | ||
| if data is None: | ||
| data = {} | ||
| return arlo.ArloSensor(name, data, sensor_type) | ||
|
|
||
|
|
||
| @pytest.fixture() | ||
| def default_sensor(): | ||
| """Create an ArloSensor with default values.""" | ||
| return _get_sensor() | ||
|
|
||
|
|
||
| @pytest.fixture() | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| def battery_sensor(): | ||
| """Create an ArloSensor with battery data.""" | ||
| data = _get_named_tuple({ | ||
| 'battery_level': 50 | ||
| }) | ||
| return _get_sensor('Battery Level', 'battery_level', data) | ||
|
|
||
|
|
||
| @pytest.fixture() | ||
| def temperature_sensor(): | ||
| """Create a temperature ArloSensor.""" | ||
| return _get_sensor('Temperature', 'temperature') | ||
|
|
||
|
|
||
| @pytest.fixture() | ||
| def humidity_sensor(): | ||
| """Create a humidity ArloSensor.""" | ||
| data = _get_named_tuple({ | ||
| 'model_id': 'ABC1000' | ||
| }) | ||
| return _get_sensor('Humidity', 'humidity', data) | ||
|
|
||
|
|
||
| @pytest.fixture() | ||
| def cameras_sensor(): | ||
| """Create a total cameras ArloSensor.""" | ||
| data = _get_named_tuple({ | ||
| 'cameras': [0, 0] | ||
| }) | ||
| return _get_sensor('Arlo Cameras', 'total_cameras', data) | ||
|
|
||
|
|
||
| @pytest.fixture() | ||
| def captured_sensor(): | ||
| """Create a captured today ArloSensor.""" | ||
| data = _get_named_tuple({ | ||
| 'captured_today': [0, 0, 0, 0, 0] | ||
| }) | ||
| return _get_sensor('Captured Today', 'captured_today', data) | ||
|
|
||
|
|
||
| class PlatformSetupFixture(): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Fixture for testing platform setup call to add_devices().""" | ||
|
|
||
| def __init__(self): | ||
| """Instantiate the platform setup fixture.""" | ||
| self.sensors = None | ||
| self.update = False | ||
|
|
||
| def add_devices(self, sensors, update): | ||
| """Mock method for adding devices.""" | ||
| self.sensors = sensors | ||
| self.update = update | ||
|
|
||
|
|
||
| @pytest.fixture() | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| def platform_setup(): | ||
| """Create an instance of the PlatformSetupFixture class.""" | ||
| return PlatformSetupFixture() | ||
|
|
||
|
|
||
| @pytest.fixture() | ||
| def sensor_with_hass_data(default_sensor, hass): | ||
| """Create a sensor with async_dispatcher_connected mocked.""" | ||
| hass.data = {} | ||
| default_sensor.hass = hass | ||
| return default_sensor | ||
|
|
||
|
|
||
| def test_setup_with_no_data(platform_setup, hass): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test setup_platform with no data.""" | ||
| arlo.setup_platform(hass, None, platform_setup.add_devices) | ||
| assert platform_setup.sensors is None | ||
| assert not platform_setup.update | ||
|
|
||
|
|
||
| def test_setup_with_valid_data(platform_setup, hass): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test setup_platform with valid data.""" | ||
| config = { | ||
| 'monitored_conditions': [ | ||
| 'last_capture', | ||
| 'total_cameras', | ||
| 'captured_today', | ||
| 'battery_level', | ||
| 'signal_strength', | ||
| 'temperature', | ||
| 'humidity', | ||
| 'air_quality' | ||
| ] | ||
| } | ||
|
|
||
| hass.data[DATA_ARLO] = _get_named_tuple({ | ||
| 'cameras': [_get_named_tuple({ | ||
| 'name': 'Camera', | ||
| 'model_id': 'ABC1000' | ||
| })], | ||
| 'base_stations': [_get_named_tuple({ | ||
| 'name': 'Base Station', | ||
| 'model_id': 'ABC1000' | ||
| })] | ||
| }) | ||
|
|
||
| arlo.setup_platform(hass, config, platform_setup.add_devices) | ||
| assert len(platform_setup.sensors) == 8 | ||
| assert platform_setup.update | ||
|
|
||
|
|
||
| def test_sensor_name(default_sensor): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test the name property.""" | ||
| assert default_sensor.name == 'Last' | ||
|
|
||
|
|
||
| async def test_async_added_to_hass(sensor_with_hass_data): | ||
| """Test dispatcher called when added.""" | ||
| with patch( | ||
| 'homeassistant.components.sensor.arlo.async_dispatcher_connect', | ||
| MagicMock()) as mock: | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. visually indented line with same indent as next logical line |
||
| await sensor_with_hass_data.async_added_to_hass() | ||
| assert len(mock.mock_calls) == 1 | ||
| kall = mock.call_args | ||
| args, kwargs = kall | ||
| assert len(args) == 3 | ||
| assert args[0] == sensor_with_hass_data.hass | ||
| assert args[1] == 'arlo_update' | ||
| assert not kwargs | ||
|
|
||
|
|
||
| def test_sensor_state_default(default_sensor): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test the state property.""" | ||
| assert default_sensor.state is None | ||
|
|
||
|
|
||
| def test_sensor_icon_battery(battery_sensor): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test the battery icon.""" | ||
| assert battery_sensor.icon == 'mdi:battery-50' | ||
|
|
||
|
|
||
| def test_sensor_icon(temperature_sensor): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test the icon property.""" | ||
| assert temperature_sensor.icon == 'mdi:thermometer' | ||
|
|
||
|
|
||
| def test_unit_of_measure(default_sensor, battery_sensor): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test the unit_of_measurement property.""" | ||
| assert default_sensor.unit_of_measurement is None | ||
| assert battery_sensor.unit_of_measurement == '%' | ||
|
|
||
|
|
||
| def test_device_class(default_sensor, temperature_sensor, humidity_sensor): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test the device_class property.""" | ||
| assert default_sensor.device_class is None | ||
| assert temperature_sensor.device_class == DEVICE_CLASS_TEMPERATURE | ||
| assert humidity_sensor.device_class == DEVICE_CLASS_HUMIDITY | ||
|
|
||
|
|
||
| def test_update_total_cameras(cameras_sensor): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test update method for total_cameras sensor type.""" | ||
| cameras_sensor.update() | ||
| assert cameras_sensor.state == 2 | ||
|
|
||
|
|
||
| def test_update_captured_today(captured_sensor): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test update method for captured_today sensor type.""" | ||
| captured_sensor.update() | ||
| assert captured_sensor.state == 5 | ||
|
|
||
|
|
||
| def test_attributes_known_sensor(humidity_sensor): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test attributes for known sensor type.""" | ||
| attrs = humidity_sensor.device_state_attributes | ||
| assert attrs.get(ATTR_ATTRIBUTION) == 'Data provided by arlo.netgear.com' | ||
| assert attrs.get('brand') == 'Netgear Arlo' | ||
| assert attrs.get('model') == 'ABC1000' | ||
|
|
||
|
|
||
| def _test_update(sensor_type, key, value): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| data = _get_named_tuple({ | ||
| key: value | ||
| }) | ||
| sensor = _get_sensor('test', sensor_type, data) | ||
| sensor.update() | ||
| assert sensor.state == value | ||
|
|
||
|
|
||
| def test_update(): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. expected 2 blank lines, found 1 |
||
| """Test update method for direct transcription sensor types.""" | ||
| _test_update('battery_level', 'battery_level', 100) | ||
| _test_update('signal_strength', 'signal_strength', 100) | ||
| _test_update('temperature', 'ambient_temperature', 21.4) | ||
| _test_update('humidity', 'ambient_humidity', 45.1) | ||
| _test_update('air_quality', 'ambient_air_quality', 14.2) | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add a test or update the test where all sensor types are set up, and test that attributes return ok also for the total cameras type. I think we need to add a check here where we don't add the model attribute for that sensor type.