Exemplo n.º 1
0
def server(domain_path, test_mode):
    """Run Async Background Server"""
    # FIXME Accept MAX_WORKERS as command-line input as well
    from protean.server import Engine

    domain = derive_domain(domain_path)
    if not domain:
        raise NoDomainException(
            "Could not locate a Protean domain. You should provide a domain in"
            '"PROTEAN_DOMAIN" environment variable or pass a domain file in options '
            'and a "domain.py" module was not found in the current directory.')

    engine = Engine(domain, test_mode=test_mode)
    engine.run()
Exemplo n.º 2
0
async def test_that_an_event_handler_can_be_associated_with_an_all_stream(test_domain):
    test_domain.register(User)
    test_domain.register(Registered)
    test_domain.register(UserEventHandler, aggregate_cls=User)

    identifier = str(uuid4())
    user = User(
        id=identifier,
        email="*****@*****.**",
        name="John Doe",
        password_hash="hash",
    )
    event = Registered(
        id=identifier,
        email="*****@*****.**",
        name="John Doe",
        password_hash="hash",
    )
    message = Message.to_aggregate_event_message(user, event)

    engine = Engine(domain=test_domain, test_mode=True)
    await engine.handle_message(UserEventHandler, message)

    global counter
    assert counter == 1
Exemplo n.º 3
0
async def test_that_subscription_invokes_engine_handler_on_message(
        mock_handle_message, test_domain):
    test_domain.register(User)
    test_domain.register(UserEventHandler, aggregate_cls=User)

    identifier = str(uuid4())
    user = User(
        id=identifier,
        email="*****@*****.**",
        name="John Doe",
        password_hash="hash",
    )
    event = Registered(
        id=identifier,
        email="*****@*****.**",
        name="John Doe",
        password_hash="hash",
    )
    current_domain.event_store.store.append_aggregate_event(user, event)

    engine = Engine(test_domain, test_mode=True)
    subscription = Subscription(engine, fully_qualified_name(UserEventHandler),
                                "user", UserEventHandler)
    await subscription.poll()

    mock_handle_message.assert_called_once_with(UserEventHandler,
                                                TypeMatcher(Message))
Exemplo n.º 4
0
async def test_that_any_message_can_be_handled_with_any_handler(test_domain):
    test_domain.register(User)
    test_domain.register(Registered)
    test_domain.register(Post)
    test_domain.register(Created)
    test_domain.register(SystemMetrics)

    identifier = str(uuid4())
    registered = Registered(
        id=identifier,
        email="*****@*****.**",
        name="John Doe",
        password_hash="hash",
    )
    user = User(**registered.to_dict())
    message1 = Message.to_aggregate_event_message(user, registered)

    post_identifier = str(uuid4())
    created = Created(id=post_identifier, topic="Foo", content="Bar")
    post = Post(**created.to_dict())
    test_domain.event_store.store.append_aggregate_event(post, created)
    message2 = Message.to_aggregate_event_message(post, created)

    engine = Engine(domain=test_domain, test_mode=True)
    await engine.handle_message(SystemMetrics, message1)
    await engine.handle_message(SystemMetrics, message2)

    global counter
    assert counter == 2
def test_event_subscriptions(test_domain):
    test_domain.register(UserEventHandler, aggregate_cls=User)
    engine = Engine(test_domain, test_mode=True)

    assert len(engine._subscriptions) == 1
    assert fqn(UserEventHandler) in engine._subscriptions
    assert engine._subscriptions[fqn(UserEventHandler)].stream_name == "user"
def test_origin_stream_name_in_subscription(test_domain):
    test_domain.register(EmailEventHandler,
                         aggregate_cls=User,
                         source_stream="email")

    engine = Engine(test_domain, test_mode=True)

    assert len(engine._subscriptions) == 1
    assert engine._subscriptions[fqn(EmailEventHandler)].stream_name == "user"
    assert engine._subscriptions[fqn(
        EmailEventHandler)].origin_stream_name == "email"
def test_that_stream_name_overrides_the_derived_stream_name_from_aggregate_cls(
    test_domain, ):
    test_domain.register(
        EmailEventHandler,
        aggregate_cls=User,
        stream_name="identity",
        source_stream="email",
    )

    engine = Engine(test_domain, test_mode=True)

    assert len(engine._subscriptions) == 1
    assert engine._subscriptions[fqn(
        EmailEventHandler)].stream_name == "identity"
    assert engine._subscriptions[fqn(
        EmailEventHandler)].origin_stream_name == "email"
Exemplo n.º 8
0
async def test_handler_invocation(test_domain):
    test_domain.register(User)
    test_domain.register(Register)
    test_domain.register(Activate)
    test_domain.register(UserCommandHandler, aggregate_cls=User)

    identifier = str(uuid4())
    command = Register(
        user_id=identifier,
        email="*****@*****.**",
    )
    message = Message.to_command_message(command)

    engine = Engine(domain=test_domain, test_mode=True)
    await engine.handle_message(UserCommandHandler, message)

    global counter
    assert counter == 1
Exemplo n.º 9
0
async def test_message_filtering_for_event_handlers_with_defined_origin_stream(
    test_domain, ):
    test_domain.register(UserEventHandler, aggregate_cls=User)
    test_domain.register(EmailEventHandler,
                         stream_name="email",
                         source_stream="user")

    engine = Engine(test_domain, test_mode=True)
    email_event_handler_subscription = engine._subscriptions[fqn(
        EmailEventHandler)]

    identifier = str(uuid4())
    user = User(id=identifier, email="*****@*****.**", name="John Doe")
    email = Email(id=identifier, email="*****@*****.**")

    # Construct 3 dummy messages and modify Sent message to have originated from the user stream
    messages = [
        Message.to_aggregate_event_message(
            user,
            Registered(id=identifier,
                       email="*****@*****.**",
                       name="John Doe")),
        Message.to_aggregate_event_message(
            user, Activated(id=identifier, activated_at=datetime.utcnow())),
        Message.to_aggregate_event_message(
            email, Sent(email="*****@*****.**",
                        sent_at=datetime.utcnow())),
    ]
    messages[2].metadata.origin_stream_name = f"user-{identifier}"

    # Mock `read` method and have it return the 3 messages
    mock_store_read = mock.Mock()
    mock_store_read.return_value = messages
    email_event_handler_subscription.store.read = mock_store_read

    filtered_messages = (
        await email_event_handler_subscription.get_next_batch_of_messages())

    assert len(filtered_messages) == 1
    assert filtered_messages[0].type == fqn(Sent)
def engine(test_domain):
    return Engine(test_domain, test_mode=True)