def test_form__when_callback_missing__should_return_error(): with pytest.raises(ValidationError) as exc: SubscriptionForm().load({ "hub.topic": "topic", "hub.mode": "subscribe", }) assert exc.value.messages == {'hub.callback': ['Missing data for required field.']}
def test_form_lease_seconds__when_missing__should_be_5_days(): loaded = SubscriptionForm().load({ "hub.callback": "http://callback.com", "hub.topic": "topic", "hub.mode": "subscribe", }) assert loaded['lease_seconds'] == 5 * 24 * 3600
def test_form__when_invalid_mode__should_return_error(): with pytest.raises(ValidationError) as exc: SubscriptionForm().load({ "hub.callback": "https://callback.com", "hub.topic": "topic", "hub.mode": "please subscribe me", }) assert exc.value.messages == {'hub.mode': ['Must be one of: subscribe, unsubscribe.']}
def test_form__when_callback_invalid_url__should_return_error(url): with pytest.raises(ValidationError) as exc: SubscriptionForm().load({ "hub.callback": url, "hub.topic": "topic", "hub.mode": "subscribe", }) assert exc.value.messages == {'hub.callback': ['Not a valid URL.']}
def dispatch_request(self): try: form_data = SubscriptionForm().load(request.form.to_dict()) except marshmallow.ValidationError as e: # TODO integrate marshmallow and libtrustbridge.errors.handlers return JsonResponse(e.messages, status=HTTPStatus.BAD_REQUEST) current_app.logger.info("Subscription request received: %s", form_data) topic = self.get_topic(form_data) callback = form_data['callback'] mode = form_data['mode'] lease_seconds = form_data['lease_seconds'] try: self.verify(callback, mode, topic, lease_seconds) except IntentVerificationFailure: current_app.logger.error("Intent verification failed for the %s", form_data.get("callback")) return JsonResponse({'error': 'Intent verification failed'}, status=HTTPStatus.BAD_REQUEST) if mode == MODE_ATTR_SUBSCRIBE_VALUE: current_app.logger.info("Subscribed %s to %s", form_data.get("callback"), form_data.get("topic")) self._subscribe(callback, topic, lease_seconds) else: current_app.logger.info("Unsubscribed %s from %s", form_data.get("callback"), form_data.get("topic")) self._unsubscribe(callback, topic) return JsonResponse(status=HTTPStatus.ACCEPTED)
def test_form__when_too_big_secret__should_return_error(): with pytest.raises(ValidationError) as exc: SubscriptionForm().load({ "hub.callback": "https://callback.com", "hub.topic": "topic", "hub.mode": "subscribe", "hub.secret": "x" * 201, }) assert exc.value.messages == {'hub.secret': ['Longer than maximum length 200.']}
def test_form__when_additional_params__should_ignore(): loaded = SubscriptionForm().load({ "hub.callback": "http://callback.com", "hub.topic": "topic", "hub.mode": "unsubscribe", "ignore": "me", }) assert "ignore" not in loaded
def test_form__when_valid__should_return_loaded_data(): loaded = SubscriptionForm().load({ "hub.callback": "http://callback.com", "hub.topic": "topic", "hub.mode": "subscribe", "hub.lease_seconds": 3600, }) assert loaded == { 'callback': 'http://callback.com', 'lease_seconds': 3600, 'mode': 'subscribe', 'topic': 'topic' }
def execute(self, websub_form_data: dict = None, topic_prefix: str = None): try: data = Box(SubscriptionForm().load(websub_form_data)) except MarshmallowValidationError as e: raise BadParametersError(detail=str(e)) from e data.topic = self.canonical_url_topic_verification.execute( data.topic, topic_prefix) if data.mode == MODE_ATTR_SUBSCRIBE_VALUE: self.subscription_callback_verification.execute( callback=data.callback, topic=data.topic, mode=data.mode, lease_seconds=data.lease_seconds) self.subscribe.execute(callback=data.callback, topic=data.topic, expiration=data.lease_seconds) else: self.unsubscribe.execute(callback=data.callback, topic=data.topic)