@Bean @Lazy @Scope(BeanDefinition.SCOPE_SINGLETON) public AggregateRepository<TState, TEvent> getAggregateRepository( final EventRepository<TEvent> eventRepository) { return new DefaultAggregateRepository<>(eventRepository, projection, this::resolveType); }
@Override public int append( final String aggregateId, final Iterable<? extends TEvent> events, final ExpectedVersion expectedVersion, final Map<String, String> metadata) { List<EventData<TEvent>> eventDatas = StreamSupport .stream(events.spliterator(), false) .map(e -> new EventData<TEvent>( getEventType(e), UUID.randomUUID(), metadata, e)) .collect(Collectors.toList()); return eventRepository.append(aggregateId, eventDatas, expectedVersion); }
@Test public void updatePassesOnEventsToEventRepository() { List<TestEvent> events = Arrays.asList(new TestEvent("test1"), new TestEvent("test2")); when(eventRepository.append(any(), anyList(), any())).thenReturn(42); repository.append(AGGREGATE_ID_1, events, ExpectedVersion.any()); ArgumentCaptor<List<EventData<TestEvent>>> passedEvents = ArgumentCaptor.forClass((Class) List.class); verify(eventRepository).append(eq(AGGREGATE_ID_1), passedEvents.capture(), any()); Assert.assertThat( passedEvents .getValue() .stream() .map(EventData::getEvent) .collect(Collectors.toList()), org.hamcrest.Matchers.contains(events.toArray())); }
private void returnsAggregateWithEmptyStateOn( final EventReadResult readEventsResult) { when(eventRepository.read(any(), anyInt(), anyInt())).thenReturn(readEventsResult); ImmutableAggregate<TestState, TestEvent> aggregate = repository.load(AGGREGATE_ID_1); verify(eventRepository).read(eq(AGGREGATE_ID_1), eq(0), anyInt()); verifyNoMoreInteractions(eventRepository); Assert.assertNotNull(aggregate); Assert.assertEquals(aggregate.state().getValue(), "empty"); Assert.assertEquals(-1, aggregate.sourceVersion()); }
@Test public void versionPassedOnAndReturned() { ExpectedVersion expectedVersion = exactly(42); int newVersion = 45; when(eventRepository.append(any(), anyList(), any())).thenReturn(newVersion); int actualNewVersion = repository.append(AGGREGATE_ID_1, new TestEvent("test"), expectedVersion); verify(eventRepository).append(eq(AGGREGATE_ID_1), anyList(), eq(expectedVersion)); Assert.assertEquals(newVersion, actualNewVersion); }
when(aggregateProjection.apply(any(), any(), (Iterable) any())).thenReturn(expectedState); ImmutableAggregate<TestState, TestEvent> result = repository.load(AGGREGATE_ID_1);
@Override public ImmutableAggregate<TState, TEvent> save( @NotNull final Aggregate<TState, TEvent> aggregate, final boolean atomic, final Map<String, String> metadata) { Preconditions.checkNotNull(aggregate); ExpectedVersion expectedVersion; if (atomic) { if (aggregate.sourceVersion() == Aggregate.VERSION_NOT_CREATED) { expectedVersion = ExpectedVersion.notCreated(); } else { expectedVersion = ExpectedVersion.exactly(aggregate.sourceVersion()); } } else { expectedVersion = ExpectedVersion.any(); } int newVersion = append( aggregate.id(), aggregate.events(), expectedVersion, metadata); return DefaultImmutableAggregate.fromExisting( projection, aggregate.id(), newVersion, aggregate.state()); }
@Before @SuppressWarnings("unchecked") public void setUpRepository() { eventRepository = mock(EventRepository.class); aggregateProjection = mock(AggregateProjection.class); when(aggregateProjection.empty()).thenReturn(new TestState("empty")); repository = new DefaultAggregateRepository<>(eventRepository, aggregateProjection); }
@Override public int append( final String aggregateId, final Iterable<? extends TEvent> events, final ExpectedVersion expectedVersion, final Map<String, String> metadata) { List<EventData<TEvent>> eventDatas = StreamSupport .stream(events.spliterator(), false) .map(e -> new EventData<TEvent>( getEventType(e), UUID.randomUUID(), metadata, e)) .collect(Collectors.toList()); return eventRepository.append(aggregateId, eventDatas, expectedVersion); }
when(aggregateProjection.apply(any(), any(), (Iterable) any())).thenReturn(expectedState); repository.load(AGGREGATE_ID_1); verify(aggregateProjection).empty(); verify(aggregateProjection, times(2)).apply(any(), any(), (Iterable) any());
@Override public ImmutableAggregate<TState, TEvent> save( @NotNull final Aggregate<TState, TEvent> aggregate, final boolean atomic, final Map<String, String> metadata) { Preconditions.checkNotNull(aggregate); ExpectedVersion expectedVersion; if (atomic) { if (aggregate.sourceVersion() == Aggregate.VERSION_NOT_CREATED) { expectedVersion = ExpectedVersion.notCreated(); } else { expectedVersion = ExpectedVersion.exactly(aggregate.sourceVersion()); } } else { expectedVersion = ExpectedVersion.any(); } int newVersion = append( aggregate.id(), aggregate.events(), expectedVersion, metadata); return DefaultImmutableAggregate.fromExisting( projection, aggregate.id(), newVersion, aggregate.state()); }