156 lines
5.8 KiB
Python
156 lines
5.8 KiB
Python
"""Tests camera and system functions."""
|
|
import unittest
|
|
from unittest import mock
|
|
import logging
|
|
import time
|
|
|
|
from blinkpy import blinkpy
|
|
from blinkpy.sync_module import BlinkSyncModule
|
|
from blinkpy.camera import BlinkCamera
|
|
from blinkpy.helpers.util import get_time, BlinkURLHandler
|
|
|
|
|
|
class MockSyncModule(BlinkSyncModule):
|
|
"""Mock blink sync module object."""
|
|
|
|
def get_network_info(self):
|
|
"""Mock network info method."""
|
|
return True
|
|
|
|
|
|
class MockCamera(BlinkCamera):
|
|
"""Mock blink camera object."""
|
|
|
|
def update(self, config, force_cache=False, **kwargs):
|
|
"""Mock camera update method."""
|
|
|
|
|
|
class TestBlinkFunctions(unittest.TestCase):
|
|
"""Test Blink and BlinkCamera functions in blinkpy."""
|
|
|
|
def setUp(self):
|
|
"""Set up Blink module."""
|
|
self.blink = blinkpy.Blink()
|
|
self.blink.urls = BlinkURLHandler("test")
|
|
|
|
def tearDown(self):
|
|
"""Clean up after test."""
|
|
self.blink = None
|
|
|
|
def test_merge_cameras(self):
|
|
"""Test merge camera functionality."""
|
|
first_dict = {"foo": "bar", "test": 123}
|
|
next_dict = {"foobar": 456, "bar": "foo"}
|
|
self.blink.sync["foo"] = BlinkSyncModule(self.blink, "foo", 1, [])
|
|
self.blink.sync["bar"] = BlinkSyncModule(self.blink, "bar", 2, [])
|
|
self.blink.sync["foo"].cameras = first_dict
|
|
self.blink.sync["bar"].cameras = next_dict
|
|
result = self.blink.merge_cameras()
|
|
expected = {"foo": "bar", "test": 123, "foobar": 456, "bar": "foo"}
|
|
self.assertEqual(expected, result)
|
|
|
|
@mock.patch("blinkpy.blinkpy.api.request_videos")
|
|
def test_download_video_exit(self, mock_req):
|
|
"""Test we exit method when provided bad response."""
|
|
blink = blinkpy.Blink()
|
|
# pylint: disable=protected-access
|
|
blinkpy._LOGGER.setLevel(logging.DEBUG)
|
|
blink.last_refresh = 0
|
|
mock_req.return_value = {}
|
|
formatted_date = get_time(blink.last_refresh)
|
|
expected_log = [
|
|
"INFO:blinkpy.blinkpy:Retrieving videos since {}".format(formatted_date),
|
|
"DEBUG:blinkpy.blinkpy:Processing page 1",
|
|
"INFO:blinkpy.blinkpy:No videos found on page 1. Exiting.",
|
|
]
|
|
with self.assertLogs() as dl_log:
|
|
blink.download_videos("/tmp")
|
|
self.assertEqual(dl_log.output, expected_log)
|
|
|
|
@mock.patch("blinkpy.blinkpy.api.request_videos")
|
|
def test_parse_downloaded_items(self, mock_req):
|
|
"""Test ability to parse downloaded items list."""
|
|
blink = blinkpy.Blink()
|
|
# pylint: disable=protected-access
|
|
blinkpy._LOGGER.setLevel(logging.DEBUG)
|
|
generic_entry = {
|
|
"created_at": "1970",
|
|
"device_name": "foo",
|
|
"deleted": True,
|
|
"media": "/bar.mp4",
|
|
}
|
|
result = [generic_entry]
|
|
mock_req.return_value = {"media": result}
|
|
blink.last_refresh = 0
|
|
formatted_date = get_time(blink.last_refresh)
|
|
expected_log = [
|
|
"INFO:blinkpy.blinkpy:Retrieving videos since {}".format(formatted_date),
|
|
"DEBUG:blinkpy.blinkpy:Processing page 1",
|
|
"DEBUG:blinkpy.blinkpy:foo: /bar.mp4 is marked as deleted.",
|
|
]
|
|
with self.assertLogs() as dl_log:
|
|
blink.download_videos("/tmp", stop=2, delay=0)
|
|
self.assertEqual(dl_log.output, expected_log)
|
|
|
|
@mock.patch("blinkpy.blinkpy.api.request_videos")
|
|
def test_parse_downloaded_throttle(self, mock_req):
|
|
"""Test ability to parse downloaded items list."""
|
|
generic_entry = {
|
|
"created_at": "1970",
|
|
"device_name": "foo",
|
|
"deleted": False,
|
|
"media": "/bar.mp4",
|
|
}
|
|
result = [generic_entry]
|
|
mock_req.return_value = {"media": result}
|
|
self.blink.last_refresh = 0
|
|
start = time.time()
|
|
self.blink.download_videos("/tmp", stop=2, delay=0, debug=True)
|
|
now = time.time()
|
|
delta = now - start
|
|
self.assertTrue(delta < 0.1)
|
|
|
|
start = time.time()
|
|
self.blink.download_videos("/tmp", stop=2, delay=0.1, debug=True)
|
|
now = time.time()
|
|
delta = now - start
|
|
self.assertTrue(delta >= 0.1)
|
|
|
|
@mock.patch("blinkpy.blinkpy.api.request_videos")
|
|
def test_parse_camera_not_in_list(self, mock_req):
|
|
"""Test ability to parse downloaded items list."""
|
|
blink = blinkpy.Blink()
|
|
# pylint: disable=protected-access
|
|
blinkpy._LOGGER.setLevel(logging.DEBUG)
|
|
generic_entry = {
|
|
"created_at": "1970",
|
|
"device_name": "foo",
|
|
"deleted": True,
|
|
"media": "/bar.mp4",
|
|
}
|
|
result = [generic_entry]
|
|
mock_req.return_value = {"media": result}
|
|
blink.last_refresh = 0
|
|
formatted_date = get_time(blink.last_refresh)
|
|
expected_log = [
|
|
"INFO:blinkpy.blinkpy:Retrieving videos since {}".format(formatted_date),
|
|
"DEBUG:blinkpy.blinkpy:Processing page 1",
|
|
"DEBUG:blinkpy.blinkpy:Skipping videos for foo.",
|
|
]
|
|
with self.assertLogs() as dl_log:
|
|
blink.download_videos("/tmp", camera="bar", stop=2, delay=0)
|
|
self.assertEqual(dl_log.output, expected_log)
|
|
|
|
@mock.patch("blinkpy.blinkpy.api.request_network_update")
|
|
@mock.patch("blinkpy.auth.Auth.query")
|
|
def test_refresh(self, mock_req, mock_update):
|
|
"""Test ability to refresh system."""
|
|
mock_update.return_value = {"network": {"sync_module_error": False}}
|
|
mock_req.return_value = None
|
|
self.blink.last_refresh = 0
|
|
self.blink.available = True
|
|
self.blink.sync["foo"] = MockSyncModule(self.blink, "foo", 1, [])
|
|
self.blink.cameras = {"bar": MockCamera(self.blink.sync)}
|
|
self.blink.sync["foo"].cameras = self.blink.cameras
|
|
self.assertTrue(self.blink.refresh())
|