def _get_subscription_by_queue(self, queue: str) -> Subscription: """ Retrieves a `subscription_manager_client.models.Subscription` by its queue """ subscriptions = self.client.get_subscriptions(queue=queue) if not subscriptions: raise SubscriptionManagerServiceError( f"No subscription found for queue '{queue}'") return subscriptions[0]
def unsubscribe(self, queue: str): """ Unsubscribes the client from the topics that corresponds to the given queue """ subscription = self._get_subscription_by_queue(queue) try: self.client.delete_subscription_by_id(subscription.id) except APIError as e: raise SubscriptionManagerServiceError( f"Error while deleting subscription '{subscription.id}': {str(e)}" )
def resume(self, queue: str): """ Reactivates the subscription that corresponds to the given queue """ subscription = self._get_subscription_by_queue(queue) subscription.active = True try: self.client.put_subscription(subscription.id, subscription) except APIError as e: raise SubscriptionManagerServiceError( f"Error while updating subscription '{subscription.id}': {str(e)}" )
def subscribe(self, topic_name: str) -> str: """ Subscribes the client to the given topics. :return: A unique queue corresponding to this subscription """ db_topics = self.client.get_topics() try: topic = [topic for topic in db_topics if topic.name == topic_name][0] except IndexError: raise SubscriptionManagerServiceError( f"{topic_name} is not registered in Subscription Manager") subscription = Subscription(topic_id=topic.id) try: db_subscription = self.client.post_subscription(subscription) except APIError as e: raise SubscriptionManagerServiceError( f"Error while subscribing to {topic_name}: {str(e)}") return db_subscription.queue
def test_subscriber__subscribe__sm_api_error__logs_error_and_raises_SubscriptionManagerServiceError(caplog): caplog.set_level(logging.DEBUG) broker_handler = mock.Mock() sm_service = mock.Mock() sm_service.subscribe = mock.Mock(side_effect=SubscriptionManagerServiceError('server error')) subscriber = Subscriber(broker_handler, sm_service) expected_message = f"Error while accessing Subscription Manager: server error" with pytest.raises(SubscriptionManagerServiceError) as e: subscriber.subscribe('topics', callback=mock.Mock()) assert "server error" == str(e.value) log_message = caplog.records[0] assert expected_message == log_message.message
def test_subscriber__resume__sm_api_error__logs_message_and_raises_SubscriptionManagerServiceError(caplog): caplog.set_level(logging.DEBUG) caplog.set_level(logging.DEBUG) queue = uuid.uuid4().hex topic = 'topics' broker_handler = mock.Mock() sm_service = mock.Mock() sm_service.resume = mock.Mock(side_effect=SubscriptionManagerServiceError('server error')) subscriber = Subscriber(broker_handler, sm_service) subscriber.subscriptions[topic] = queue expected_message = f"Error while accessing Subscription Manager: server error" with pytest.raises(SubscriptionManagerServiceError) as e: subscriber.resume(topic) assert "server error" == str(e.value) log_message = caplog.records[0] assert expected_message == log_message.message