From 2c1e10009402369225fe6aff62309c85e70f8724 Mon Sep 17 00:00:00 2001 From: William DURAND Date: Fri, 13 Apr 2012 14:42:28 +0200 Subject: [PATCH] Added more tests for the Extractor --- Extractor/ApiDocExtractor.php | 10 ++- Tests/Extractor/ApiDocExtratorTest.php | 66 ++++++++++++++++++++ Tests/Fixtures/Controller/TestController.php | 4 ++ Tests/Fixtures/app/config/routing.yml | 4 ++ 4 files changed, 82 insertions(+), 2 deletions(-) diff --git a/Extractor/ApiDocExtractor.php b/Extractor/ApiDocExtractor.php index 64dee26..3df058c 100644 --- a/Extractor/ApiDocExtractor.php +++ b/Extractor/ApiDocExtractor.php @@ -114,15 +114,21 @@ class ApiDocExtractor public function get($controller, $route) { if (!preg_match('#(.+)::([\w]+)#', $controller, $matches)) { - return; + return null; } - $method = new \ReflectionMethod($matches[1], $matches[2]); + try { + $method = new \ReflectionMethod($matches[1], $matches[2]); + } catch (\ReflectionException $e) { + return null; + } if ($annot = $this->reader->getMethodAnnotation($method, self::ANNOTATION_CLASS)) { if ($route = $this->router->getRouteCollection()->get($route)) { return array('annotation' => $annot, 'route' => $route); } } + + return null; } } diff --git a/Tests/Extractor/ApiDocExtratorTest.php b/Tests/Extractor/ApiDocExtratorTest.php index 2d3c101..359332e 100644 --- a/Tests/Extractor/ApiDocExtratorTest.php +++ b/Tests/Extractor/ApiDocExtratorTest.php @@ -21,7 +21,31 @@ class ApiDocExtractorTest extends WebTestCase $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); $data = $extractor->all(); + $this->assertTrue(is_array($data)); $this->assertCount(2, $data); + + foreach ($data as $d) { + $this->assertTrue(is_array($d)); + $this->assertArrayHasKey('annotation', $d); + $this->assertArrayHasKey('route', $d); + $this->assertArrayHasKey('resource', $d); + + $this->assertInstanceOf('Nelmio\ApiDocBundle\Annotation\ApiDoc', $d['annotation']); + $this->assertInstanceOf('Symfony\Component\Routing\Route', $d['route']); + $this->assertNotNull($d['resource']); + } + + $a1 = $data[0]['annotation']; + $this->assertTrue($a1->isResource()); + $this->assertEquals('index action', $a1->getDescription()); + $this->assertTrue(is_array($a1->getFilters())); + $this->assertNull($a1->getFormType()); + + $a2 = $data[1]['annotation']; + $this->assertFalse($a2->isResource()); + $this->assertEquals('create test', $a2->getDescription()); + $this->assertTrue(is_array($a2->getFilters())); + $this->assertEquals('Nelmio\ApiDocBundle\Tests\Fixtures\Form\TestType', $a2->getFormType()); } public function testGet() @@ -32,5 +56,47 @@ class ApiDocExtractorTest extends WebTestCase $this->assertTrue(isset($data['route'])); $this->assertTrue(isset($data['annotation'])); + + $a = $data['annotation']; + $this->assertTrue($a->isResource()); + $this->assertEquals('index action', $a->getDescription()); + $this->assertTrue(is_array($a->getFilters())); + $this->assertNull($a->getFormType()); + } + + public function testGetWithBadController() + { + $container = $this->getContainer(); + $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); + $data = $extractor->get('Undefined\Controller::indexAction', 'test_route_1'); + + $this->assertNull($data); + } + + public function testGetWithBadRoute() + { + $container = $this->getContainer(); + $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); + $data = $extractor->get('Nelmio\ApiDocBundle\Tests\Fixtures\Controller\TestController::indexAction', 'invalid_route'); + + $this->assertNull($data); + } + + public function testGetWithInvalidPattern() + { + $container = $this->getContainer(); + $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); + $data = $extractor->get('Nelmio\ApiDocBundle\Tests\Fixtures\Controller\TestController', 'test_route_1'); + + $this->assertNull($data); + } + + public function testGetWithMethodWithoutApiDocAnnotation() + { + $container = $this->getContainer(); + $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); + $data = $extractor->get('Nelmio\ApiDocBundle\Tests\Fixtures\Controller\TestController::anotherAction', 'test_route_3'); + + $this->assertNull($data); } } diff --git a/Tests/Fixtures/Controller/TestController.php b/Tests/Fixtures/Controller/TestController.php index ee63543..1210867 100644 --- a/Tests/Fixtures/Controller/TestController.php +++ b/Tests/Fixtures/Controller/TestController.php @@ -38,4 +38,8 @@ class TestController public function postTestAction() { } + + public function anotherAction() + { + } } diff --git a/Tests/Fixtures/app/config/routing.yml b/Tests/Fixtures/app/config/routing.yml index 6800e95..bb73099 100644 --- a/Tests/Fixtures/app/config/routing.yml +++ b/Tests/Fixtures/app/config/routing.yml @@ -10,6 +10,10 @@ test_route_2: requirements: _method: POST +test_route_3: + pattern: /another + defaults: { _controller: NelmioApiDocTestBundle:Test:another } + NelmioApiDocBundle: resource: "@NelmioApiDocBundle/Resources/config/routing.yml" prefix: /