/**
  * @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()));
 }