From 01babca0f454b6f844697fd4546ed29842b5e033 Mon Sep 17 00:00:00 2001 From: Kevin Fronczak Date: Fri, 12 May 2017 15:42:18 -0400 Subject: [PATCH] Added battery_string property to camera Ability to detect if battery is "OK" or "Low" --- CHANGES.rst | 8 +- blinkpy.py | 10 ++ helpers/constants.py | 2 +- tests/test_blink_cameras.py | 208 +++++++++++++++++++----------------- 4 files changed, 121 insertions(+), 107 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2a95b40..064dd5b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,15 +3,13 @@ Changelog A list of changes between each release -0.6.0.dev1 (unreleased) -^^^^^^^^^^^^^^^^^^ -- Added auto-reauthorization (token refresh) when a request fails due to an expired token - -0.6.0.dev0 (unreleased) +0.6.0 (unreleased) ^^^^^^^^^^^^^^^^^^ - Removed redundent properties that only called hidden variables - Revised request wrapper function to be more intelligent - Added tests to ensure exceptions are caught and handled (100% coverage!) +- Added auto-reauthorization (token refresh) when a request fails due to an expired token (@TySwift93) +- Added battery level string to reduce confusion with the way Blink reports battery level as integer from 0 to 3 0.5.2 (2017-03-12) ^^^^^^^^^^^^^^^^^^ diff --git a/blinkpy.py b/blinkpy.py index cae947c..c7ee92e 100644 --- a/blinkpy.py +++ b/blinkpy.py @@ -111,6 +111,16 @@ class BlinkCamera(object): """Return camera arm status.""" return self._status + @property + def battery_string(self): + """Return string indicating battery status.""" + if self.battery > 1 and self.battery <= 3: + return "OK" + elif self.battery >= 0: + return "Low" + else: + return "Unknown" + def snap_picture(self): """Take a picture with camera to create a new thumbnail.""" _request(self.blink, url=self.image_link, diff --git a/helpers/constants.py b/helpers/constants.py index 193d50b..543a2d2 100644 --- a/helpers/constants.py +++ b/helpers/constants.py @@ -6,7 +6,7 @@ import os MAJOR_VERSION = 0 MINOR_VERSION = 6 -PATCH_VERSION = '0.dev1' +PATCH_VERSION = '0.dev2' __version__ = '{}.{}.{}'.format(MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION) diff --git a/tests/test_blink_cameras.py b/tests/test_blink_cameras.py index dd5c62b..f660341 100644 --- a/tests/test_blink_cameras.py +++ b/tests/test_blink_cameras.py @@ -1,101 +1,107 @@ -""" -Tests the camera initialization and attributes of -individual BlinkCamera instantiations. -""" - -import unittest -from unittest import mock -import blinkpy -import tests.mock_responses as mresp - -USERNAME = 'foobar' -PASSWORD = 'deadbeef' - - -class TestBlinkCameraSetup(unittest.TestCase): - """Test the Blink class in blinkpy.""" - - def setUp(self): - """Set up Blink module.""" - self.blink = blinkpy.Blink(username=USERNAME, - password=PASSWORD) - - def tearDown(self): - """Clean up after test.""" - self.blink = None - - @mock.patch('blinkpy.blinkpy.requests.post', - side_effect=mresp.mocked_requests_post) - @mock.patch('blinkpy.blinkpy.requests.get', - side_effect=mresp.mocked_requests_get) - def test_camera_properties(self, mock_get, mock_post): - """Tests all property set/recall.""" - test_value = 'foobar' - test_region_id = list(mresp.LOGIN_RESPONSE['region'].keys())[0] - self.blink.setup_system() - for name in self.blink.cameras: - camera = self.blink.cameras[name] - camera.name = test_value - camera.clip = test_value + '.mp4' - camera.thumbnail = test_value + '.jpg' - camera.temperature = 10 - camera.battery = 0 - camera.notifications = 100 - camera.image_link = test_value + '/image.jpg' - camera.arm_link = test_value + '/arm' - camera.header = {'foo': 'bar'} - camera.motion = {'bar': 'foo'} - self.assertEqual(camera.clip, test_value + '.mp4') - self.assertEqual(camera.name, test_value) - self.assertEqual(camera.thumbnail, test_value + '.jpg') - self.assertEqual(camera.temperature, 10) - self.assertEqual(camera.battery, 0) - self.assertEqual(camera.notifications, 100) - self.assertEqual(camera.image_link, test_value + '/image.jpg') - self.assertEqual(camera.arm_link, test_value + '/arm') - self.assertEqual(camera.header, {'foo': 'bar'}) - self.assertEqual(camera.motion, {'bar': 'foo'}) - self.assertEqual(camera.region_id, test_region_id) - - @mock.patch('blinkpy.blinkpy.requests.post', - side_effect=mresp.mocked_requests_post) - @mock.patch('blinkpy.blinkpy.requests.get', - side_effect=mresp.mocked_requests_get) - def test_camera_values_from_setup(self, mock_get, mock_post): - """Tests all property values after camera setup.""" - self.blink.setup_system() - - # Get expected test values - test_network_id = str(mresp.NETWORKS_RESPONSE['networks'][0]['id']) - # pylint: disable=unused-variable - (region_id, region), = mresp.LOGIN_RESPONSE['region'].items() - # pylint: disable=protected-access - expected_header = self.blink._auth_header - test_urls = blinkpy.BlinkURLHandler(region_id) - - test_cameras = mresp.get_test_cameras(test_urls.base_url) - test_net_id_url = test_urls.network_url + test_network_id - for name in self.blink.cameras: - camera = self.blink.cameras[name] - self.assertEqual(name, camera.name) - if name in test_cameras: - self.assertEqual(camera.id, - test_cameras[name]['device_id']) - self.assertEqual(camera.armed, - test_cameras[name]['armed']) - self.assertEqual(camera.thumbnail, - test_cameras[name]['thumbnail']) - self.assertEqual(camera.temperature, - test_cameras[name]['temperature']) - self.assertEqual(camera.battery, - test_cameras[name]['battery']) - self.assertEqual(camera.notifications, - test_cameras[name]['notifications']) - else: - self.fail("Camera wasn't initialized: " + name) - - expected_arm_link = test_net_id_url + '/camera/' + camera.id + '/' - expected_image_link = expected_arm_link + 'thumbnail' - self.assertEqual(camera.image_link, expected_image_link) - self.assertEqual(camera.arm_link, expected_arm_link) - self.assertEqual(camera.header, expected_header) +""" +Tests the camera initialization and attributes of +individual BlinkCamera instantiations. +""" + +import unittest +from unittest import mock +import blinkpy +import tests.mock_responses as mresp + +USERNAME = 'foobar' +PASSWORD = 'deadbeef' + + +class TestBlinkCameraSetup(unittest.TestCase): + """Test the Blink class in blinkpy.""" + + def setUp(self): + """Set up Blink module.""" + self.blink = blinkpy.Blink(username=USERNAME, + password=PASSWORD) + + def tearDown(self): + """Clean up after test.""" + self.blink = None + + @mock.patch('blinkpy.blinkpy.requests.post', + side_effect=mresp.mocked_requests_post) + @mock.patch('blinkpy.blinkpy.requests.get', + side_effect=mresp.mocked_requests_get) + def test_camera_properties(self, mock_get, mock_post): + """Tests all property set/recall.""" + test_value = 'foobar' + test_region_id = list(mresp.LOGIN_RESPONSE['region'].keys())[0] + self.blink.setup_system() + for name in self.blink.cameras: + camera = self.blink.cameras[name] + camera.name = test_value + camera.clip = test_value + '.mp4' + camera.thumbnail = test_value + '.jpg' + camera.temperature = 10 + camera.battery = 0 + camera.notifications = 100 + camera.image_link = test_value + '/image.jpg' + camera.arm_link = test_value + '/arm' + camera.header = {'foo': 'bar'} + camera.motion = {'bar': 'foo'} + self.assertEqual(camera.clip, test_value + '.mp4') + self.assertEqual(camera.name, test_value) + self.assertEqual(camera.thumbnail, test_value + '.jpg') + self.assertEqual(camera.temperature, 10) + self.assertEqual(camera.battery, 0) + self.assertEqual(camera.notifications, 100) + self.assertEqual(camera.image_link, test_value + '/image.jpg') + self.assertEqual(camera.arm_link, test_value + '/arm') + self.assertEqual(camera.header, {'foo': 'bar'}) + self.assertEqual(camera.motion, {'bar': 'foo'}) + self.assertEqual(camera.region_id, test_region_id) + + self.assertEqual(camera.battery_string, "Low") + camera.battery = 3 + self.assertEqual(camera.battery_string, "OK") + camera.battery = -10 + self.assertEqual(camera.battery_string, "Unknown") + + @mock.patch('blinkpy.blinkpy.requests.post', + side_effect=mresp.mocked_requests_post) + @mock.patch('blinkpy.blinkpy.requests.get', + side_effect=mresp.mocked_requests_get) + def test_camera_values_from_setup(self, mock_get, mock_post): + """Tests all property values after camera setup.""" + self.blink.setup_system() + + # Get expected test values + test_network_id = str(mresp.NETWORKS_RESPONSE['networks'][0]['id']) + # pylint: disable=unused-variable + (region_id, region), = mresp.LOGIN_RESPONSE['region'].items() + # pylint: disable=protected-access + expected_header = self.blink._auth_header + test_urls = blinkpy.BlinkURLHandler(region_id) + + test_cameras = mresp.get_test_cameras(test_urls.base_url) + test_net_id_url = test_urls.network_url + test_network_id + for name in self.blink.cameras: + camera = self.blink.cameras[name] + self.assertEqual(name, camera.name) + if name in test_cameras: + self.assertEqual(camera.id, + test_cameras[name]['device_id']) + self.assertEqual(camera.armed, + test_cameras[name]['armed']) + self.assertEqual(camera.thumbnail, + test_cameras[name]['thumbnail']) + self.assertEqual(camera.temperature, + test_cameras[name]['temperature']) + self.assertEqual(camera.battery, + test_cameras[name]['battery']) + self.assertEqual(camera.notifications, + test_cameras[name]['notifications']) + else: + self.fail("Camera wasn't initialized: " + name) + + expected_arm_link = test_net_id_url + '/camera/' + camera.id + '/' + expected_image_link = expected_arm_link + 'thumbnail' + self.assertEqual(camera.image_link, expected_image_link) + self.assertEqual(camera.arm_link, expected_arm_link) + self.assertEqual(camera.header, expected_header)