Example #1
0
    async def test_boot_crash(self):
        async def app(scope, recv, send):
            raise CustomException('forgot the map')

        app = ASGITestClient(BugsnagMiddleware(app))

        try:
            await app.request('/')
            assert 0, 'An exception should have been raised'
        except CustomException:
            pass

        payload = await self.last_event_request()
        request = payload['events'][0]['metaData']['request']
        environment = payload['events'][0]['metaData']['environment']
        self.assertEqual('/', request['path'])
        self.assertEqual('GET', request['httpMethod'])
        self.assertEqual('http', request['type'])
        self.assertEqual('http://testserver/', request['url'])
        self.assertEqual('testclient', request['clientIp'])
        self.assertEqual('testclient', request['headers']['user-agent'])
        self.assertEqual('/', environment['path'])

        exception = payload['events'][0]['exceptions'][0]
        self.assertEqual('test_async_asgi.CustomException',
                         exception['errorClass'])
        self.assertEqual('forgot the map', exception['message'])
Example #2
0
    async def test_custom_metadata(self):
        async def next_func():
            bugsnag.configure_request(meta_data={'wave': {'size': '35b'}})
            raise CustomException('fell winds!')

        async def app(scope, recv, send):
            await next_func()
            await send({})

        app = ASGITestClient(BugsnagMiddleware(app))

        try:
            await app.request('/')
            assert 0, 'An exception should have been raised'
        except CustomException:
            pass

        payload = await self.last_event_request()
        metadata = payload['events'][0]['metaData']
        request = metadata['request']
        self.assertEqual('/', request['path'])
        self.assertEqual('GET', request['httpMethod'])
        self.assertEqual('http', request['type'])
        self.assertEqual('http://testserver/', request['url'])
        self.assertEqual('35b', metadata['wave']['size'])

        exception = payload['events'][0]['exceptions'][0]
        self.assertEqual('test_async_asgi.CustomException',
                         exception['errorClass'])
        self.assertEqual('fell winds!', exception['message'])
        self.assertEqual('next_func', exception['stacktrace'][0]['method'])
        self.assertEqual('app', exception['stacktrace'][1]['method'])
Example #3
0
    async def test_routing_crash(self):
        async def other_func():
            raise CustomException('fell winds!')

        async def app(scope, recv, send):
            await other_func()
            await send({
                'type': 'http.request',
                'body': b'pineapple',
            })

        app = ASGITestClient(BugsnagMiddleware(app))

        try:
            await app.request('/')
            assert 0, 'An exception should have been raised'
        except CustomException:
            pass

        payload = await self.last_event_request()

        request = payload['events'][0]['metaData']['request']
        self.assertEqual('/', request['path'])
        self.assertEqual('GET', request['httpMethod'])
        self.assertEqual('http', request['type'])
        self.assertEqual('http://testserver/', request['url'])

        exception = payload['events'][0]['exceptions'][0]
        self.assertEqual('test_async_asgi.CustomException',
                         exception['errorClass'])
        self.assertEqual('fell winds!', exception['message'])
        self.assertEqual('other_func', exception['stacktrace'][0]['method'])
        self.assertEqual('app', exception['stacktrace'][1]['method'])
Example #4
0
    async def test_websocket_crash(self):
        async def app(scope, receive, send):
            await send({'type': 'websocket.accept'})
            raise CustomException('invalid inputs')
            await send({'type': 'websocket.close'})

        app = ASGITestClient(BugsnagMiddleware(app))

        try:
            await app.websocket_request('/')
            assert 0, 'An exception should have been raised'
        except CustomException:
            pass

        payload = await self.last_event_request()
        metadata = payload['events'][0]['metaData']
        request = metadata['request']
        self.assertEqual('/', request['path'])
        self.assertNotIn('httpMethod', request)
        self.assertEqual('websocket', request['type'])
        self.assertEqual('ws://testserver/', request['url'])
        self.assertEqual('13', request['headers']['sec-websocket-version'])

        exception = payload['events'][0]['exceptions'][0]
        self.assertEqual('test_async_asgi.CustomException',
                         exception['errorClass'])
        self.assertEqual('invalid inputs', exception['message'])
        self.assertEqual('app', exception['stacktrace'][0]['method'])
Example #5
0
    def test_routing_crash(self):
        app = Starlette()

        async def other_func():
            raise ScaryException('fell winds!')

        @app.route('/')
        async def index(req):
            await other_func()
            return PlainTextResponse('pineapple')

        app = TestClient(BugsnagMiddleware(app))

        self.assertRaises(ScaryException, lambda: app.get('/'))
        self.assertSentReportCount(1)

        payload = self.server.received[0]['json_body']
        request = payload['events'][0]['metaData']['request']
        environment = payload['events'][0]['metaData']['environment']
        self.assertEqual('/', request['path'])
        self.assertEqual('GET', request['httpMethod'])
        self.assertEqual('http', request['type'])
        self.assertEqual('http://testserver/', request['url'])
        self.assertEqual('/', environment['path'])

        exception = payload['events'][0]['exceptions'][0]
        self.assertEqual('tests.utils.ScaryException', exception['errorClass'])
        self.assertEqual('fell winds!', exception['message'])
        self.assertEqual('other_func', exception['stacktrace'][0]['method'])
        self.assertEqual('index', exception['stacktrace'][1]['method'])
Example #6
0
    def test_websocket_crash(self):
        async def app(scope, receive, send):
            websocket = WebSocket(scope, receive=receive, send=send)
            await websocket.accept()
            raise ScaryException('invalid inputs')
            await websocket.close()

        app = TestClient(BugsnagMiddleware(app))
        with app.websocket_connect('/') as websocket:
            self.assertRaises(ScaryException, lambda: websocket.receive_text())

        self.assertSentReportCount(1)

        payload = self.server.received[0]['json_body']
        metadata = payload['events'][0]['metaData']
        request = metadata['request']
        self.assertEqual('/', request['path'])
        self.assertNotIn('httpMethod', request)
        self.assertEqual('websocket', request['type'])
        self.assertEqual('ws://testserver/', request['url'])
        self.assertEqual('13', request['headers']['sec-websocket-version'])

        exception = payload['events'][0]['exceptions'][0]
        self.assertEqual('tests.utils.ScaryException', exception['errorClass'])
        self.assertEqual('invalid inputs', exception['message'])
        self.assertEqual('app', exception['stacktrace'][0]['method'])
Example #7
0
    def test_custom_metadata(self):
        app = Starlette()

        async def next_func():
            bugsnag.configure_request(meta_data={'wave': {'size': '35b'}})
            raise ScaryException('fell winds!')

        @app.route('/')
        async def index(req):
            await next_func()
            return PlainTextResponse('pineapple')

        app = TestClient(BugsnagMiddleware(app))

        self.assertRaises(ScaryException, lambda: app.get('/'))
        self.assertSentReportCount(1)

        payload = self.server.received[0]['json_body']
        metadata = payload['events'][0]['metaData']
        request = metadata['request']
        self.assertEqual('/', request['path'])
        self.assertEqual('GET', request['httpMethod'])
        self.assertEqual('http', request['type'])
        self.assertEqual('http://testserver/', request['url'])
        self.assertEqual('35b', metadata['wave']['size'])

        exception = payload['events'][0]['exceptions'][0]
        self.assertEqual('tests.utils.ScaryException', exception['errorClass'])
        self.assertEqual('fell winds!', exception['message'])
        self.assertEqual('next_func', exception['stacktrace'][0]['method'])
        self.assertEqual('index', exception['stacktrace'][1]['method'])
Example #8
0
    def test_normal_http_operation(self):
        async def app(scope, recv, send):
            response = PlainTextResponse('hi hi hi')
            await response(scope, recv, send)

        app = TestClient(BugsnagMiddleware(app))
        resp = app.get('/')

        self.assertEqual('hi hi hi', resp.text)
        self.assertSentReportCount(0)
Example #9
0
    async def test_normal_http_operation(self):
        async def app(scope, recv, send):
            await send({
                'type': 'http.request',
                'body': b'hi hi hi',
            })

        app = ASGITestClient(BugsnagMiddleware(app))
        resp = await app.request('/')
        assert resp is not None
        assert b'hi hi hi' == resp['body']
        assert len(self.server.events_received) == 0
Example #10
0
    async def test_url_components(self):
        async def app(scope, recv, send):
            raise CustomException('forgot the map')

        app = ASGITestClient(BugsnagMiddleware(app))

        try:
            await app.request('/path', 'page=6')
            assert 0, 'An exception should have been raised'
        except CustomException:
            pass

        payload = await self.last_event_request()
        request = payload['events'][0]['metaData']['request']
        self.assertEqual('http://testserver/path?page=6', request['url'])
Example #11
0
    def test_url_components(self):
        app = Starlette()

        @app.route('/path')
        async def index(req):
            raise ScaryException('forgot the map')

        app = TestClient(BugsnagMiddleware(app))

        self.assertRaises(ScaryException, lambda: app.get('/path?page=6#top'))
        self.assertSentReportCount(1)

        payload = self.server.received[0]['json_body']
        request = payload['events'][0]['metaData']['request']
        self.assertEqual('http://testserver/path?page=6', request['url'])
Example #12
0
    async def test_disable_environment(self):
        bugsnag.configure(send_environment=False)

        async def app(scope, recv, send):
            raise CustomException('forgot the map')

        app = ASGITestClient(BugsnagMiddleware(app))

        try:
            await app.request('/')
            assert 0, 'An exception should have been raised'
        except CustomException:
            pass

        payload = await self.last_event_request()
        metadata = payload['events'][0]['metaData']
        assert 'environment' not in metadata
Example #13
0
    def test_disable_environment(self):
        bugsnag.configure(send_environment=False)
        app = Starlette()

        async def other_func():
            raise ScaryException('fell winds!')

        @app.route('/')
        async def index(req):
            await other_func()
            return PlainTextResponse('pineapple')

        app = TestClient(BugsnagMiddleware(app))

        self.assertRaises(ScaryException, lambda: app.get('/'))
        self.assertSentReportCount(1)

        payload = self.server.received[0]['json_body']
        metadata = payload['events'][0]['metaData']
        assert 'environment' not in metadata
Example #14
0
    def test_boot_crash(self):
        async def app(scope, recv, send):
            raise ScaryException('forgot the map')

        app = TestClient(BugsnagMiddleware(app))

        self.assertRaises(ScaryException, lambda: app.get('/'))
        self.assertSentReportCount(1)

        payload = self.server.received[0]['json_body']
        request = payload['events'][0]['metaData']['request']
        self.assertEqual('/', request['path'])
        self.assertEqual('GET', request['httpMethod'])
        self.assertEqual('http', request['type'])
        self.assertEqual('http://testserver/', request['url'])
        self.assertEqual('testclient', request['clientIp'])
        self.assertEqual('testclient', request['headers']['user-agent'])

        exception = payload['events'][0]['exceptions'][0]
        self.assertEqual('tests.utils.ScaryException', exception['errorClass'])
        self.assertEqual('forgot the map', exception['message'])
Example #15
0
import bugsnag
from bugsnag.asgi import BugsnagMiddleware

bugsnag.configure(api_key="YOUR-API-KEY-HERE")


async def broken_code():
    raise Exception('ASGI demo: This is an exception from async code')


async def app(scope, receive, send):
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ]
    })
    await broken_code()
    await send({
        'type': 'http.response.body',
        'body': b'Hello, world!',
    })


app = BugsnagMiddleware(app)