/**
  * @param string $streamId
  * @param int    $expectedVersion
  * @param array  $events
  */
 public function appendToStream(string $streamId, int $expectedVersion, array $events)
 {
     $events = EventDataCollection::fromArray($events);
     if (0 === $events->count()) {
         throw new \InvalidArgumentException('No events provided.');
     }
     $streamId = new StreamId($streamId);
     if ($streamId->isSystem()) {
         throw new \InvalidArgumentException(sprintf('Can not append to system stream %s', $streamId));
     }
     $expectedVersion = new ExpectedVersion($expectedVersion);
     $request = new AppendToStreamRequestFactory($streamId, $expectedVersion, $events);
     $this->send($request->buildRequest(), new AppendToStreamResponseInspector());
 }
    public function testCanBuildARequest()
    {
        $uuid1 = $this->newUuid();
        $type1 = 'RayRutjes\\GetEventStore\\FakeEvent1';
        $data1 = ['a' => 'test1'];
        $metadata1 = [];
        $event1 = new EventData($uuid1, $type1, $data1, $metadata1);
        $uuid2 = $this->newUuid();
        $type2 = 'RayRutjes\\GetEventStore\\FakeEvent2';
        $data2 = ['a' => 'test2'];
        $metadata2 = ['test' => 'value'];
        $event2 = new EventData($uuid2, $type2, $data2, $metadata2);
        $expectedBody = <<<'EOD'
[
    {
        "eventId": "%s",
        "eventType": "RayRutjes\\GetEventStore\\FakeEvent1",
        "data": {"a":"test1"},
        "metadata":[]
    },
    {
        "eventId": "%s",
        "eventType": "RayRutjes\\GetEventStore\\FakeEvent2",
        "data": {"a":"test2"},
        "metadata": {"test":"value"}
    }
]
EOD;
        $expectedBody = sprintf(str_replace([' ', "\n"], '', $expectedBody), $uuid1, $uuid2);
        $cut = new AppendToStreamRequestFactory(new StreamId('stream'), new ExpectedVersion(ExpectedVersion::ANY), EventDataCollection::fromArray([$event1, $event2]));
        $request = $cut->buildRequest();
        $this->assertEquals('POST', $request->getMethod());
        $this->assertEquals('streams/stream', $request->getUri()->getPath());
        $this->assertEquals(ContentType::JSON_ES, $request->getHeaderLine(RequestHeader::CONTENT_TYPE));
        $this->assertEmpty($request->getHeader(RequestHeader::EVENT_ID));
        $this->assertEmpty($request->getHeader(RequestHeader::EVENT_TYPE));
        $this->assertEquals(ExpectedVersion::ANY, $request->getHeaderLine(RequestHeader::EXPECTED_VERSION));
        $this->assertEquals($expectedBody, $request->getBody()->getContents());
    }