Exemple #1
0
def test_should_throw_a_exception_if_try_to_start_a_subscriber_with_no_subscribers():
    subscriber = RabbitMQEventSubscriber(
        connector=RabbitMqConnector(), subscribers=None
    )

    with pytest.raises(RuntimeError):
        subscriber.start()
Exemple #2
0
def test_should_create_a_rabbitmq_event_publisher_and_publish_a_event_after_heartbeat(
        make_user_created_event):
    event = make_user_created_event()
    rabbitmq_connector = RabbitMqConnector()
    rabbitmq_connector.heartbeat = 2

    publisher = RabbitMQEventPublisher(
        connector=rabbitmq_connector,
        organization="acme",
        service="service",
        topic="service-event",
    )

    sleep(10)  # wait more than the heartbeat

    publisher.publish(event)
Exemple #3
0
def test_should_create_two_rabbitmq_event_subscriber_and_then_close_one_without_altering_the_other(
    given_any_config_event_subscriber
):
    subscriber = RabbitMQEventSubscriber(
        connector=RabbitMqConnector(),
        subscribers={"auth": given_any_config_event_subscriber()},
        connection_name="subscriber",
    )
    dl_subscriber = RabbitMQEventSubscriber(
        connector=RabbitMqConnector(),
        subscribers={"dl-auth": given_any_config_event_subscriber()},
        connection_name="dl-subscriber",
    )

    subscriber.start()
    dl_subscriber.start()

    await_for_it()

    assert subscriber.info() == {
        "name": "RabbitMQEventSubscriber",
        "connection.is_open": True,
        "subscribers_status": {"auth": "subscribed"},
    }

    assert dl_subscriber.info() == {
        "name": "RabbitMQEventSubscriber",
        "connection.is_open": True,
        "subscribers_status": {"dl-auth": "subscribed"},
    }

    dl_subscriber.stop()

    await_for_it(4.0)

    assert subscriber.info() == {
        "name": "RabbitMQEventSubscriber",
        "connection.is_open": True,
        "subscribers_status": {"auth": "subscribed"},
    }

    assert dl_subscriber.info() == {
        "name": "RabbitMQEventSubscriber",
        "connection.is_open": True,
        "subscribers_status": {"dl-auth": "unsubscribed"},
    }
    subscriber.stop()
Exemple #4
0
def test_should_create_a_rabbitmq_event_subscriber_and_then_unsubscribe_all_when_not_subscribe_all_before(
    given_any_config_event_subscriber
):
    subscriber = RabbitMQEventSubscriber(
        connector=RabbitMqConnector(),
        subscribers={"auth": given_any_config_event_subscriber()},
    )
    subscriber.stop()
Exemple #5
0
def test_should_create_a_rabbitmq_event_subscriber_and_try_to_delete_twice(
    given_any_config_event_subscriber
):
    subscriber = RabbitMQEventSubscriber(
        connector=RabbitMqConnector(),
        subscribers={"auth": given_any_config_event_subscriber()},
    )
    subscriber.start()
    await_for_it()
    subscriber.stop()
    subscriber.stop()
def configure_events_infrastructure(config_events: ConfigEvents,
                                    logger: ILogger):
    bus = NotImplementedEventBus()
    configurer = NotImplementedEventConfigurer()
    consumer = NotImplementedEventConsumer()

    if config_events.message_broker == "rabbitmq":
        from petisco.event.shared.infrastructure.rabbitmq.rabbitmq_connector import (
            RabbitMqConnector, )
        from petisco.event.bus.infrastructure.rabbitmq_event_bus import RabbitMqEventBus
        from petisco.event.configurer.infrastructure.rabbitmq_event_configurer import (
            RabbitMqEventConfigurer, )
        from petisco.event.consumer.infrastructure.rabbitmq_event_consumer import (
            RabbitMqEventConsumer, )

        bus = RabbitMqEventBus(
            connector=RabbitMqConnector(),
            organization=config_events.organization,
            service=config_events.service,
        )
        configurer = RabbitMqEventConfigurer(
            connector=RabbitMqConnector(),
            organization=config_events.organization,
            service=config_events.service,
            use_store_queues=config_events.use_store_queues,
            queue_config=config_events.queue_config,
        )

        consumer = RabbitMqEventConsumer(
            connector=RabbitMqConnector(),
            organization=config_events.organization,
            service=config_events.service,
            max_retries=config_events.max_retries,
            verbose=config_events.consumer_verbose,
            logger=logger,
            chaos=config_events.chaos,
        )

    return bus, configurer, consumer
Exemple #7
0
def test_should_create_a_rabbitmq_event_publisher_and_publish_a_event(
        make_user_created_event):
    rabbitmq_connector = RabbitMqConnector()
    event = make_user_created_event()

    publisher = RabbitMQEventPublisher(
        connector=rabbitmq_connector,
        organization="acme",
        service="service",
        topic="service-event",
    )

    publisher.publish(event)
Exemple #8
0
def test_should_create_a_rabbitmq_event_subscriber_and_check_info(
    given_any_config_event_subscriber
):
    subscriber = RabbitMQEventSubscriber(
        connector=RabbitMqConnector(),
        subscribers={"auth": given_any_config_event_subscriber()},
    )
    info = subscriber.info()

    assert info == {
        "name": "RabbitMQEventSubscriber",
        "connection.is_open": False,
        "subscribers_status": {},
    }
    subscriber.stop()
Exemple #9
0
def test_should_create_a_rabbitmq_event_subscriber_and_then_close_it(
    given_any_config_event_subscriber
):
    subscriber = RabbitMQEventSubscriber(
        connector=RabbitMqConnector(),
        subscribers={"auth": given_any_config_event_subscriber()},
    )
    subscriber.start()

    await_for_it()

    info = subscriber.info()

    assert info == {
        "name": "RabbitMQEventSubscriber",
        "connection.is_open": True,
        "subscribers_status": {"auth": "subscribed"},
    }

    subscriber.stop()
Exemple #10
0
def test_should_work_successfully_a_happy_path_pub_sub_with_two_subscribers_and_closing_one_of_them(
    given_any_petisco,
    make_user_created_event,
    given_random_organization,
    given_random_service,
    given_random_topic,
):
    event_before_delete_letter_stop = make_user_created_event("user_id_1")
    event_after_delete_letter_stop_1 = make_user_created_event(
        "user_id_after_delete_letter_stop_1"
    )
    event_after_delete_letter_stop_2 = make_user_created_event(
        "user_id_after_delete_letter_stop_2"
    )
    event_after_delete_letter_stop_3 = make_user_created_event(
        "user_id_after_delete_letter_stop_3"
    )

    filename_main_handler = "filename_main_handler.txt"
    filename_main_handler_requeue = "filename_main_handler_requeue.txt"

    if os.path.exists(filename_main_handler):
        os.remove(filename_main_handler)

    if os.path.exists(filename_main_handler_requeue):
        os.remove(filename_main_handler_requeue)

    @subscriber_handler()
    def main_handler(event: Event):
        print(f"main_handler: {event.to_json()}")
        with open(filename_main_handler, "a+") as fm:
            fm.write(event.to_json() + "\n")
        return isSuccess

    @subscriber_handler()
    def main_handler_requeue(event: Event):
        print(f"main_handler_requeue: {event.to_json()}")
        with open(filename_main_handler_requeue, "a+") as fp:
            fp.write(event.to_json() + "\n")
        return isSuccess

    subscriber = RabbitMQEventSubscriber(
        connector=RabbitMqConnector(),
        subscribers={
            "auth": ConfigEventSubscriber(
                organization=given_random_organization,
                service=given_random_service,
                topic=given_random_topic,
                handler=main_handler,
            )
        },
        connection_name="subscriber",
    )
    dl_subscriber = RabbitMQEventSubscriber(
        connector=RabbitMqConnector(),
        subscribers={
            "dl-auth": ConfigEventSubscriber(
                organization=given_random_organization,
                service=given_random_service,
                topic=given_random_topic,
                handler=main_handler_requeue,
                dead_letter=True,
            )
        },
        connection_name="dl-subscriber",
    )

    publisher = RabbitMQEventPublisher(
        connector=RabbitMqConnector(),
        organization=given_random_organization,
        service=given_random_service,
        topic=given_random_topic,
    )

    subscriber.start()
    dl_subscriber.start()

    await_for_it(1.5)

    publisher.publish(event_before_delete_letter_stop)

    await_for_it(1.5)

    dl_subscriber.stop()

    await_for_it(5.5)

    publisher.publish_events(
        [
            event_after_delete_letter_stop_1,
            event_after_delete_letter_stop_2,
            event_after_delete_letter_stop_3,
        ]
    )

    await_for_it(1.5)

    with open(filename_main_handler, "r") as fmm:
        lines = fmm.readlines()
        events = []
        for line in lines:
            events.append(Event.from_json(line))

        assert event_before_delete_letter_stop == events[0]
        assert event_after_delete_letter_stop_1 == events[1]
        assert event_after_delete_letter_stop_2 == events[2]
        assert event_after_delete_letter_stop_3 == events[3]

    assert not os.path.exists(filename_main_handler_requeue)
    os.remove(filename_main_handler)

    subscriber.stop()