From 1b1235210eaa14c7b09e14c67c7a3efa657ae5b2 Mon Sep 17 00:00:00 2001 From: Kevin Fronczak Date: Thu, 27 Sep 2018 11:07:31 -0400 Subject: [PATCH] Split up tests, added cache test --- tests/test_blink_functions.py | 37 ------ ...{test_blink_cameras.py => test_cameras.py} | 84 +++++++++++--- tests/test_sync_module.py | 107 ++++++++++++++++++ 3 files changed, 177 insertions(+), 51 deletions(-) rename tests/{test_blink_cameras.py => test_cameras.py} (63%) create mode 100644 tests/test_sync_module.py diff --git a/tests/test_blink_functions.py b/tests/test_blink_functions.py index 44b77f0..5a32d12 100644 --- a/tests/test_blink_functions.py +++ b/tests/test_blink_functions.py @@ -75,38 +75,6 @@ class TestBlinkFunctions(unittest.TestCase): self.config = {} self.camera = None - def test_get_videos(self): - """Test video access.""" - self.blink.sync.return_value = [ - { - 'camera_name': 'foobar', - 'address': '/new/test.mp4', - 'thumbnail': '/test/thumb' - } - ] - self.blink.sync.get_videos() - self.assertEqual(self.blink.sync.videos['foobar'][0]['clip'], - '/new/test.mp4') - self.assertEqual(self.blink.sync.videos['foobar'][0]['thumb'], - '/test/thumb') - - @mock.patch('blinkpy.sync_module.BlinkSyncModule.refresh') - @mock.patch('blinkpy.sync_module.BlinkSyncModule._summary_request') - @mock.patch('blinkpy.sync_module.BlinkSyncModule._video_request') - def test_get_cameras(self, vid_req, req, refresh): - """Test camera extraction.""" - refresh.return_value = True - req.return_value = {'devices': [self.config]} - vid_req.return_value = [ - { - 'camera_name': 'foobar', - 'address': '/new.mp4', - 'thumbnail': '/new' - } - ] - self.blink.sync.get_cameras() - self.assertTrue('foobar' in self.blink.sync.cameras) - def test_image_refresh(self): """Test image refresh function.""" self.blink.sync.return_value = {'devices': [self.config]} @@ -114,11 +82,6 @@ class TestBlinkFunctions(unittest.TestCase): self.assertEqual(image, 'https://rest.test.{}/test.jpg'.format(BLINK_URL)) - def test_video_count(self): - """Test video count function.""" - self.blink.sync.return_value = {'count': 1} - self.assertEqual(self.blink.sync.video_count, 1) - @mock.patch('blinkpy.sync_module.BlinkSyncModule.camera_config_request') @mock.patch('blinkpy.sync_module.BlinkSyncModule._video_request') def test_refresh(self, vid_req, req): diff --git a/tests/test_blink_cameras.py b/tests/test_cameras.py similarity index 63% rename from tests/test_blink_cameras.py rename to tests/test_cameras.py index 068de45..8eb5f7f 100644 --- a/tests/test_blink_cameras.py +++ b/tests/test_cameras.py @@ -50,9 +50,13 @@ class TestBlinkCameraSetup(unittest.TestCase): 'region_id': 'test' } + header = { + 'Host': 'abc.zxc', + 'TOKEN_AUTH': mresp.LOGIN_RESPONSE['authtoken']['authtoken'] + } self.blink.urls = BlinkURLHandler('test') self.blink.network_id = '0000' - self.blink.sync = BlinkSyncModule(self.blink, dict(), self.blink.urls) + self.sync = BlinkSyncModule(self.blink, header, self.blink.urls) def tearDown(self): """Clean up after test.""" @@ -68,12 +72,12 @@ class TestBlinkCameraSetup(unittest.TestCase): """Tests all property set/recall.""" self.blink.urls = BlinkURLHandler('test') - self.blink.sync.cameras = { - 'foobar': BlinkCamera(self.camera_config, self.blink.sync) + self.sync.cameras = { + 'foobar': BlinkCamera(self.camera_config, self.sync) } - for name in self.blink.sync.cameras: - camera = self.blink.sync.cameras[name] + for name in self.sync.cameras: + camera = self.sync.cameras[name] camera.update(self.camera_config, skip_cache=True) self.assertEqual(camera.id, '1111') self.assertEqual(camera.name, 'foobar') @@ -102,8 +106,8 @@ class TestBlinkCameraSetup(unittest.TestCase): camera_config['temp'] = 60 camera_config['battery'] = 0 camera_config['notifications'] = 4 - for name in self.blink.sync.cameras: - camera = self.blink.sync.cameras[name] + for name in self.sync.cameras: + camera = self.sync.cameras[name] camera.update(camera_config, skip_cache=True) self.assertEqual(camera.armed, True) self.assertEqual( @@ -124,9 +128,9 @@ class TestBlinkCameraSetup(unittest.TestCase): def test_camera_case(self): """Tests camera case sensitivity.""" - camera_object = BlinkCamera(self.camera_config, self.blink.sync) - self.blink.sync.cameras['foobar'] = camera_object - self.assertEqual(camera_object, self.blink.sync.cameras['fOoBaR']) + camera_object = BlinkCamera(self.camera_config, self.sync) + self.sync.cameras['foobar'] = camera_object + self.assertEqual(camera_object, self.sync.cameras['fOoBaR']) @mock.patch('blinkpy.sync_module.BlinkSyncModule.camera_config_request', return_value=CAMERA_CFG) @@ -134,12 +138,12 @@ class TestBlinkCameraSetup(unittest.TestCase): """Tests camera attributes.""" self.blink.urls = BlinkURLHandler('test') - self.blink.sync.cameras = { - 'foobar': BlinkCamera(self.camera_config, self.blink.sync) + self.sync.cameras = { + 'foobar': BlinkCamera(self.camera_config, self.sync) } - for name in self.blink.sync.cameras: - camera = self.blink.sync.cameras[name] + for name in self.sync.cameras: + camera = self.sync.cameras[name] camera.update(self.camera_config, skip_cache=True) camera_attr = camera.attributes self.assertEqual(camera_attr['device_id'], '1111') @@ -160,3 +164,55 @@ class TestBlinkCameraSetup(unittest.TestCase): self.assertEqual(camera_attr['network_id'], '0000') self.assertEqual(camera_attr['motion_enabled'], True) self.assertEqual(camera_attr['wifi_strength'], -30) + + @mock.patch('blinkpy.camera.BlinkCamera.image_refresh', + side_effect='refresh/url') + @mock.patch('blinkpy.helpers.util.requests.get', + side_effect=mresp.mocked_requests_get) + def test_camera_cache(self, req, img_refresh): + """Tests camera cache.""" + update_vals = { + 'name': 'foobar', + 'active': 'disabled', + 'video': '/clip.mp4', + 'thumbnail': '/image', + 'battery': 3, + 'notifications': 1, + } + self.sync.cameras = { + 'foobar': BlinkCamera(self.camera_config, self.sync) + } + + test_image = 'https://rest.test.immedia-semi.com/image.jpg' + test_clip = 'https://rest.test.immedia-semi.com/clip.mp4' + + for name, camera in self.sync.cameras.items(): + # Check that no cache returns None + self.assertEqual(camera.name, name) + self.assertEqual(camera.image_from_cache, None) + self.assertEqual(camera.video_from_cache, None) + + # Now, call an update with a new thumbnail to see if we update + self.sync.records = [] + # pylint: disable=protected-access + camera.update(update_vals) + self.assertEqual(camera.thumbnail, test_image) + self.assertEqual(camera.image_from_cache.status_code, 200) + + # Now update the clip + self.sync.record_dates = {camera.name: ['7', '1', '4', '3']} + self.assertEqual(camera.last_record, list()) + camera.update(update_vals) + self.assertEqual(camera.clip, test_clip) + self.assertEqual(camera.last_record, list('7')) + # First update should be false + self.assertEqual(camera.motion_detected, False) + self.sync.record_dates[camera.name].append('88') + camera.update(update_vals) + self.assertEqual(camera.last_record, ['88', '7']) + self.assertEqual(camera.motion_detected, True) + self.assertEqual(camera.video_from_cache.status_code, 200) + # Next update shouldn't change records, and motion_dected=False + camera.update(update_vals) + self.assertEqual(camera.motion_detected, False) + self.assertEqual(camera.video_from_cache.status_code, 200) diff --git a/tests/test_sync_module.py b/tests/test_sync_module.py new file mode 100644 index 0000000..1f7587d --- /dev/null +++ b/tests/test_sync_module.py @@ -0,0 +1,107 @@ +"""Tests camera and system functions.""" +import unittest +from unittest import mock + +from blinkpy import blinkpy +from blinkpy.sync_module import BlinkSyncModule +from blinkpy.camera import BlinkCamera + +USERNAME = 'foobar' +PASSWORD = 'deadbeef' + + +class MockSyncModule(BlinkSyncModule): + """Mock http requests from sync module.""" + + def __init__(self, blink, header): + """Create mock sync module instance.""" + super().__init__(blink, header) + self.blink = blink + self.header = header + self.return_value = None + self.return_value2 = None + + def http_get(self, url, stream=False, json=True): + """Mock get request.""" + if stream and self.return_value2 is not None: + return self.return_value2 + return self.return_value + + def http_post(self, url): + """Mock post request.""" + return self.return_value + + +class TestBlinkSyncModule(unittest.TestCase): + """Test BlinkSyncModule functions in blinkpy.""" + + def setUp(self): + """Set up Blink module.""" + self.blink = blinkpy.Blink(username=USERNAME, + password=PASSWORD) + # pylint: disable=protected-access + self.blink._auth_header = { + 'Host': 'test.url.tld', + 'TOKEN_AUTH': 'foobar123' + } + self.blink.urls = blinkpy.BlinkURLHandler('test') + self.config = { + 'device_id': 1111, + 'name': 'foobar', + 'armed': False, + 'active': 'disabled', + 'thumbnail': '/test', + 'video': '/test.mp4', + 'temp': 80, + 'battery': 3, + 'notifications': 2, + 'region_id': 'test', + 'device_type': 'camera' + } + self.blink.sync = MockSyncModule( + self.blink, self.blink._auth_header) + + self.camera = BlinkCamera(self.config, self.blink.sync) + + def tearDown(self): + """Clean up after test.""" + self.blink = None + self.config = {} + self.camera = None + + def test_get_videos(self): + """Test video access.""" + self.blink.sync.return_value = [ + { + 'camera_name': 'foobar', + 'address': '/new/test.mp4', + 'thumbnail': '/test/thumb' + } + ] + self.blink.sync.get_videos() + self.assertEqual(self.blink.sync.videos['foobar'][0]['clip'], + '/new/test.mp4') + self.assertEqual(self.blink.sync.videos['foobar'][0]['thumb'], + '/test/thumb') + + @mock.patch('blinkpy.sync_module.BlinkSyncModule.refresh') + @mock.patch('blinkpy.sync_module.BlinkSyncModule._summary_request') + @mock.patch('blinkpy.sync_module.BlinkSyncModule._video_request') + def test_get_cameras(self, vid_req, req, refresh): + """Test camera extraction.""" + refresh.return_value = True + req.return_value = {'devices': [self.config]} + vid_req.return_value = [ + { + 'camera_name': 'foobar', + 'address': '/new.mp4', + 'thumbnail': '/new' + } + ] + self.blink.sync.get_cameras() + self.assertTrue('foobar' in self.blink.sync.cameras) + + def test_video_count(self): + """Test video count function.""" + self.blink.sync.return_value = {'count': 1} + self.assertEqual(self.blink.sync.video_count, 1)