136 lines
5.6 KiB
Python
136 lines
5.6 KiB
Python
"""Test login handler."""
|
|
|
|
import unittest
|
|
from unittest import mock
|
|
from blinkpy.login_handler import LoginHandler
|
|
import tests.mock_responses as mresp
|
|
|
|
USERNAME = "foobar"
|
|
PASSWORD = "deadbeef"
|
|
|
|
|
|
@mock.patch("blinkpy.helpers.util.Session.send", side_effect=mresp.mocked_session_send)
|
|
class TestLoginHandler(unittest.TestCase):
|
|
"""Test the LoginHandler class in blinkpy."""
|
|
|
|
def setUp(self):
|
|
"""Set up Login Handler."""
|
|
self.login_handler = LoginHandler()
|
|
|
|
def tearDown(self):
|
|
"""Clean up after test."""
|
|
self.login_handler = None
|
|
|
|
@mock.patch("blinkpy.login_handler.getpass")
|
|
def test_manual_login(self, getpwd, mock_sess):
|
|
"""Check that we can manually use the login() function."""
|
|
getpwd.return_value = PASSWORD
|
|
with mock.patch("builtins.input", return_value=USERNAME):
|
|
self.assertTrue(self.login_handler.check_login())
|
|
self.assertEqual(self.login_handler.data["username"], USERNAME)
|
|
self.assertEqual(self.login_handler.data["password"], PASSWORD)
|
|
|
|
def test_no_cred_file(self, mock_sess):
|
|
"""Check that we return false when cred file doesn't exist."""
|
|
self.login_handler.cred_file = "/tmp/fake.file"
|
|
self.assertFalse(self.login_handler.check_cred_file())
|
|
|
|
@mock.patch("blinkpy.login_handler.isfile")
|
|
def test_exit_on_missing_json(self, mockisfile, mock_sess):
|
|
"""Test that we fail on missing json data."""
|
|
self.login_handler.cred_file = "/tmp/fake.file"
|
|
mockisfile.return_value = True
|
|
with mock.patch("builtins.open", mock.mock_open(read_data="{}")):
|
|
self.assertFalse(self.login_handler.check_cred_file())
|
|
|
|
@mock.patch("blinkpy.login_handler.json.load")
|
|
@mock.patch("blinkpy.login_handler.isfile")
|
|
def test_cred_file(self, mockisfile, mockjson, mock_sess):
|
|
"""Test that loading credential file works."""
|
|
self.login_handler.cred_file = "/tmp/fake.file"
|
|
mockjson.return_value = {"username": "foo", "password": "bar"}
|
|
mockisfile.return_value = True
|
|
with mock.patch("builtins.open", mock.mock_open(read_data="")):
|
|
self.assertTrue(self.login_handler.check_cred_file())
|
|
self.assertEqual(self.login_handler.data["username"], "foo")
|
|
self.assertEqual(self.login_handler.data["password"], "bar")
|
|
|
|
def test_bad_response(self, mock_sess):
|
|
"""Check bad response from server."""
|
|
self.assertFalse(self.login_handler.validate_response(None, None))
|
|
|
|
def test_bad_response_code(self, mock_sess):
|
|
"""Check bad response code from server."""
|
|
fake_resp = mresp.MockResponse(None, 404)
|
|
self.assertFalse(self.login_handler.validate_response(None, fake_resp))
|
|
|
|
def test_good_response_code(self, mock_sess):
|
|
"""Check good response code from server."""
|
|
fake_resp = mresp.MockResponse(None, 200)
|
|
self.assertTrue(self.login_handler.validate_response(None, fake_resp))
|
|
|
|
@mock.patch("blinkpy.login_handler.util.gen_uid")
|
|
def test_check_keys_no_persist(self, mock_uid, mock_sess):
|
|
"""Check key generation."""
|
|
uid_value = "abc123"
|
|
mock_uid.return_value = "abc123"
|
|
self.login_handler.persist_key = None
|
|
data = self.login_handler.check_keys()
|
|
self.assertEqual(data["uid"], uid_value)
|
|
self.assertEqual(data["notification_key"], uid_value)
|
|
|
|
@mock.patch("blinkpy.login_handler.util.gen_uid")
|
|
@mock.patch("blinkpy.login_handler.json.load")
|
|
@mock.patch("blinkpy.login_handler.isfile")
|
|
def test_check_keys_persist(self, mockisfile, mockjson, mock_uid, mock_sess):
|
|
"""Check key load from file."""
|
|
uid_value = "abc123"
|
|
mock_file = {"uid": "321cba", "notification_key": "foobar123"}
|
|
mock_uid.return_value = uid_value
|
|
mockjson.return_value = mock_file
|
|
mockisfile.return_value = True
|
|
self.login_handler.persist_key = True
|
|
data = self.login_handler.check_keys()
|
|
self.assertEqual(mock_file["uid"], data["uid"])
|
|
self.assertEqual(mock_file["notification_key"], data["notification_key"])
|
|
|
|
def test_check_key_required(self, mock_sess):
|
|
"""Check key required method."""
|
|
response_true = {"client": {"verification_required": True}}
|
|
response_false = {"client": {"verification_required": False}}
|
|
response_nokey = {}
|
|
|
|
mock_blink = MockBlink(response_nokey)
|
|
self.assertFalse(self.login_handler.check_key_required(mock_blink))
|
|
|
|
mock_blink = MockBlink(response_false)
|
|
self.assertFalse(self.login_handler.check_key_required(mock_blink))
|
|
|
|
mock_blink = MockBlink(response_true)
|
|
self.assertTrue(self.login_handler.check_key_required(mock_blink))
|
|
|
|
@mock.patch("blinkpy.login_handler.api.request_verify")
|
|
def test_send_auth_key(self, mock_req, mock_sess):
|
|
"""Check sending of auth key."""
|
|
mock_blink = MockBlink(None)
|
|
mock_req.return_value = mresp.MockResponse({"valid": True}, 200)
|
|
self.assertTrue(self.login_handler.send_auth_key(mock_blink, 1234))
|
|
self.assertTrue(mock_blink.available)
|
|
|
|
mock_req.return_value = mresp.MockResponse(None, 200)
|
|
self.assertFalse(self.login_handler.send_auth_key(mock_blink, 1234))
|
|
|
|
mock_req.return_value = mresp.MockResponse({}, 200)
|
|
self.assertFalse(self.login_handler.send_auth_key(mock_blink, 1234))
|
|
|
|
self.assertTrue(self.login_handler.send_auth_key(mock_blink, None))
|
|
|
|
|
|
class MockBlink:
|
|
"""Object to mock basic blink class."""
|
|
|
|
def __init__(self, login_response):
|
|
"""Initialize mock blink class."""
|
|
self.available = False
|
|
self.login_response = login_response
|