diff --git a/tests/test_blinkpy.py b/tests/test_blinkpy.py index 5d1c142..2d980ff 100644 --- a/tests/test_blinkpy.py +++ b/tests/test_blinkpy.py @@ -132,3 +132,59 @@ class TestBlinkSetup(unittest.TestCase): mock_networks.return_value = {} with self.assertRaises(BlinkSetupError): self.blink.setup_networks() + + @mock.patch("blinkpy.blinkpy.Auth.send_auth_key") + def test_setup_prompt_2fa(self, mock_key): + """Test setup with 2fa prompt.""" + self.blink.auth.data["username"] = "foobar" + self.blink.key_required = True + mock_key.return_value = True + with mock.patch("builtins.input", return_value="foo"): + self.blink.setup_prompt_2fa() + self.assertFalse(self.blink.key_required) + mock_key.return_value = False + with mock.patch("builtins.input", return_value="foo"): + self.blink.setup_prompt_2fa() + self.assertTrue(self.blink.key_required) + + @mock.patch("blinkpy.blinkpy.Blink.setup_camera_list") + @mock.patch("blinkpy.api.request_networks") + def test_setup_post_verify(self, mock_networks, mock_camera): + """Test setup after verification.""" + self.blink.available = False + self.blink.key_required = True + mock_networks.return_value = { + "summary": {"foo": {"onboarded": False, "name": "bar"}} + } + mock_camera.return_value = [] + self.assertTrue(self.blink.setup_post_verify()) + self.assertTrue(self.blink.available) + self.assertFalse(self.blink.key_required) + + @mock.patch("blinkpy.api.request_networks") + def test_setup_post_verify_failure(self, mock_networks): + """Test failed setup after verification.""" + self.blink.available = False + mock_networks.return_value = {} + self.assertFalse(self.blink.setup_post_verify()) + self.assertFalse(self.blink.available) + + def test_merge_cameras(self): + """Test merging of cameras.""" + self.blink.sync = { + "foo": MockSync({"test": 123, "foo": "bar"}), + "bar": MockSync({"fizz": "buzz", "bar": "foo"}), + } + combined = self.blink.merge_cameras() + self.assertEqual(combined["test"], 123) + self.assertEqual(combined["foo"], "bar") + self.assertEqual(combined["fizz"], "buzz") + self.assertEqual(combined["bar"], "foo") + + +class MockSync: + """Mock sync module class.""" + + def __init__(self, cameras): + """Initialize fake class.""" + self.cameras = cameras diff --git a/tests/test_cameras.py b/tests/test_cameras.py index f3d4121..01064bf 100644 --- a/tests/test_cameras.py +++ b/tests/test_cameras.py @@ -143,3 +143,12 @@ class TestBlinkCameraSetup(unittest.TestCase): self.camera.update(config, force_cache=True) self.assertEqual(self.camera.clip, None) self.assertEqual(self.camera.video_from_cache, None) + + @mock.patch("blinkpy.camera.api.request_motion_detection_enable") + @mock.patch("blinkpy.camera.api.request_motion_detection_disable") + def test_motion_detection_enable_disable(self, mock_dis, mock_en, mock_rep): + """Test setting motion detection enable properly.""" + mock_dis.return_value = "disable" + mock_en.return_value = "enable" + self.assertEqual(self.camera.set_motion_detect(True), "enable") + self.assertEqual(self.camera.set_motion_detect(False), "disable") diff --git a/tests/test_sync_module.py b/tests/test_sync_module.py index 78f3f0f..6dbc04e 100644 --- a/tests/test_sync_module.py +++ b/tests/test_sync_module.py @@ -65,11 +65,27 @@ class TestBlinkSyncModule(unittest.TestCase): mock_resp.return_value = {"event": True} self.assertEqual(self.blink.sync["test"].get_events(), True) + def test_get_events_fail(self, mock_resp): + """Test handling of failed get events function.""" + mock_resp.return_value = None + self.assertFalse(self.blink.sync["test"].get_events()) + mock_resp.return_value = {} + self.assertFalse(self.blink.sync["test"].get_events()) + def test_get_camera_info(self, mock_resp): """Test get camera info function.""" mock_resp.return_value = {"camera": ["foobar"]} self.assertEqual(self.blink.sync["test"].get_camera_info("1234"), "foobar") + def test_get_camera_info_fail(self, mock_resp): + """Test hadnling of failed get camera info function.""" + mock_resp.return_value = None + self.assertEqual(self.blink.sync["test"].get_camera_info("1"), []) + mock_resp.return_value = {} + self.assertEqual(self.blink.sync["test"].get_camera_info("1"), []) + mock_resp.return_value = {"camera": None} + self.assertEqual(self.blink.sync["test"].get_camera_info("1"), []) + def test_check_new_videos_startup(self, mock_resp): """Test that check_new_videos does not block startup.""" sync_module = self.blink.sync["test"] @@ -236,3 +252,8 @@ class TestBlinkSyncModule(unittest.TestCase): self.mock_start[5] = {} self.blink.sync["test"].start() self.assertEqual(self.blink.sync["test"].cameras, {"foo": None}) + + def test_sync_attributes(self, mock_resp): + """Test sync attributes.""" + self.assertEqual(self.blink.sync["test"].attributes["name"], "test") + self.assertEqual(self.blink.sync["test"].attributes["network_id"], "1234") diff --git a/tests/test_util.py b/tests/test_util.py index d515376..e26c112 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -3,7 +3,7 @@ import unittest from unittest import mock import time -from blinkpy.helpers.util import Throttle, time_to_seconds +from blinkpy.helpers.util import json_load, Throttle, time_to_seconds class TestUtil(unittest.TestCase): @@ -107,3 +107,9 @@ class TestUtil(unittest.TestCase): wrong_time = "1/1/1970 00:00:03" self.assertEqual(time_to_seconds(correct_time), 5) self.assertFalse(time_to_seconds(wrong_time)) + + def test_json_load_bad_data(self): + """Check that bad file is handled.""" + self.assertEqual(json_load("fake.file"), None) + with mock.patch("builtins.open", mock.mock_open(read_data="")): + self.assertEqual(json_load("fake.file"), None)