def test_shared_doorbell_attributes(self, mock): mock.post('https://oauth.ring.com/oauth/token', text=load_fixture('ring_oauth.json')) mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/history', text=load_fixture('ring_doorbots.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/health', text=load_fixture('ring_doorboot_health_attrs.json')) mock.get('https://api.ring.com/clients_api/doorbots/987653/health', text=load_fixture('ring_doorboot_health_attrs_id987653.json')) data = self.ring_persistent for dev in data.doorbells: if dev.shared: self.assertEqual(987653, dev.account_id) self.assertEqual(51, dev.battery_life) self.assertEqual('123 Second St', dev.address) self.assertEqual('lpd_v1', dev.kind) self.assertEqual('Doorbell Pro', dev.model) self.assertEqual(False, dev.has_capability('battery')) self.assertEqual(True, dev.has_capability('volume')) self.assertEqual(-70.12345, dev.longitude) self.assertEqual('America/New_York', dev.timezone) self.assertEqual(5, dev.volume) self.assertEqual('Digital', dev.existing_doorbell_type)
def test_chime_attributes(self, mock): """Test the Ring Chime class and methods.""" mock.post('https://oauth.ring.com/oauth/token', text=load_fixture('ring_oauth.json')) mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.get('https://api.ring.com/clients_api/chimes/999999/health', text=load_fixture('ring_chime_health_attrs.json')) data = self.ring dev = data.chimes[0] self.assertEqual('123 Main St', dev.address) self.assertNotEqual(99999, dev.account_id) self.assertEqual('abcdef123', dev.id) self.assertEqual('chime', dev.kind) self.assertEqual('Chime', dev.model) self.assertEqual(False, dev.has_capability('battery')) self.assertEqual(True, dev.has_capability('volume')) self.assertIsNotNone(dev.latitude) self.assertEqual('America/New_York', dev.timezone) self.assertEqual(2, dev.volume) self.assertEqual('ring_mock_wifi', dev.wifi_name) self.assertEqual('good', dev.wifi_signal_category) self.assertNotEqual(100, dev.wifi_signal_strength)
def test_stickup_cam_controls(self, mock): mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/health', text=load_fixture('ring_doorboot_health_attrs.json')) mock.put(requests_mock.ANY, text='ok') data = self.ring_persistent for dev in data.stickup_cams: dev.lights = 'off' dev.lights = 'on' dev.siren = 0 dev.siren = 30 history = list( filter(lambda x: x.method == 'PUT', mock.request_history)) self.assertEqual( '/clients_api/doorbots/987652/floodlight_light_off', history[0].path) self.assertEqual( '/clients_api/doorbots/987652/floodlight_light_on', history[1].path) self.assertEqual('/clients_api/doorbots/987652/siren_off', history[2].path) self.assertNotIn('duration', history[2].qs) self.assertEqual('/clients_api/doorbots/987652/siren_on', history[3].path) self.assertEqual('30', history[3].qs['duration'][0])
def test_security_system(self, mock): mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.get('https://api.ring.com/clients_api/chimes/999999/health', text=load_fixture('ring_chime_health_attrs.json')) mock.get('https://api.ring.com/clients_api/doorbots/987653/health', text=load_fixture('ring_doorboot_health_attrs_id987653.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/health', text=load_fixture('ring_doorboot_health_attrs.json')) mock.post( 'https://app.ring.com/api/v1/rs/connections', text= '{"server": "tmp.prd.rings.solutions", "authCode": "tmp", "onBattery": false}' ) # Run this for python versions under 3.4 current_version = LooseVersion( '%s.%s.%s' % (sys.version_info.major, sys.version_info.minor, sys.version_info.micro)) compared_version = LooseVersion('3.4.0') if current_version < compared_version: with pytest.raises(ImportError) as excinfo: security_system = self.ring.security_system assert 'Must use python version' in str(excinfo.value) else: security_system = self.ring.security_system
def dynamo(): with mock.patch('boto3.client'): dynamo_client = Dynamo() dynamo_client._handler.get_item.return_value = load_fixture( 'dynamodb_get_item_response.json') dynamo_client._handler.set_item.return_value = load_fixture( 'dynamodb_put_item_response.json') return dynamo_client
def mocked_requests_get(*args, **kwargs): if args[0] == FETCH_DEVICES_URL: return MockResponse(load_fixture('fetch_devices.json'), 200) elif args[0] == FETCH_GEOFENCES_URL: return MockResponse(load_fixture('fetch_geofences.json'), 200) elif args[0] == CUR_SETTINGS_URL: return MockResponse(load_fixture('cur_settings.json'), 200) return MockResponse(None, 404)
def mocked_requests_post_bad(*args, **kwargs): if args[0] == AUTH_LOGIN_URL: return MockResponse(load_fixture('auth_login_denied.json'), 401) elif args[0] == SEND_URL: return MockResponse(load_fixture('error.json'), 500) elif args[0] == STATUS_URL: return MockResponse(load_fixture('bad_temp_status.json'), 200) return MockResponse(None, 404)
def mocked_requests_post(*args, **kwargs): if args[0] == AUTH_LOGIN_URL: return MockResponse(load_fixture('auth_login.json'), 200) elif args[0] == STATUS_URL: return MockResponse(load_fixture('status.json'), 200) elif args[0] == SEND_URL: return MockResponse(load_fixture('send.json'), 200) return MockResponse(None, 404)
def test_sanity_check(self, mock_post): melissa = Melissa(username="******", password="******") melissa._latest_temp = 28.9 melissa._latest_status['12345678'] = json.loads( load_fixture('status.json'))['provider'] data = json.loads(load_fixture('bad_temp_status.json'))['provider'] device = '12345678' self.assertFalse(melissa.sanity_check(data, device)) data = json.loads(load_fixture('bad_hum_status.json'))['provider'] self.assertFalse(melissa.sanity_check(data, device))
def test_stickup_cam_attributes(self, mock): mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/health', text=load_fixture('ring_doorboot_health_attrs.json')) data = self.ring_persistent for dev in data.stickup_cams: self.assertEqual('off', dev.lights) self.assertEqual(0, dev.siren)
def setUp(self, mock): """Setup unit test and load mock.""" from ring_doorbell import Ring mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.post('https://api.ring.com/clients_api/session', text=load_fixture('ring_session.json')) mock.put('https://api.ring.com/clients_api/device', text=load_fixture('ring_devices.json')) self.ring = Ring(USERNAME, PASSWORD, cache_file=CACHE) self.ring_persistent = \ Ring(USERNAME, PASSWORD, cache_file=CACHE, persist_token=True) self.assertTrue(hasattr(self.ring, "update"))
def mock_ring_requests(): with requests_mock.Mocker() as mock: mock.post("https://oauth.ring.com/oauth/token", text=load_fixture("ring_oauth.json")) mock.post( "https://api.ring.com/clients_api/session", text=load_fixture("ring_session.json"), ) mock.get( "https://api.ring.com/clients_api/ring_devices", text=load_fixture("ring_devices.json"), ) mock.get( "https://api.ring.com/clients_api/chimes/999999/health", text=load_fixture("ring_chime_health_attrs.json"), ) mock.get( "https://api.ring.com/clients_api/doorbots/987652/health", text=load_fixture("ring_doorboot_health_attrs.json"), ) mock.get( "https://api.ring.com/clients_api/doorbots/987652/history", text=load_fixture("ring_doorbots.json"), ) mock.get( "https://api.ring.com/clients_api/dings/active", text=load_fixture("ring_ding_active.json"), ) mock.put( "https://api.ring.com/clients_api/doorbots/987652/floodlight_light_off", text="ok", ) mock.put( "https://api.ring.com/clients_api/doorbots/987652/floodlight_light_on", text="ok", ) mock.put("https://api.ring.com/clients_api/doorbots/987652/siren_on", text="ok") mock.put("https://api.ring.com/clients_api/doorbots/987652/siren_off", text="ok") mock.get( "https://api.ring.com/groups/v1/locations/mock-location-id/groups", text=load_fixture("ring_groups.json"), ) mock.get( "https://api.ring.com/groups/v1/locations/mock-location-id/groups/mock-group-id/devices", text=load_fixture("ring_group_devices.json"), ) mock.post( "https://api.ring.com/groups/v1/locations/mock-location-id/groups/mock-group-id/devices", text="ok", ) yield mock
def test_empty_report(self): # Have the dependencies return an empty report # (this is the default) # Verify that we got the expected string expected = load_fixture("html_report_empty.html") self.assert_report(expected)
def test_successful_query_without_initial_token(self, mock): """Test automatic authentication on query without initial token""" mock.post('https://api.carson.live/api/v1.4.3/auth/login/', text=load_fixture('carson.live', 'carson_login.json')) query_url = 'https://api.carson.live/api/v1.4.3/me/' mock.get(query_url, text=load_fixture('carson.live', 'carson_me.json')) auth = CarsonAuth(USERNAME, PASSWORD) auth.authenticated_query(query_url) # Token unchanged self.assertEqual(FIXTURE_TOKEN, auth.token) self.assertEqual(2, mock.call_count) self.assertEqual('JWT {}'.format(FIXTURE_TOKEN), mock.last_request.headers.get('Authorization'))
def test_stickup_cam_attributes(self, mock): mock.post('https://oauth.ring.com/oauth/token', text=load_fixture('ring_oauth.json')) mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/health', text=load_fixture('ring_doorboot_health_attrs.json')) data = self.ring_persistent for dev in data.stickup_cams: self.assertEqual('hp_cam_v1', dev.kind) self.assertEqual('Floodlight Cam', dev.model) self.assertEqual(False, dev.has_capability('battery')) self.assertEqual(True, dev.has_capability('light')) self.assertEqual('off', dev.lights) self.assertEqual(0, dev.siren)
def test_style_defs(): style_str = Snippet.style_defs() expected_styles = load_fixture("snippet.css").strip() # Check that a sample of the styles are present # (use only a sample to make the test more robust # against Pygments changes). for expect_line in expected_styles.split("\n"): assert expect_line in style_str
def test_doorbell_attributes(self, mock): mock.post('https://oauth.ring.com/oauth/token', text=load_fixture('ring_oauth.json')) mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/history', text=load_fixture('ring_doorbots.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/health', text=load_fixture('ring_doorboot_health_attrs.json')) mock.get('https://api.ring.com/clients_api/doorbots/987653/health', text=load_fixture('ring_doorboot_health_attrs_id987653.json')) data = self.ring_persistent for dev in data.doorbells: if not dev.shared: self.assertEqual('Front Door', dev.name) self.assertEqual(987652, dev.account_id) self.assertEqual('123 Main St', dev.address) self.assertEqual('lpd_v1', dev.kind) self.assertEqual('Doorbell Pro', dev.model) self.assertEqual(False, dev.has_capability('battery')) self.assertEqual(True, dev.has_capability('volume')) self.assertEqual(-70.12345, dev.longitude) self.assertEqual('America/New_York', dev.timezone) self.assertEqual(1, dev.volume) self.assertTrue(dev.has_subscription) self.assertEqual('online', dev.connection_status) self.assertIsInstance(dev.history(limit=1, kind='motion'), list) self.assertEqual(0, len(dev.history(limit=1, kind='ding'))) self.assertEqual( 0, len( dev.history(limit=1, kind='ding', enforce_limit=True, retry=50))) self.assertEqual('Mechanical', dev.existing_doorbell_type) self.assertTrue(data._persist_token) self.assertEqual('ring_mock_wifi', dev.wifi_name) self.assertEqual('good', dev.wifi_signal_category) self.assertEqual(-58, dev.wifi_signal_strength)
def scrape_mocked(fixture_file, url, scrape_fn): fixture = load_fixture("boatos_org", fixture_file, url) MockedRequest = namedtuple('MockedRequest', 'text') original_get = requests.get requests.get = MagicMock(return_value=MockedRequest(text=fixture)) result = scrape_fn(url) requests.get = original_get return result
def test_multiple_snippets(self): self.use_default_values() # Have the snippet loader always report # multiple snippets for each source file self.set_num_snippets(2) # Verify that we got the expected string expected = load_fixture("html_report_two_snippets.html").strip() self.assert_report(expected)
def test_one_snippet(self): self.use_default_values() # Have the snippet loader always report # provide one snippet (for every source file) self.set_num_snippets(1) # Verify that we got the expected string expected = load_fixture("markdown_report_one_snippet.md").strip() self.assert_report(expected)
def test_recursive_retry(self, mock): """"Test recursive query retry on Authentication Failure""" mock.post('https://api.carson.live/api/v1.4.3/auth/login/', text=load_fixture('carson.live', 'carson_login.json')) query_url = 'https://api.carson.live/api/v1.4.3/me/' mock.get(query_url, text=load_fixture('carson.live', 'carson_auth_failure.json'), status_code=401) auth = CarsonAuth(USERNAME, PASSWORD) with self.assertRaises(CarsonAPIError): auth.authenticated_query(query_url, retry_auth=2) # Token unchanged self.assertEqual(FIXTURE_TOKEN, auth.token) self.assertEqual(6, mock.call_count) self.assertEqual('JWT {}'.format(FIXTURE_TOKEN), mock.last_request.headers.get('Authorization'))
def scrape_mocked(fixture_file, url, scrape_fn): fixture = load_fixture("buzzfeed_com", fixture_file, url) MockedRequest = namedtuple('MockedRequest', ['text', 'raise_for_status']) original_get = requests.get requests.get = MagicMock( return_value=MockedRequest(text=fixture, raise_for_status=lambda: 0)) result = scrape_fn() requests.get = original_get return result
def test_basic_attributes(self, mock): """Test the Ring class and methods.""" mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.get('https://api.ring.com/clients_api/chimes/999999/health', text=load_fixture('ring_chime_health_attrs.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/health', text=load_fixture('ring_doorboot_health_attrs.json')) mock.get('https://api.ring.com/clients_api/doorbots/987653/health', text=load_fixture('ring_doorboot_health_attrs_id987653.json')) data = self.ring self.assertTrue(data.is_connected) self.assertIsInstance(data.cache, dict) self.assertFalse(data.debug) self.assertEqual(1, len(data.chimes)) self.assertEqual(2, len(data.doorbells)) self.assertEqual(1, len(data.stickup_cams)) self.assertFalse(data._persist_token) self.assertEquals('http://localhost/', data._push_token_notify_url)
def test_doorbell_alerts(self, mock): mock.get('https://api.ring.com/clients_api/ring_devices', text=load_fixture('ring_devices.json')) mock.get('https://api.ring.com/clients_api/dings/active', text=load_fixture('ring_ding_active.json')) mock.get('https://api.ring.com/clients_api/doorbots/987652/health', text=load_fixture('ring_doorboot_health_attrs.json')) mock.get('https://api.ring.com/clients_api/doorbots/987653/health', text=load_fixture('ring_doorboot_health_attrs_id987653.json')) data = self.ring_persistent for dev in data.doorbells: self.assertEqual('America/New_York', dev.timezone) # call alerts dev.check_alerts() self.assertIsInstance(dev.alert, dict) self.assertIsInstance(dev.alert_expires_at, datetime) self.assertTrue(datetime.now() >= dev.alert_expires_at) self.assertIsNotNone(dev._ring.cache_file)
def test_update_token_fail(self, mock): """Test authentication failure in token update""" mock.post('https://api.carson.live/api/v1.4.3/auth/login/', text=load_fixture('carson.live', 'carson_auth_failure.json'), status_code=401) auth = CarsonAuth(USERNAME, PASSWORD) with self.assertRaises(CarsonAuthenticationError): auth.update_token() self.assertTrue(mock.called)
def _init_default_mocks(self, mock, c_mock_me_filename): c_mock_me_txt = load_fixture('carson.live', c_mock_me_filename) self.c_mock_me = json.loads(c_mock_me_txt).get('data') self.c_mock_first_property = self.c_mock_me['properties'][0] self.c_mock_first_door = self.c_mock_first_property['doors'][0] self.c_mock_first_camera = self.c_mock_first_property['cameras'][0] # ME Mock mock.get(C_API_URI + C_ME_ENDPOINT, text=c_mock_me_txt) # Eagle Eye Session Mock c_mock_esession_txt = load_fixture('carson.live', 'carson_eagleeye_session.json') self.c_mock_esession = json.loads(c_mock_esession_txt).get('data') for b_id in [p['id'] for p in self.c_mock_me.get('properties')]: mock.get(C_API_URI + C_EEN_SESSION_ENDPOINT.format(b_id), text=c_mock_esession_txt) # Device list Mock self.e_mock_device_list = setup_ee_device_list_mock( mock, self.c_mock_esession['activeBrandSubdomain'])
def test_raise_communication_error_wrong_json(self, mock): """Test failure on response with missing keys""" query_url = 'https://api.carson.live/api/v1.4.3/me/' mock.get(query_url, text=load_fixture('carson.live', 'carson_missing_keys.json')) token, _ = get_encoded_token() auth = CarsonAuth(USERNAME, PASSWORD, token) with self.assertRaises(CarsonCommunicationError): auth.authenticated_query(query_url) self.assertTrue(mock.called)
def _assert_format( src_tokens, src_filename, start_line, last_line, violation_lines, expected_fixture, ): snippet = Snippet(src_tokens, src_filename, start_line, last_line, violation_lines, None) result = snippet.html() expected_str = load_fixture(expected_fixture, encoding="utf-8") assert expected_str.strip() == result.strip() assert isinstance(result, str)
def test_successful_query_with_initial_token(self, mock): """Test query with initial valid token""" query_url = 'https://api.carson.live/api/v1.4.3/me/' mock.get(query_url, text=load_fixture('carson.live', 'carson_me.json')) token, _ = get_encoded_token() auth = CarsonAuth(USERNAME, PASSWORD, token) auth.authenticated_query(query_url) # Token unchanged self.assertEqual(token, auth.token) self.assertEqual(1, mock.call_count) self.assertEqual('JWT {}'.format(token), mock.last_request.headers.get('Authorization'))
def test_update_token_success(self, mock): """Test token update""" mock.post('https://api.carson.live/api/v1.4.3/auth/login/', text=load_fixture('carson.live', 'carson_login.json')) mock_token_update_cb = Mock() auth = CarsonAuth(USERNAME, PASSWORD, token_update_cb=mock_token_update_cb) token = auth.update_token() self.assertEqual(auth.username, USERNAME) self.assertEqual(FIXTURE_TOKEN, token) self.assertEqual(FIXTURE_TOKEN, auth.token) self.assertTrue(mock.called) self.assertEqual(USERNAME, mock.last_request.json().get('username')) self.assertEqual(PASSWORD, mock.last_request.json().get('password')) mock_token_update_cb.assert_called_once_with(FIXTURE_TOKEN)