/**
  * @test
  * @covers ::result
  */
 public function it_should_error_when_an_invalid_response_is_returned_by_the_eventstore()
 {
     $this->setExpectedException(InvalidResponseException::class);
     $this->thenConnectionIsChecked();
     $invalidResponse = '';
     $projections = EventStore::forUrl('127.0.0.1', $this->httpClient);
     $this->httpClient->shouldReceive('send')->once()->with(m::on(function (Request $request) {
         return $request->getMethod() == 'GET' && (string) $request->getUri() === 'result-url';
     }))->andReturn(new Response(200, [], $invalidResponse));
     $projections->result(Definition::fromEventStore(['name' => '', 'mode' => '', 'status' => '', 'progress' => '', 'stateUrl' => '', 'resultUrl' => 'result-url', 'queryUrl' => '', 'enableCommandUrl' => '', 'disableCommandUrl' => '']));
 }
 public function get($name)
 {
     $url = $this->projectionUrl($name) . '/statistics';
     $request = new Request('GET', $url);
     $this->sendRequest($request);
     $this->ensureStatusCodeIsGood($url);
     $data = current(json_decode($this->lastResponse->getBody()->getContents(), true)['projections']);
     $definition = Definition::fromEventStore($data);
     $definition = $definition->withUpdatedQuery($this->query($definition));
     return $definition;
 }
    /**
     * @test
     * @covers ::fromEventStore
     * @covers ::name
     * @covers ::enabled
     * @covers ::status
     * @covers ::query
     * @covers ::urls
     * @covers ::mode
     * @covers ::progress
     * @covers ::mayEmitNewEvents
     */
    public function it_should_create_a_definition_from_data_retrieved_from_the_event_store()
    {
        $mode = "Continuous";
        $name = "Organisation";
        $status = "Running";
        $progress = "100.0";
        $resultUrl = "http://192.168.99.100:2113/projection/Organisation/result";
        $stateUrl = "http://192.168.99.100:2113/projection/Organisation/state";
        $statusUrl = "http://192.168.99.100:2113/projection/Organisation";
        $queryUrl = "http://192.168.99.100:2113/projection/Organisation/query%3Fconfig=yes";
        $enableCommandUrl = "http://192.168.99.100:2113/projection/Organisation/command/enable";
        $disableCommandUrl = "http://192.168.99.100:2113/projection/Organisation/command/disable";
        $resetCommandUrl = "http://192.168.99.100:2113/projection/Organisation/command/reset";
        $json = <<<JSON
{
  "coreProcessingTime": 2,
  "version": 4,
  "epoch": 4,
  "effectiveName": "{$name}",
  "writesInProgress": 0,
  "readsInProgress": 0,
  "partitionsCached": 1,
  "status": "{$status}",
  "stateReason": "",
  "name": "{$name}",
  "mode": "{$mode}",
  "position": "C:63821834/P:63821834; Psybizz\\\\Neon\\\\DomainModel\\\\Organisation\\\\OrganisationRegistered: -1; ",
  "progress": {$progress},
  "lastCheckpoint": "C:63821834/P:63821834; Psybizz\\\\Neon\\\\DomainModel\\\\Organisation\\\\OrganisationRegistered: -1; ",
  "eventsProcessedAfterRestart": 3,
  "statusUrl": "{$statusUrl}",
  "stateUrl": "{$stateUrl}",
  "resultUrl": "{$resultUrl}",
  "queryUrl": "{$queryUrl}",
  "enableCommandUrl": "{$enableCommandUrl}",
  "disableCommandUrl": "{$disableCommandUrl}",
  "checkpointStatus": "",
  "bufferedEvents": 0,
  "writePendingEventsBeforeCheckpoint": 0,
  "writePendingEventsAfterCheckpoint": 0
}
JSON;
        $eventStoreProjectionData = json_decode($json, true);
        $expectedUrls = ['state' => urldecode($stateUrl), 'result' => urldecode($resultUrl), 'query' => urldecode($queryUrl), 'commands' => ['enable' => urldecode($enableCommandUrl), 'disable' => urldecode($disableCommandUrl), 'reset' => urldecode($resetCommandUrl)]];
        $definition = Definition::fromEventStore($eventStoreProjectionData);
        $this->assertSame(strtolower($status), $definition->status());
        $this->assertSame(true, $definition->enabled());
        $this->assertSame(100.0, $definition->progress());
        $this->assertSame(strtolower($mode), $definition->mode());
        $this->assertSame('', $definition->query());
        $this->assertSame($expectedUrls, $definition->urls());
        $this->assertSame(null, $definition->mayEmitNewEvents());
    }