예제 #1
0
    def test_receive_all_event_types_if_listens_to_is_not_overriden(self):
        self.listened_events = []

        class TestDomainEvent(DomainEvent):
            pass

        class TestDomainEvent2(DomainEvent):
            pass

        class TestDomainSubscriber(DomainEventHandler):
            def process(x, event):
                nonlocal self
                self.listened_events.append(event)

        DomainEventBus().reset()
        TestDomainSubscriber().listen()
        test_domain_event_1 = TestDomainEvent().emit()
        test_domain_event_2 = TestDomainEvent2().emit()
        test_domain_event_3 = TestDomainEvent().emit()
        test_domain_event_4 = TestDomainEvent2().emit()

        assert self.listened_events[0] == test_domain_event_1
        assert self.listened_events[1] == test_domain_event_2
        assert self.listened_events[2] == test_domain_event_3
        assert self.listened_events[3] == test_domain_event_4
예제 #2
0
    def test_the_debugger_will_log_any_event(self):
        self.listened_events_1 = []
        self.listened_events_2 = []

        class TestDomainEvent(DomainEvent):
            name = "TestDomainEvent"

        class TestDomainEvent2(DomainEvent):
            name = "TestDomainEvent2"

        class TestDomainSubscriber(DomainEventHandler):
            def process(x, event):
                nonlocal self
                self.listened_events_1.append(event)
                TestDomainEvent2().emit()

            def listens_to(self):
                return [TestDomainEvent]

        class TestDomainSubscriber2(DomainEventHandler):
            def process(x, event):
                nonlocal self
                self.listened_events_2.append(event)

            def listens_to(self):
                return [TestDomainEvent2]

        DomainEventBus().reset()
        TestDomainSubscriber().listen()
        TestDomainSubscriber2().listen()

        Debugger().listen()

        TestDomainEvent().emit()
예제 #3
0
    def test_the_bus_will_not_allow_chained_event_publishing(self):
        self.listened_events_1 = []
        self.listened_events_2 = []

        class TestDomainEvent(DomainEvent):
            name = "TestDomainEvent"

        class TestDomainEvent2(DomainEvent):
            name = "TestDomainEvent2"

        class TestDomainSubscriber(DomainEventHandler):
            def process(x, event):
                nonlocal self
                self.listened_events_1.append(event)
                TestDomainEvent2().emit()

            def listens_to(self):
                return [TestDomainEvent]

        class TestDomainSubscriber2(DomainEventHandler):
            def process(x, event):
                nonlocal self
                self.listened_events_2.append(event)

            def listens_to(self):
                return [TestDomainEvent2]

        DomainEventBus().reset()
        TestDomainSubscriber().listen()
        TestDomainSubscriber2().listen()
        TestDomainEvent().emit()

        assert len(self.listened_events_1) == 1
        assert len(self.listened_events_2) == 0
예제 #4
0
    def test_receive_only_specifically_listened_events(self):
        self.listened_events_1 = []
        self.listened_events_2 = []

        class TestDomainEvent(DomainEvent):
            name = "TestDomainEvent"

        class TestDomainEvent2(DomainEvent):
            name = "TestDomainEvent2"

        class TestDomainEvent3(DomainEvent):
            name = "TestDomainEvent3"

        class TestDomainSubscriber(DomainEventHandler):
            def process(x, event):
                nonlocal self
                self.listened_events_1.append(event)

            def listens_to(self):
                return [TestDomainEvent]

        class TestDomainSubscriber2(DomainEventHandler):
            def process(x, event):
                nonlocal self
                self.listened_events_2.append(event)

            def listens_to(self):
                return [TestDomainEvent2]

        DomainEventBus().reset()
        TestDomainSubscriber().listen()
        TestDomainSubscriber2().listen()

        test_domain_event_1 = TestDomainEvent().emit()
        test_domain_event_2 = TestDomainEvent2().emit()
        test_domain_event_3 = TestDomainEvent().emit()
        TestDomainEvent3().emit()

        assert len(self.listened_events_1) == 2
        assert len(self.listened_events_2) == 1
        assert self.listened_events_1[0] == test_domain_event_1
        assert self.listened_events_1[1] == test_domain_event_3
        assert self.listened_events_2[0] == test_domain_event_2
예제 #5
0
    def test_publishing_and_receive_an_event(self):
        self.listened_event = None

        class TestDomainEvent(DomainEvent):
            pass

        class TestDomainSubscriber(DomainEventHandler):
            def process(x, event):
                nonlocal self
                self.listened_event = event

            def listens_to(x):
                return [DomainEvent]

        test_domain_event = TestDomainEvent()
        DomainEventBus().reset()
        TestDomainSubscriber().listen()
        test_domain_event.emit()

        assert self.listened_event == test_domain_event
예제 #6
0
    def emit(self, **kwargs):
        from simple_cqrs.domain_event_bus import DomainEventBus

        DomainEventBus().publish(self, **kwargs)
        return self
예제 #7
0
    def listen(self):
        from simple_cqrs.domain_event_bus import DomainEventBus

        DomainEventBus().subscribe(self)
        return self
예제 #8
0
 def thread_2_func():
     DomainEventBus().reset()
     TestDomainSubscriber2().listen()
     TestDomainEvent().emit()
     TestDomainEvent().emit()
     TestDomainEvent().emit()
예제 #9
0
from hamcrest import *

from demo.commands import FruitCommandHandler, CreateFruit, CreateEventSourcedFruit
from demo.domain import Fruit, EventSourcedFruit
from demo.domain_listeners import FruitDomainEventHandler
from demo.repository import FruitRepository
from simple_cqrs.cqrs.command_bus import CommandBus
from simple_cqrs.domain_event_bus import DomainEventBus

repository = FruitRepository()
CommandBus().register_handler(FruitCommandHandler(repository))
DomainEventBus().reset()

# Each time a FruitCreated event is emitted, this handler will print
DomainEventBus().subscribe(FruitDomainEventHandler())

# Create a command and send to the CommandBus to dispatch it to the appropriate handler
# TODO: Here it would be a great place to introduce the correlation ID to identify and track the command
command = CreateFruit("banana")
id = CommandBus().send(command)

fruit = repository.get(id)

assert_that(fruit, is_(Fruit))
assert_that(fruit.name, is_("banana"))


# Now try with an eventsourced aggregate root
command = CreateEventSourcedFruit("banana")
id = CommandBus().send(command)