def test_event_emission(adapter): test_event_emission.event_handled = False # Events should trigger an event @adapter.on('reaction_added') def event_handler(event_data): test_event_emission.event_handled = True event = event_data['event'] assert event["reaction"] == 'grinning' data = pytest.reaction_event_fixture timestamp = int(time.time()) signature = pytest.create_signature(adapter.signing_secret, timestamp, data) with adapter.server.test_client() as client: res = client.post('/slack/events', data=data, content_type='application/json', headers={ 'X-Slack-Request-Timestamp': timestamp, 'X-Slack-Signature': signature }) assert res.status_code == 200 assert test_event_emission.event_handled
def test_error_signature(adapter): test_error_signature.event_handled = False # Error should trigger an event @adapter.on('error') def event_handler(exception): test_error_signature.event_handled = True assert isinstance(exception, SlackEventAdapterException) assert str(exception) == 'Invalid request signature' data = pytest.reaction_event_fixture timestamp = int(time.time()) signature = pytest.create_signature('INVALID SIGNATURE', timestamp, data) with adapter.server.test_client() as client: res = client.post('/slack/events', data=data, content_type='application/json', headers={ 'X-Slack-Request-Timestamp': timestamp, 'X-Slack-Signature': signature }) assert res.status_code == 403 assert test_error_signature.event_handled
async def test_event_dispatch_exception(slack_event_manager): async def handler(data): raise Exception exception_handled = [] async def exception_handler(exception): exception_handled.append(exception) slack_event_manager.on_event('reaction_added', handler) slack_event_manager.add_exception('reaction_added', exception_handler) slack_event_manager.add_exception(Exception, exception_handler) timestamp = int(time()) data = pytest.reaction_event_fixture signature = pytest.create_signature(slack_event_manager.singing_secret, timestamp, data) async with AsyncClient(app=slack_event_manager.app, base_url='http://test') as client: response = await client.post('/', content=data, headers={ 'Content-Type': 'application/json', 'X-Slack-Request-Timestamp': str(timestamp), 'X-Slack-Signature': signature }) assert response.status_code == 200, 'Not valid response code' assert len(exception_handled) == 2, 'Not all exception handled'
def test_error_timestamp(adapter): test_error_timestamp.event_handled = False # Error should trigger an event @adapter.on('error') def event_handler(exception): test_error_timestamp.event_handled = True assert isinstance(exception, SlackEventAdapterException) assert str(exception) == 'Invalid request timestamp' data = pytest.reaction_event_fixture # Set timestamp to Thu Jan 01 00:00:00 1970 UTC (Epoch 0) timestamp = 0 signature = pytest.create_signature(adapter.signing_secret, timestamp, data) with adapter.server.test_client() as client: res = client.post('/slack/events', data=data, content_type='application/json', headers={ 'X-Slack-Request-Timestamp': timestamp, 'X-Slack-Signature': signature }) assert res.status_code == 403 assert test_error_timestamp.event_handled
def test_no_timestamp(client): data = pytest.sig_challenge_fixture timestamp = int(time.time()) signature = pytest.create_signature('SIGNING_SECRET', timestamp, data) res = client.post('/', data=data, content_type='application/json', headers={'X-Slack-Signature': signature}) assert res.status_code == 403
def test_no_secret_app_config(app, client): app.config['SLACK_SIGNING_SECRET'] = None data = pytest.sig_challenge_fixture timestamp = int(time.time()) signature = pytest.create_signature('SIGNING_SECRET', timestamp, data) res = client.post('/', data=data, content_type='application/json', headers={ 'X-Slack-Request-Timestamp': timestamp, 'X-Slack-Signature': signature }) assert res.status_code == 403
def test_url_challenge(client): slack_adapter = SlackEventAdapter("SIGNING_SECRET") data = pytest.url_challenge_fixture timestamp = int(time.time()) signature = pytest.create_signature(slack_adapter.signing_secret, timestamp, data) res = client.post('/slack/events', data=data, content_type='application/json', headers={ 'X-Slack-Request-Timestamp': timestamp, 'X-Slack-Signature': signature }) assert res.status_code == 200 assert bytes.decode(res.data) == "valid_challenge_token"
def test_event_emission(client): # Events should trigger an event @ADAPTER.on('reaction_added') def event_handler(event): assert event["reaction"] == 'grinning' data = bytes(pytest.twitter_like_event_fixture, 'ascii') signature = pytest.create_signature(ADAPTER.consumer_secret, data) res = client.post( '/webhooks/twitter', data=data, content_type='application/json', headers={ 'X-Twitter-Webhooks-Signature': signature } ) assert res.status_code == 200
def test_event_emission(client): # Events should trigger an event @ADAPTER.on('reaction_added') def event_handler(event): assert event["reaction"] == 'grinning' data = pytest.reaction_event_fixture timestamp = int(time.time()) signature = pytest.create_signature(ADAPTER.signing_secret, timestamp, data) res = client.post('/slack/events', data=data, content_type='application/json', headers={ 'X-Slack-Request-Timestamp': timestamp, 'X-Slack-Signature': signature }) assert res.status_code == 200
def test_version_header(client): # Verify [package metadata header is set slack_adapter = SlackEventAdapter("SIGNING_SECRET") package_info = slack_adapter.server.package_info data = pytest.reaction_event_fixture timestamp = int(time.time()) signature = pytest.create_signature(slack_adapter.signing_secret, timestamp, data) res = client.post('/slack/events', data=data, content_type='application/json', headers={ 'X-Slack-Request-Timestamp': timestamp, 'X-Slack-Signature': signature }) assert res.status_code == 200 assert res.headers["X-Slack-Powered-By"] == package_info
async def test_challenge_request(slack_event_manager): timestamp = int(time()) data = pytest.url_challenge_fixture signature = pytest.create_signature(slack_event_manager.singing_secret, timestamp, data) async with AsyncClient(app=slack_event_manager.app, base_url='http://test') as client: response = await client.post('/', content=data, headers={ 'Content-Type': 'application/json', 'X-Slack-Request-Timestamp': str(timestamp), 'X-Slack-Signature': signature }) assert response.status_code == 200, 'Invalid response code' assert response.text.strip( '"') == "valid_challenge_token", 'Challenge token not match'
def test_compare_digest_fallback(client, monkeypatch): # Verify [package metadata header is set slack_adapter = SlackEventAdapter("SIGNING_SECRET") if hasattr(hmac, "compare_digest"): monkeypatch.delattr(hmac, 'compare_digest') data = pytest.reaction_event_fixture timestamp = int(time.time()) signature = pytest.create_signature(slack_adapter.signing_secret, timestamp, data) res = client.post('/slack/events', data=data, content_type='application/json', headers={ 'X-Slack-Request-Timestamp': timestamp, 'X-Slack-Signature': signature }) assert res.status_code == 200
async def test_event_dispatch(slack_event_manager): async def handler(data): assert json.dumps(data) == pytest.reaction_event_fixture, 'Wrong body' slack_event_manager.on_event('reaction_added', handler) timestamp = int(time()) data = pytest.reaction_event_fixture signature = pytest.create_signature(slack_event_manager.singing_secret, timestamp, data) async with AsyncClient(app=slack_event_manager.app, base_url='http://test') as client: response = await client.post('/', content=data, headers={ 'Content-Type': 'application/json', 'X-Slack-Request-Timestamp': str(timestamp), 'X-Slack-Signature': signature }) assert response.status_code == 200, 'Not valid response code'