use of io.spine.core.Event in project core-java by SpineEventEngine.
the class AggregateMessageDeliveryShould method postpone_events_dispatched_to_reactor_method.
@Test
public void postpone_events_dispatched_to_reactor_method() {
assertNull(ReactingProject.getEventReceived());
final Event event = projectStarted();
boundedContext.getEventBus().post(event);
assertNull(ReactingProject.getEventReceived());
final EventEnvelope expectedEnvelope = EventEnvelope.of(event);
final PostponingEventDelivery delivery = repository.getEventEndpointDelivery();
final Map<ProjectId, EventEnvelope> postponedEvents = delivery.getPostponedEvents();
assertTrue(postponedEvents.size() == 1 && postponedEvents.containsValue(expectedEnvelope));
final ProjectId projectId = postponedEvents.keySet().iterator().next();
delivery.deliverNow(projectId, postponedEvents.get(projectId));
final AggProjectStarted deliveredEventMsg = ReactingProject.getEventReceived();
assertNotNull(deliveredEventMsg);
assertEquals(Events.getMessage(event), deliveredEventMsg);
}
use of io.spine.core.Event in project core-java by SpineEventEngine.
the class AggregateShould method create_single_event_for_a_pair_of_events_with_empty_for_an_event_react.
/**
* Ensures that a {@linkplain io.spine.server.tuple.Pair pair} with an empty second optional
* value returned from a reaction on an event stores a single event.
*
* <p>The first event is produced while handling a command by the
* {@link TaskAggregate#handle(AggAssignTask) TaskAggregate#handle(AggAssignTask)}.
* Then as a reaction to this event a single event should be fired as part of the pair by
* {@link TaskAggregate#on(AggTaskAssigned) TaskAggregate#on(AggTaskAssigned)}.
*/
@Test
public void create_single_event_for_a_pair_of_events_with_empty_for_an_event_react() {
final BoundedContext boundedContext = newTaskBoundedContext();
final TenantId tenantId = newTenantId();
final Command command = command(assignTask(), tenantId);
final MemoizingObserver<Ack> observer = memoizingObserver();
boundedContext.getCommandBus().post(command, observer);
assertNull(observer.getError());
final List<Ack> responses = observer.responses();
assertSize(1, responses);
final Ack response = responses.get(0);
final io.spine.core.Status status = response.getStatus();
final Error emptyError = Error.getDefaultInstance();
assertEquals(emptyError, status.getError());
final Rejection emptyRejection = Rejection.getDefaultInstance();
assertEquals(emptyRejection, status.getRejection());
final List<Event> events = readAllEvents(boundedContext, tenantId);
assertSize(2, events);
final Event sourceEvent = events.get(0);
final TypeUrl taskAssignedType = TypeUrl.from(AggTaskAssigned.getDescriptor());
assertEquals(typeUrlOf(sourceEvent), taskAssignedType);
final Event reactionEvent = events.get(1);
final TypeUrl userNotifiedType = TypeUrl.from(AggUserNotified.getDescriptor());
assertEquals(typeUrlOf(reactionEvent), userNotifiedType);
}
use of io.spine.core.Event in project core-java by SpineEventEngine.
the class AggregateShould method propagate_RuntimeException_when_play_raises_exception.
@Test
public void propagate_RuntimeException_when_play_raises_exception() {
ModelTests.clearModel();
final FaultyAggregate faultyAggregate = new FaultyAggregate(ID, false, true);
try {
final Event event = event(projectCreated(ID, getClass().getSimpleName()), 1);
final AggregateTransaction tx = AggregateTransaction.start(faultyAggregate);
((Aggregate) faultyAggregate).play(AggregateStateRecord.newBuilder().addEvent(event).build());
tx.commit();
failNotThrows();
} catch (RuntimeException e) {
@SuppressWarnings("ThrowableResultOfMethodCallIgnored") final Throwable // because we need it for checking.
cause = getRootCause(e);
assertTrue(cause instanceof IllegalStateException);
assertEquals(FaultyAggregate.BROKEN_APPLIER, cause.getMessage());
}
}
use of io.spine.core.Event in project core-java by SpineEventEngine.
the class AggregateShould method create_single_event_for_a_pair_of_events_with_empty_for_a_rejection_react.
/**
* Ensures that a {@linkplain io.spine.server.tuple.Pair pair} with an empty second optional
* value returned from a reaction on a rejection stores a single event.
*
* <p>The rejection is fired by the {@link TaskAggregate#handle(AggReassignTask)
* TaskAggregate.handle(AggReassignTask)}
* and handled by the {@link TaskAggregate#on(Rejections.AggCannotReassignUnassignedTask)
* TaskAggregate.on(AggCannotReassignUnassignedTask)}.
*/
@Test
public void create_single_event_for_a_pair_of_events_with_empty_for_a_rejection_react() {
final BoundedContext boundedContext = newTaskBoundedContext();
final TenantId tenantId = newTenantId();
final Command command = command(reassignTask(), tenantId);
final MemoizingObserver<Ack> observer = memoizingObserver();
boundedContext.getCommandBus().post(command, observer);
assertNull(observer.getError());
final List<Ack> responses = observer.responses();
assertSize(1, responses);
final Ack response = responses.get(0);
final io.spine.core.Status status = response.getStatus();
final Error emptyError = Error.getDefaultInstance();
assertEquals(emptyError, status.getError());
final Rejection emptyRejection = Rejection.getDefaultInstance();
assertEquals(emptyRejection, status.getRejection());
final List<Event> events = readAllEvents(boundedContext, tenantId);
assertSize(1, events);
final Event reactionEvent = events.get(0);
final TypeUrl userNotifiedType = TypeUrl.from(AggUserNotified.getDescriptor());
assertEquals(typeUrlOf(reactionEvent), userNotifiedType);
}
use of io.spine.core.Event in project core-java by SpineEventEngine.
the class AggregateShould method write_its_version_into_event_context.
@Test
public void write_its_version_into_event_context() {
dispatchCommand(aggregate, env(createProject));
// Get the first event since the command handler produces only one event message.
final Aggregate<?, ?, ?> agg = this.aggregate;
final List<Event> uncommittedEvents = agg.getUncommittedEvents();
final Event event = uncommittedEvents.get(0);
assertEquals(this.aggregate.getVersion(), event.getContext().getVersion());
}
Aggregations