From 66c7f7c26b93a5a3a69665e2d7c4a2b8ba402157 Mon Sep 17 00:00:00 2001 From: jacobemerick Date: Mon, 7 Nov 2016 19:38:00 -0700 Subject: [PATCH 1/2] Initial attempt at body parameter parsing --- src/ParameterParser.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/ParameterParser.php b/src/ParameterParser.php index cf6d8a4..4d100c1 100644 --- a/src/ParameterParser.php +++ b/src/ParameterParser.php @@ -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); @@ -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; @@ -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 => $value) { + $object[$key] = $this->castType($value, $parameter['schema']['properties'][$key]); + } + return $object; } From 85f18a98a4838bb3ef261de305aeead100d0f87a Mon Sep 17 00:00:00 2001 From: jacobemerick Date: Tue, 8 Nov 2016 20:08:24 -0700 Subject: [PATCH 2/2] Updates tests to account for new object formatting --- src/ParameterParser.php | 4 ++-- tests/unit/src/ParameterParserTest.php | 33 ++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/ParameterParser.php b/src/ParameterParser.php index 4d100c1..995d4be 100644 --- a/src/ParameterParser.php +++ b/src/ParameterParser.php @@ -275,8 +275,8 @@ protected function formatObject($value, array $parameter) throw new BadRequest('Bad json object passed in as parameter'); } - foreach ($object as $key => $value) { - $object[$key] = $this->castType($value, $parameter['schema']['properties'][$key]); + foreach ($object as $key => $attribute) { + $object->{$key} = $this->castType($attribute, $parameter['schema']['properties'][$key]); } return $object; diff --git a/tests/unit/src/ParameterParserTest.php b/tests/unit/src/ParameterParserTest.php index 6bc21ed..3ee197c 100644 --- a/tests/unit/src/ParameterParserTest.php +++ b/tests/unit/src/ParameterParserTest.php @@ -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) @@ -1013,6 +1013,16 @@ public function testGetParameterTypeBailsOnEmptyType() public function testFormatObjectReturnsObject() { + $parameter = [ + 'schema' => [ + 'properties' => [ + 'key' => [ + 'some value', + ], + ], + ], + ]; + $value = (object) [ 'key' => 'value', ]; @@ -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); @@ -1045,7 +1065,10 @@ public function testFormatObjectBailsOnBadObject() $parameterParser = new ParameterParser; $reflectedFormatObject->invokeArgs( $parameterParser, - [ $value ] + [ + $value, + [], + ] ); }