From eaaa54bf1138a95cc911087c16b630c1b51f6cca Mon Sep 17 00:00:00 2001 From: lucasvanlierop Date: Mon, 29 Sep 2014 16:17:36 +0200 Subject: [PATCH 1/3] Fixed checking HTTP method type --- Annotation/ApiDoc.php | 8 ++++++++ Extractor/ApiDocExtractor.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Annotation/ApiDoc.php b/Annotation/ApiDoc.php index dd7242a..a132a1b 100644 --- a/Annotation/ApiDoc.php +++ b/Annotation/ApiDoc.php @@ -579,6 +579,14 @@ class ApiDoc return $this; } + /** + * @return string + */ + public function getMethod() + { + return $this->method; + } + /** * @return array */ diff --git a/Extractor/ApiDocExtractor.php b/Extractor/ApiDocExtractor.php index 9241516..ac1b503 100644 --- a/Extractor/ApiDocExtractor.php +++ b/Extractor/ApiDocExtractor.php @@ -282,7 +282,7 @@ class ApiDocExtractor $parameters = $this->clearClasses($parameters); $parameters = $this->generateHumanReadableTypes($parameters); - if ('PUT' === $method) { + if ('PUT' === $annotation->getMethod()) { // All parameters are optional with PUT (update) array_walk($parameters, function ($val, $key) use (&$data) { $parameters[$key]['required'] = false; From f625d9671c9a7a4cd886949755a33e74f656a497 Mon Sep 17 00:00:00 2001 From: lucasvanlierop Date: Mon, 29 Sep 2014 16:18:11 +0200 Subject: [PATCH 2/3] Fixed disabling required for HTTP PUT requests --- Extractor/ApiDocExtractor.php | 2 +- Tests/Extractor/ApiDocExtractorTest.php | 26 ++++++++++++++++++++ Tests/Fixtures/Controller/TestController.php | 9 +++++++ Tests/Fixtures/Form/TestType.php | 1 + Tests/Fixtures/app/config/routing.yml | 15 +++++++++++ 5 files changed, 52 insertions(+), 1 deletion(-) diff --git a/Extractor/ApiDocExtractor.php b/Extractor/ApiDocExtractor.php index ac1b503..56d6589 100644 --- a/Extractor/ApiDocExtractor.php +++ b/Extractor/ApiDocExtractor.php @@ -284,7 +284,7 @@ class ApiDocExtractor if ('PUT' === $annotation->getMethod()) { // All parameters are optional with PUT (update) - array_walk($parameters, function ($val, $key) use (&$data) { + array_walk($parameters, function ($val, $key) use (&$parameters) { $parameters[$key]['required'] = false; }); } diff --git a/Tests/Extractor/ApiDocExtractorTest.php b/Tests/Extractor/ApiDocExtractorTest.php index a0dbd29..b09d8ad 100644 --- a/Tests/Extractor/ApiDocExtractorTest.php +++ b/Tests/Extractor/ApiDocExtractorTest.php @@ -11,6 +11,8 @@ namespace Nelmio\ApiDocBundle\Tests\Extractor; +use Nelmio\ApiDocBundle\Annotation\ApiDoc; +use Nelmio\ApiDocBundle\Extractor\ApiDocExtractor; use Nelmio\ApiDocBundle\Tests\WebTestCase; class ApiDocExtractorTest extends WebTestCase @@ -256,4 +258,28 @@ class ApiDocExtractorTest extends WebTestCase ); $this->assertCount(1, $parsers); } + + public function testPostRequestDoesRequireParametersWhenMarkedAsSuch() + { + $container = $this->getContainer(); + /** @var ApiDocExtractor $extractor */ + $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); + /** @var ApiDoc $annotation */ + $annotation = $extractor->get('Nelmio\ApiDocBundle\Tests\Fixtures\Controller\TestController::requiredParametersAction', 'test_required_parameters'); + + $parameters = $annotation->getParameters(); + $this->assertTrue($parameters['required_field']['required']); + } + + public function testPutRequestDoesNeverRequireParameters() + { + $container = $this->getContainer(); + /** @var ApiDocExtractor $extractor */ + $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); + /** @var ApiDoc $annotation */ + $annotation = $extractor->get('Nelmio\ApiDocBundle\Tests\Fixtures\Controller\TestController::requiredParametersAction', 'test_put_disables_required_parameters'); + + $parameters = $annotation->getParameters(); + $this->assertFalse($parameters['required_field']['required']); + } } diff --git a/Tests/Fixtures/Controller/TestController.php b/Tests/Fixtures/Controller/TestController.php index 82c15b5..222d312 100644 --- a/Tests/Fixtures/Controller/TestController.php +++ b/Tests/Fixtures/Controller/TestController.php @@ -65,6 +65,15 @@ class TestController { } + /** + * @ApiDoc( + * input="Nelmio\ApiDocBundle\Tests\Fixtures\Form\TestType" + * ) + */ + public function requiredParametersAction() + { + } + public function anotherAction() { } diff --git a/Tests/Fixtures/Form/TestType.php b/Tests/Fixtures/Form/TestType.php index 1628ee2..b54cb3b 100644 --- a/Tests/Fixtures/Form/TestType.php +++ b/Tests/Fixtures/Form/TestType.php @@ -27,6 +27,7 @@ class TestType extends AbstractType ->add('b') ->add($builder->create('c', 'checkbox')) ->add('d','text',array( 'data' => 'DefaultTest')) + ->add('required_field', 'text', array('required' => true)) ; } diff --git a/Tests/Fixtures/app/config/routing.yml b/Tests/Fixtures/app/config/routing.yml index f584f88..9f24fc0 100644 --- a/Tests/Fixtures/app/config/routing.yml +++ b/Tests/Fixtures/app/config/routing.yml @@ -219,3 +219,18 @@ test_route_24: defaults: { _controller: NelmioApiDocTestBundle:Test:zSecured } requirements: _method: POST + +test_required_parameters: + pattern: /api/other-resources/{id}.{_format} + defaults: { _controller: NelmioApiDocTestBundle:Resource:requiredParametersAction, _format: json } + requirements: + _method: POST + _format: json|xml|html + +test_put_disables_required_parameters: + pattern: /api/other-resources/{id}.{_format} + defaults: { _controller: NelmioApiDocTestBundle:Resource:requiredParametersAction, _format: json } + requirements: + _method: PUT + _format: json|xml|html + From b4a6825db78df4c74e9f3ec3f1419260476d20d5 Mon Sep 17 00:00:00 2001 From: lucasvanlierop Date: Tue, 30 Sep 2014 13:54:30 +0200 Subject: [PATCH 3/3] Fixed tests by adding separate form type --- Tests/Fixtures/Controller/TestController.php | 2 +- Tests/Fixtures/Form/RequiredType.php | 29 ++++++++++++++++++++ Tests/Fixtures/Form/TestType.php | 1 - 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 Tests/Fixtures/Form/RequiredType.php diff --git a/Tests/Fixtures/Controller/TestController.php b/Tests/Fixtures/Controller/TestController.php index 222d312..b71cadd 100644 --- a/Tests/Fixtures/Controller/TestController.php +++ b/Tests/Fixtures/Controller/TestController.php @@ -67,7 +67,7 @@ class TestController /** * @ApiDoc( - * input="Nelmio\ApiDocBundle\Tests\Fixtures\Form\TestType" + * input="Nelmio\ApiDocBundle\Tests\Fixtures\Form\RequiredType" * ) */ public function requiredParametersAction() diff --git a/Tests/Fixtures/Form/RequiredType.php b/Tests/Fixtures/Form/RequiredType.php new file mode 100644 index 0000000..c0e2ec5 --- /dev/null +++ b/Tests/Fixtures/Form/RequiredType.php @@ -0,0 +1,29 @@ + + */ +class RequiredType extends AbstractType +{ + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder->add('required_field', 'text', array('required' => true)); + } + + /** + * Returns the name of this type. + * + * @return string The name of this type + */ + public function getName() + { + return ''; + } +} diff --git a/Tests/Fixtures/Form/TestType.php b/Tests/Fixtures/Form/TestType.php index b54cb3b..1628ee2 100644 --- a/Tests/Fixtures/Form/TestType.php +++ b/Tests/Fixtures/Form/TestType.php @@ -27,7 +27,6 @@ class TestType extends AbstractType ->add('b') ->add($builder->create('c', 'checkbox')) ->add('d','text',array( 'data' => 'DefaultTest')) - ->add('required_field', 'text', array('required' => true)) ; }