/**
  * @test
  * @covers ::persist
  */
 public function it_should_persist_an_aggregate_root()
 {
     $aggregate = new AggregateMock();
     $exampleEvent = m::mock(\stdClass::class);
     $aggregate->recordEvent($exampleEvent);
     $this->streamNameGenerator->shouldReceive('generate')->andReturn('stream.id');
     $this->eventSerializer->shouldReceive('serialize')->with($exampleEvent)->andReturn(['id' => 2]);
     $this->transaction->shouldReceive('push')->once()->with('stream.id', m::on(function ($events) use($exampleEvent) {
         /** @var WritableEvent $event */
         $event = current($events);
         $data = $event->toStreamData();
         $this->assertSame(get_class($exampleEvent), $data['eventType']);
         $this->assertSame(['id' => 2], $data['data']);
         $this->assertSame(['user_id' => 1], $data['metadata']);
         return true;
     }));
     $this->metadataStore->shouldReceive('metadata')->with($exampleEvent)->andReturn(['user_id' => 1]);
     $this->repository->persist($aggregate);
 }
 /**
  * @param object|IsEventSourced $aggregateRoot
  *
  * @return array
  */
 private function getWriteableEventsFromAggregate($aggregateRoot)
 {
     $domainEvents = $aggregateRoot->extractRecordedEvents();
     $eventsArray = [];
     foreach ($domainEvents as $event) {
         $metadata = [];
         if ($this->metadataStore) {
             $metadata = $this->metadataStore->metadata($event);
         }
         $eventsArray[] = WritableEvent::newInstance(get_class($event), $this->eventSerializer->serialize($event), $metadata);
     }
     return $eventsArray;
 }