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_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