def test_webhook_post(self): r = Receiver(self.callable) Receiver.register('test-receiver-no-scope', r) payload = dict(somekey='somevalue') self.post( 'receivereventlistresource', urlargs=dict(receiver_id='test-receiver-no-scope'), data=payload, code=403, user_id=self.user.id, )
def test_webhook_post(self): self.post( 'receivereventlistresource', urlargs=dict(receiver_id='test-receiver'), code=404, user_id=self.user.id, ) r = Receiver(self.callable) r_invalid = Receiver(self.callable_wrong_signature) Receiver.register('test-receiver', r) Receiver.register('test-broken-receiver', r_invalid) payload = dict(somekey='somevalue') self.post( 'receivereventlistresource', urlargs=dict(receiver_id='test-receiver'), data=payload, code=202, user_id=self.user.id, ) assert self.called == 1 assert self.user_id == self.user.id assert self.payload == payload # Test invalid payload import pickle payload = dict(somekey='somevalue') self.post( 'receivereventlistresource', urlargs=dict(receiver_id='test-receiver'), data=pickle.dumps(payload), is_json=False, headers=[('Content-Type', 'application/python-pickle')], code=415, user_id=self.user.id, ) # Test invalid payload, with wrong content-type import pickle self.post( 'receivereventlistresource', urlargs=dict(receiver_id='test-receiver'), data=pickle.dumps(payload), is_json=False, headers=[('Content-Type', 'application/json')], code=400, user_id=self.user.id, )
def test_signature_checking(self): """ webhooks - checks signatures for payload """ r = Receiver(self.callable, signature='X-Hub-Signature') Receiver.register('test-receiver-sign', r) # check correct signature payload = json.dumps(dict(somekey='somevalue')) headers = [('Content-Type', 'application/json'), ('X-Hub-Signature', get_hmac(payload))] with self.app.test_request_context(headers=headers, data=payload): r.consume_event(2) assert self.payload == json.loads(payload) # check signature with prefix headers = [('Content-Type', 'application/json'), ('X-Hub-Signature', 'sha1=' + get_hmac(payload))] with self.app.test_request_context(headers=headers, data=payload): r.consume_event(2) assert self.payload == json.loads(payload) # check incorrect signature headers = [('Content-Type', 'application/json'), ('X-Hub-Signature', get_hmac("somevalue"))] with self.app.test_request_context(headers=headers, data=payload): self.assertRaises(InvalidSignature, r.consume_event, 2)
def test_hookurl(self): r = Receiver(self.callable) Receiver.register('test-receiver', r) self.assertEqual( Receiver.get_hook_url('test-receiver', 'token'), url_for( 'receivereventlistresource', receiver_id='test-receiver', access_token='token', _external=True ) ) self.app.config['WEBHOOKS_DEBUG_RECEIVER_URLS'] = { 'test-receiver': 'http://test.local/?access_token=%(token)s' } self.assertEqual( Receiver.get_hook_url('test-receiver', 'token'), 'http://test.local/?access_token=token' )
def register_webhook(): """Setup webhook endpoint for github notifications.""" Receiver.register( current_app.config.get('GITHUB_WEBHOOK_RECEIVER_ID'), CeleryReceiver(handle_github_payload) )
def test_receiver_registration(self): r = Receiver(self.callable) r_invalid = Receiver(self.callable_wrong_signature) Receiver.register('test-receiver', r) Receiver.register('test-invalid', r_invalid) assert 'test-receiver' in Receiver.all() assert Receiver.get('test-receiver') == r # Double registration self.assertRaises(RegistryError, Receiver.register, 'test-receiver', r) Receiver.unregister('test-receiver') assert 'test-receiver' not in Receiver.all() Receiver.register('test-receiver', r) # JSON payload parsing payload = json.dumps(dict(somekey='somevalue')) headers = [('Content-Type', 'application/json')] with self.app.test_request_context(headers=headers, data=payload): r.consume_event(2) assert self.called == 1 assert self.payload == json.loads(payload) assert self.user_id == 2 self.assertRaises(TypeError, r_invalid.consume_event, 2) assert self.called == 1 # Form encoded values payload parsing payload = dict(somekey='somevalue') with self.app.test_request_context(method='POST', data=payload): r.consume_event(2) assert self.called == 2 assert self.payload == dict(somekey=['somevalue']) # Test invalid post data with self.app.test_request_context(method='POST', data="invaliddata"): self.assertRaises(InvalidPayload, r.consume_event, 2) # Test Celery Receiver rcelery = CeleryReceiver(self.task_callable) CeleryReceiver.register('celery-receiver', rcelery) # Form encoded values payload parsing payload = dict(somekey='somevalue') with self.app.test_request_context(method='POST', data=payload): rcelery.consume_event(1) assert self.called == 3 assert self.payload == dict(somekey=['somevalue']) assert self.user_id == 1
def test_run_must_be_implemeted(): """Test that run raises NotImplementedError if not overriden.""" with pytest.raises(NotImplementedError): Receiver('not-implemented').run(None)