/** @test */ public function itValidateARequest() { $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'), new ConstraintViolation('limit', 'String value found, but an integer is required', 'type', 'query')]; $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']]]); $queryParametersSchema = $this->toObject(['type' => 'object', 'properties' => ['limit' => ['type' => 'integer']]]); $uri = $this->prophesize(UriInterface::class); $uri->getQuery()->willreturn('limit=invalid'); $request = $this->prophesize(RequestInterface::class); $request->getMethod()->willReturn('POST'); $request->getUri()->willReturn($uri); $request->getBody()->willReturn('{"id": "invalid"}'); $request->getHeaderLine('Content-Type')->willReturn('application/json'); $request->getHeaders()->willReturn([]); $definition = $this->prophesize(RequestDefinition::class); $definition->getContentTypes()->willReturn(['application/json']); $definition->hasBodySchema()->willReturn(true); $definition->getBodySchema()->willReturn($bodySchema); $definition->hasHeadersSchema()->willReturn(true); $definition->getHeadersSchema()->willReturn($headersSchema); $definition->hasQueryParametersSchema()->willReturn(true); $definition->getQueryParametersSchema()->willReturn($queryParametersSchema); $this->messageValidator->validateRequest($request->reveal(), $definition->reveal()); assertThat($this->messageValidator->hasViolations(), isTrue()); assertThat($this->messageValidator->getViolations(), containsOnlyInstancesOf(ConstraintViolation::class)); assertThat($this->messageValidator->getViolations(), equalTo($expectedViolations)); }
/** * Validate a Request message * If the config option "withRequestValidation" is set to FALSE it won't validate the Request * * @param RequestInterface $request * @param RequestDefinition $definition * * @throws ConstraintViolations */ private function validateRequest(RequestInterface $request, RequestDefinition $definition) { if ($this->config['validateRequest'] === false) { return; } $this->messageValidator->validateRequest($request, $definition); if ($this->messageValidator->hasViolations()) { throw new RequestViolations($this->messageValidator->getViolations()); } }