/** @test */
 public function itCanBeTraversed()
 {
     $requestParameter = $this->prophesize(Parameter::class);
     $requestParameter->getLocation()->willReturn('query');
     $requestParameter->getName()->willReturn('foo');
     $requestParameters = new Parameters([$requestParameter->reveal()]);
     assertThat($requestParameters, isInstanceOf(\Traversable::class));
     assertThat($requestParameters, containsOnlyInstancesOf(Parameter::class));
 }
 /** @test */
 public function itCanCreateRequestParameters()
 {
     $schemaFile = 'file://' . __DIR__ . '/../fixtures/petstore.json';
     $factory = new SwaggerSchemaFactory();
     $schema = $factory->createSchema($schemaFile);
     $requestParameters = $schema->getRequestDefinition('addPet')->getRequestParameters();
     assertThat($requestParameters, isInstanceOf(Parameters::class));
     assertThat($requestParameters->getBody(), isInstanceOf(Parameter::class));
     assertThat($requestParameters->getBodySchema(), isType('object'));
     $requestParameters = $schema->getRequestDefinition('findPetById')->getRequestParameters();
     assertThat($requestParameters->getPath(), containsOnlyInstancesOf(Parameter::class));
     $requestParameters = $schema->getRequestDefinition('findPets')->getRequestParameters();
     assertThat($requestParameters->getQuery(), containsOnlyInstancesOf(Parameter::class));
     assertThat($requestParameters->getQueryParametersSchema(), isType('object'));
     $requestParameters = $schema->getRequestDefinition('updatePet')->getRequestParameters();
     assertThat($requestParameters->getHeaders(), containsOnlyInstancesOf(Parameter::class));
     assertThat($requestParameters->getHeadersSchema(), isType('object'));
 }
 /** @test */
 public function itValidateAResponse()
 {
     $expectedViolations = [new ConstraintViolation('id', 'String value found, but an integer is required', 'type', 'body'), new ConstraintViolation('X-Required-Header', 'The property X-Required-Header is required', 'required', 'header')];
     $headersSchema = $this->toObject(['type' => 'object', 'required' => ['X-Required-Header'], 'properties' => ['X-Required-Header' => ['type' => 'string']]]);
     $bodySchema = $this->toObject(['type' => 'object', 'properties' => ['id' => ['type' => 'integer', 'format' => 'int32']]]);
     $response = $this->prophesize(ResponseInterface::class);
     $response->getStatusCode()->willReturn('200');
     $response->getBody()->willReturn('{"id": "invalid"}');
     $response->getHeaderLine('Content-Type')->willReturn('application/json');
     $response->getHeaders()->willReturn([]);
     $responseDefinition = $this->prophesize(RequestDefinition::class);
     $responseDefinition->getContentTypes()->willReturn(['application/json']);
     $responseDefinition->hasBodySchema()->willReturn(true);
     $responseDefinition->getBodySchema()->willReturn($bodySchema);
     $responseDefinition->hasHeadersSchema()->willReturn(true);
     $responseDefinition->getHeadersSchema()->willReturn($headersSchema);
     $definition = $this->prophesize(RequestDefinition::class);
     $definition->getResponseDefinition('200')->willReturn($responseDefinition);
     $this->messageValidator->validateResponse($response->reveal(), $definition->reveal());
     assertThat($this->messageValidator->hasViolations(), isTrue());
     assertThat($this->messageValidator->getViolations(), containsOnlyInstancesOf(ConstraintViolation::class));
     assertThat($this->messageValidator->getViolations(), equalTo($expectedViolations));
 }