Skip to content
This repository has been archived by the owner on Jan 15, 2024. It is now read-only.

Commit

Permalink
Refs #24
Browse files Browse the repository at this point in the history
  • Loading branch information
kleijnweb committed Sep 14, 2015
1 parent 5717428 commit 3922060
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 9 deletions.
46 changes: 37 additions & 9 deletions src/Request/RequestTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use KleijnWeb\SwaggerBundle\Exception\InvalidParametersException;
use KleijnWeb\SwaggerBundle\Exception\MalformedContentException;
use KleijnWeb\SwaggerBundle\Exception\UnsupportedContentTypeException;
use Symfony\Component\Serializer\Encoder\JsonDecode;

/**
* @author John Kleijn <john@kleijnweb.nl>
Expand Down Expand Up @@ -45,12 +46,20 @@ public function __construct(ContentDecoder $contentDecoder)
*/
public function coerceRequest(Request $request, array $operationDefinition)
{
// TODO HACK for https://github.com/kleijnweb/swagger-bundle/issues/24
$originalContent = $request->getContent();
$stdClassContent = null;
if ($originalContent) {
$decoder = new JsonDecode(false);
$stdClassContent = (object)$decoder->decode($originalContent, 'json');
}

$content = $this->contentDecoder->decodeContent($request, $operationDefinition);

// This modifies the Request object (and adds the content to the 'attributes' ParameterBag
$this->coerceRequestParameters($request, $operationDefinition, $content);

$this->validateRequest($request, $operationDefinition);
$this->validateRequest($request, $operationDefinition, $stdClassContent);

// Needed to be able to set the decoded body
$request->initialize(
Expand Down Expand Up @@ -149,16 +158,17 @@ public function coerceRequestParameters(Request $request, array $operationDefini
/**
* TODO Move to new RequestValidator
*
* @param Request $request
* @param array $operationDefinition
* @param Request $request
* @param array $operationDefinition
* @param \stdClass $content
*
* @throws InvalidParametersException
* @throws UnsupportedException
*/
private function validateRequest(Request $request, array $operationDefinition)
private function validateRequest(Request $request, array $operationDefinition, \stdClass $content = null)
{
// This retrieves the modified parameters
$parameters = $this->assembleParameterDataForValidation($request, $operationDefinition);
$parameters = $this->assembleParameterDataForValidation($request, $operationDefinition, $content);

// Validate the parameters using a schema created from the operation definition
$validator = new Validator();
Expand All @@ -177,14 +187,18 @@ private function validateRequest(Request $request, array $operationDefinition)
/**
* TODO Move to new RequestValidator
*
* @param Request $request
* @param array $operationDefinition
* @param Request $request
* @param array $operationDefinition
* @param \stdClass $content
*
* @return \stdClass
* @throws UnsupportedException
*/
private function assembleParameterDataForValidation(Request $request, array $operationDefinition)
{
private function assembleParameterDataForValidation(
Request $request,
array $operationDefinition,
\stdClass $content = null
) {
if (!isset($operationDefinition['parameters'])) {
return new \stdClass;
}
Expand All @@ -208,7 +222,21 @@ private function assembleParameterDataForValidation(Request $request, array $ope
if (!$request->$paramBagName->has($paramName)) {
continue;
}
if ($paramDefinition['in'] === 'body' && $content) {
$parameters[$paramName] = $content;
continue;
}
$parameters[$paramName] = $request->$paramBagName->get($paramName);

// TODO HACK related to https://github.com/kleijnweb/swagger-bundle/issues/24
if (isset($paramDefinition['format'])) {
if ($paramDefinition['format'] === 'date') {
$parameters[$paramName] = $parameters[$paramName]->format('Y-m-d');
}
if ($paramDefinition['format'] === 'date-time') {
$parameters[$paramName] = $parameters[$paramName]->format(\DateTime::W3C);
}
}
}

// TODO Hack, probably not the best performing of solutions
Expand Down
37 changes: 37 additions & 0 deletions src/Tests/Request/RequestTransformerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

use KleijnWeb\SwaggerBundle\Request\RequestTransformer;
use KleijnWeb\SwaggerBundle\Request\Transformer\ContentDecoder;
use KleijnWeb\SwaggerBundle\Request\Transformer\ParameterCoercer;
use Symfony\Component\HttpFoundation\Request;

/**
Expand Down Expand Up @@ -113,6 +114,8 @@ public function canOmitParameterWhenNotExplicitlyMarkedAsRequired()

$transformer = new RequestTransformer($this->contentDecoderMock);
$content = '[]';

// TODO: This will break: content (body) vs query
$request = new Request([], [], [], [], [], [], $content);

$operationDefinition = [
Expand All @@ -130,6 +133,40 @@ public function canOmitParameterWhenNotExplicitlyMarkedAsRequired()
$this->assertSame([], $request->getContent());
}

/**
* @test
*/
public function willConstructDate()
{
$this->contentDecoderMock = $this
->getMockBuilder('KleijnWeb\SwaggerBundle\Request\Transformer\ContentDecoder')
->disableOriginalConstructor()
->getMock();

$transformer = new RequestTransformer($this->contentDecoderMock);
$request = new Request(['foo' => "2015-01-01"], [], [], [], [], []);

$operationDefinition = [
'parameters' => [
[
'name' => 'foo',
'in' => 'query',
'type' => 'string',
'format' => 'date'
]
]
];

$transformer->coerceRequest($request, $operationDefinition);

$expected = ParameterCoercer::coerceParameter($operationDefinition['parameters'][0], "2015-01-01");

// Sanity check
$this->assertInstanceOf('DateTime', $expected);

$this->assertEquals($expected, $request->get('foo'));
}

/**
* @test
* @expectedException \KleijnWeb\SwaggerBundle\Exception\InvalidParametersException
Expand Down

0 comments on commit 3922060

Please sign in to comment.