Skip to content

Commit

Permalink
Merge pull request #2 from avalanche-development/recursive-object-for…
Browse files Browse the repository at this point in the history
…matting

Recursive object formatting
  • Loading branch information
jacobemerick committed Nov 9, 2016
2 parents 3bd3c92 + 85f18a9 commit 146562d
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 12 deletions.
16 changes: 9 additions & 7 deletions src/ParameterParser.php
Expand Up @@ -63,10 +63,7 @@ protected function getQueryValue(Request $request, array $parameter)
if ($parameter['type'] !== 'array') {
return $value;
}
if (
isset($parameter['collectionFormat']) &&
$parameter['collectionFormat'] === 'multi'
) {
if (isset($parameter['collectionFormat']) && $parameter['collectionFormat'] === 'multi') {
return (array) $value;
}
return $this->explodeValue($value, $parameter);
Expand Down Expand Up @@ -231,7 +228,7 @@ protected function castType($value, array $parameter)
break;
case 'object':
$value = (string) $value;
$value = $this->formatObject($value);
$value = $this->formatObject($value, $parameter);
break;
case 'string':
$value = (string) $value;
Expand Down Expand Up @@ -268,15 +265,20 @@ protected function getParameterType(array $parameter)

/**
* @param string $value
* @param array $parameter
* @return object
*/
protected function formatObject($value)
protected function formatObject($value, array $parameter)
{
// todo this should probably loop through things and format accordingly
$object = json_decode($value);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new BadRequest('Bad json object passed in as parameter');
}

foreach ($object as $key => $attribute) {
$object->{$key} = $this->castType($attribute, $parameter['schema']['properties'][$key]);
}

return $object;
}

Expand Down
33 changes: 28 additions & 5 deletions tests/unit/src/ParameterParserTest.php
Expand Up @@ -861,8 +861,8 @@ public function testCastTypeHandlesObject()
->getMock();
$parameterParser->expects($this->once())
->method('formatObject')
->with(json_encode($value))
->will($this->returnCallback('json_decode'));
->with(json_encode($value), $parameter)
->willReturn($value);
$parameterParser->expects($this->once())
->method('getParameterType')
->with($parameter)
Expand Down Expand Up @@ -1013,6 +1013,16 @@ public function testGetParameterTypeBailsOnEmptyType()

public function testFormatObjectReturnsObject()
{
$parameter = [
'schema' => [
'properties' => [
'key' => [
'some value',
],
],
],
];

$value = (object) [
'key' => 'value',
];
Expand All @@ -1021,10 +1031,20 @@ public function testFormatObjectReturnsObject()
$reflectedFormatObject = $reflectedParameterParser->getMethod('formatObject');
$reflectedFormatObject->setAccessible(true);

$parameterParser = new ParameterParser;
$parameterParser = $this->getMockBuilder(ParameterParser::class)
->setMethods([ 'castType' ])
->getMock();
$parameterParser->expects($this->once())
->method('castType')
->with($value->key, $parameter['schema']['properties']['key'])
->willReturn('value');

$result = $reflectedFormatObject->invokeArgs(
$parameterParser,
[ json_encode($value) ]
[
json_encode($value),
$parameter,
]
);

$this->assertEquals($value, $result);
Expand All @@ -1045,7 +1065,10 @@ public function testFormatObjectBailsOnBadObject()
$parameterParser = new ParameterParser;
$reflectedFormatObject->invokeArgs(
$parameterParser,
[ $value ]
[
$value,
[],
]
);
}

Expand Down

0 comments on commit 146562d

Please sign in to comment.