def test_notify_sends_when_before_notify_throws(self): def callback(report): report.add_custom_data('foo', 'bar') raise ScaryException('oh no') bugsnag.before_notify(callback) bugsnag.notify(ScaryException('unexpected failover')) self.assertEqual(1, len(self.server.received)) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual('bar', event['metaData']['custom']['foo'])
def test_multiple_clients_different_keys(self): client1 = Client(api_key='abc', asynchronous=False, use_ssl=False, endpoint=self.server.address) client2 = Client(api_key='456', asynchronous=False, use_ssl=False, endpoint=self.server.address) client1.notify(ScaryException('foo')) self.assertSentReportCount(1) headers = self.server.received[0]['headers'] client2.notify(ScaryException('bar')) self.assertSentReportCount(2) headers = self.server.received[1]['headers'] self.assertEqual(headers['Bugsnag-Api-Key'], '456')
def test_notify_payload_matching_filter(self): bugsnag.configure(params_filters=['bar']) bugsnag.notify(ScaryException('unexpected failover'), foo=4, bar=76) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] exception = event['exceptions'][0] self.assertEqual(4, event['metaData']['custom']['foo']) self.assertEqual('[FILTERED]', event['metaData']['custom']['bar']) self.assertEqual(169, exception['stacktrace'][0]['lineNumber'])
def test_external_middleware_cannot_change_severity_reason(self): def severity_reason_callback(notification): notification.severity_reason['type'] = 'testReason' bugsnag.before_notify(severity_reason_callback) bugsnag.notify(ScaryException('unexpected failover')) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual(event['severityReason']['type'], 'handledException')
def test_notify_override_user(self): bugsnag.notify(ScaryException('unexpected failover'), user={ 'name': 'bob', 'email': '*****@*****.**', 'id': '542347329' }) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual('bob', event['user']['name']) self.assertEqual('542347329', event['user']['id']) self.assertEqual('*****@*****.**', event['user']['email'])
def test_notify_unhandled_severity_callback(self): def callback(report): report.severity = "info" bugsnag.before_notify(callback) bugsnag.notify(ScaryException("unexpected failover"), severity="error") json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertFalse(event['unhandled']) self.assertEqual(event['severityReason'], {"type": "userCallbackSetSeverity"})
def test_external_middleware_can_change_severity(self): def severity_callback(event): event.severity = 'info' bugsnag.before_notify(severity_callback) bugsnag.notify(ScaryException('unexpected failover')) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual(event['severity'], 'info') self.assertEqual(event['severityReason']['type'], 'userCallbackSetSeverity')
def test_meta_data_warning(self): with pytest.warns(DeprecationWarning) as records: bugsnag.notify(ScaryException('false equivalence'), meta_data={'fruit': { 'apples': 2 }}) assert len(records) == 1 assert str(records[0].message) == ('The Event "metadata" ' + 'argument has been replaced ' + 'with "metadata"') json_body = self.server.received[0]['json_body'] metadata = json_body['events'][0]['metaData'] assert metadata['fruit']['apples'] == 2
def test_auto_notify_exc_info(self): try: raise ScaryException('Testing Notify EXC Info') except Exception: bugsnag.auto_notify_exc_info() self.assertEqual(len(self.server.received), 1) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertTrue(event['unhandled']) self.assertEqual(event['severity'], 'error') self.assertEqual(event['severityReason'], {"type": "unhandledException"}) self.assertEqual(event['exceptions'][0]['message'], 'Testing Notify EXC Info')
def test_asynchronous_notify(self): bugsnag.configure(asynchronous=True) self.server.paused = True bugsnag.notify(ScaryException('unexpected failover')) self.server.paused = False start = time.time() while len(self.server.received) == 0: if time.time() > (start + 0.5): raise Exception( 'Timed out while waiting for asynchronous request.') time.sleep(0.001) self.assertEqual(len(self.server.received), 1)
def test_notify_override_metadata_sections(self): bugsnag.add_metadata_tab('food', {'beans': 3, 'corn': 'purple'}) bugsnag.notify(ScaryException('unexpected failover'), meta_data={ 'food': { 'beans': 5 }, 'skills': { 'spear': 6 } }) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual(6, event['metaData']['skills']['spear']) self.assertEqual('purple', event['metaData']['food']['corn']) self.assertEqual(5, event['metaData']['food']['beans'])
def test_notify_exception_with_traceback_option(self): backtrace = None try: raise ScaryException('foo') except ScaryException: backtrace = sys.exc_info()[2] bugsnag.notify(Exception("foo"), traceback=backtrace) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] exception = event['exceptions'][0] stacktrace = exception['stacktrace'] self.assertEqual(1, len(self.server.received)) self.assertEqual('foo', exception['message']) self.assertEqual('test_notify_exception_with_traceback_option', stacktrace[0]['method'])
def test_notify_capture_types(self): try: with self.client.capture((ScaryException, )): raise Exception('Testing Notify Capture Types') except Exception: pass self.assertSentReportCount(0) try: with self.client.capture((ScaryException, )): raise ScaryException('Testing Notify Capture Types') except Exception: pass self.assertSentReportCount(1) self.assertExceptionName(0, 0, 'tests.utils.ScaryException')
def test_exc_info(self): handler = BugsnagHandler() logger = logging.getLogger(__name__) logger.addHandler(handler) try: raise ScaryException('Oh no') except Exception: logger.exception('The system is down') logger.removeHandler(handler) self.assertSentReportCount(1) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] exception = event['exceptions'][0] self.assertEqual(exception['errorClass'], 'tests.utils.ScaryException')
def test_notify_user_filter(self): bugsnag.configure(params_filters=['address', 'phonenumber']) bugsnag.notify(ScaryException('unexpected failover'), user={ "id": "test-man", "address": "123 street\n cooltown\n ABC 123", "phonenumber": "12345678900", "firstname": "Test", "lastname": "Man" }) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual('[FILTERED]', event['user']['address']) self.assertEqual('[FILTERED]', event['user']['phonenumber']) self.assertEqual('test-man', event['user']['id']) self.assertEqual('Test', event['user']['firstname']) self.assertEqual('Man', event['user']['lastname'])
def test_internal_middleware_can_change_severity_reason(self): client = bugsnag.Client(endpoint=self.server.url, api_key='tomatoes', notify_release_stages=['dev'], release_stage='dev', asynchronous=False) def severity_reason_callback(event): event.severity_reason['type'] = 'testReason' internal_middleware = client.configuration.internal_middleware internal_middleware.before_notify(severity_reason_callback) client.notify(ScaryException('unexpected failover')) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual(event['severityReason']['type'], 'testReason')
def test_middleware_stack_order_legacy(self): def first_callback(notification): notification.meta_data['test']['array'].append(1) def second_callback(notification): notification.meta_data['test']['array'].append(2) # Add a regular callback function bugsnag.before_notify(second_callback) # Simulate an internal middleware bugsnag.legacy.configuration.internal_middleware.before_notify( first_callback) bugsnag.notify(ScaryException('unexpected failover'), test={'array': []}) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual(event['metaData']['test']['array'], [1, 2])
def test_internal_middleware_changes_severity(self): client = bugsnag.Client(use_ssl=False, endpoint=self.server.address, api_key='tomatoes', notify_release_stages=['dev'], release_stage='dev', asynchronous=False) def severity_callback(notification): notification.severity = 'info' internal_middleware = client.configuration.internal_middleware internal_middleware.before_notify(severity_callback) client.notify(ScaryException('unexpected failover')) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual(event['severity'], 'info') self.assertEqual(event['severityReason']['type'], 'handledException')
def test_auto_notify_overrides(self): bugsnag.auto_notify(ScaryException("unexpected failover"), severity='info', unhandled=False, severity_reason={ "type": "middleware_handler", "attributes": { "name": "test middleware" } }) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertFalse(event['unhandled']) self.assertEqual(event['severity'], 'info') self.assertEqual( event['severityReason'], { "type": "middleware_handler", "attributes": { "name": "test middleware" } })
def test_middleware_stack_order(self): client = bugsnag.Client(endpoint=self.server.url, api_key='tomatoes', notify_release_stages=['dev'], release_stage='dev', asynchronous=False) def first_callback(event): event.metadata['test']['array'].append(1) def second_callback(event): event.metadata['test']['array'].append(2) client.configuration.middleware.before_notify(second_callback) client.configuration.internal_middleware.before_notify(first_callback) client.notify(ScaryException('unexpected failover'), test={'array': []}) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual(event['metaData']['test']['array'], [1, 2])
def test_notify_error_message(self): bugsnag.notify(ScaryException(u('unexpécted failover'))) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] exception = event['exceptions'][0] self.assertEqual(u('unexpécted failover'), exception['message'])
def test_notify_override_grouping_hash(self): bugsnag.notify(ScaryException('unexpected failover'), grouping_hash='Callout errors') json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual('Callout errors', event['groupingHash'])
def test_notify_override_context(self): bugsnag.notify(ScaryException('unexpected failover'), context='/some/path') json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual('/some/path', event['context'])
def test_notify_configured_app_version(self): bugsnag.configure(app_version='343.2.10') bugsnag.notify(ScaryException('unexpected failover')) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual('343.2.10', event['appVersion'])
def test_notify_override_severity(self): bugsnag.notify(ScaryException('unexpected failover'), severity='info') json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual('info', event['severity'])
def test_notify_default_severity(self): bugsnag.notify(ScaryException('unexpected failover')) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual('warning', event['severity'])
def test_notify_unconfigured_release_stage(self): bugsnag.configure(release_stage=['pickles']) bugsnag.notify(ScaryException('unexpected failover')) self.assertEqual(0, len(self.server.received))
def test_notify_configured_release_stage(self): bugsnag.notify(ScaryException('unexpected failover')) json_body = self.server.received[0]['json_body'] event = json_body['events'][0] self.assertEqual('dev', event['releaseStage'])
def test_notify_configured_api_key(self): bugsnag.notify(ScaryException('unexpected failover')) json_body = self.server.received[0]['json_body'] self.assertEqual('tomatoes', json_body['apiKey'])
def test_notify_request_count(self): bugsnag.notify(ScaryException('unexpected failover')) self.assertEqual(1, len(self.server.received))