/** * @param AggregateRoot $aggregateRoot * @test * @dataProvider aggregateRootProvider */ public function itShouldTakeASnapshot(AggregateRoot $aggregateRoot) { $stream = $aggregateRoot->getEventStream(); $this->setUpForEventStream($stream); $snapshotStore = $this->prophesize(SnapshotStoreInterface::class); $stream->each(function (DomainMessage $domainMessage) use($snapshotStore, $aggregateRoot) { $snapshotStore->has($aggregateRoot->getAggregateRootId(), $domainMessage->getVersion())->shouldBeCalled()->willReturn(false); $snapshotStore->save(Argument::type(Snapshot::class))->shouldBeCalled(); }); $strategy = $this->prophesize(SnapshotStrategyInterface::class); $strategy->isFulfilled(new StreamName('event_stream'), $aggregateRoot)->shouldBeCalled()->willReturn(true); $snapshotter = new Snapshotter($snapshotStore->reveal(), $strategy->reveal()); $repo = new AggregateRepository($this->eventStore->reveal(), $this->eventBus->reveal(), $snapshotter); $repo->save($aggregateRoot); }
/** * @test * @dataProvider eventStoreProvider * @param $eventStoreAdapter * @param $snapshotAdapter */ public function isShouldStoreEvents($eventStoreAdapter, $snapshotAdapter) { $locator = new InMemoryLocator(); $commandBus = new SimpleCommandBus($locator); $eventBus = new SimpleEventBus(); $eventStore = new EventStore($eventStoreAdapter); $snapshotStore = new SnapshotStore($snapshotAdapter); $snapshotter = new Snapshotter($snapshotStore, new CountSnapshotStrategy($eventStore, 5)); $aggregateRepo = new AggregateRepository($eventStore, $eventBus, $snapshotter); $locator->addHandler(AssignNameCommand::class, new AssignNameHandler($aggregateRepo)); $aggregateRoot = AggregateRoot::create(AggregateId::generate(), 'test1'); $aggregateRepo->save($aggregateRoot); $command = new AssignNameCommand($aggregateRoot->getAggregateRootId(), 'test2'); $commandBus->execute($command); $commandBus->execute($command); $commandBus->execute($command); $commandBus->execute($command); $this->assertEquals(6, $eventStore->countEventsFor(new StreamName('event_stream'), $aggregateRoot->getAggregateRootId())); }