diff --git a/src/pjdietz/WellRESTed/Routes/TemplateRoute.php b/src/pjdietz/WellRESTed/Routes/TemplateRoute.php index 69ae59e..666465a 100644 --- a/src/pjdietz/WellRESTed/Routes/TemplateRoute.php +++ b/src/pjdietz/WellRESTed/Routes/TemplateRoute.php @@ -4,7 +4,7 @@ * pjdietz\WellRESTed\TemplateRoute * * @author PJ Dietz - * @copyright Copyright 2014 by PJ Dietz + * @copyright Copyright 2015 by PJ Dietz * @license MIT */ @@ -35,18 +35,18 @@ class TemplateRoute extends RegexRoute * Optionally provide patterns for the variables in the template. * * @param string $template URI template the path must match - * @param string $targetClassName Fully qualified name to an autoloadable handler class + * @param string $target Fully qualified name to an autoloadable handler class * @param string $defaultPattern Regular expression for variables * @param array|null $variablePatterns Map of variable names and regular expression */ public function __construct( $template, - $targetClassName, + $target, $defaultPattern = self::RE_SLUG, $variablePatterns = null ) { $pattern = $this->buildPattern($template, $defaultPattern, $variablePatterns); - parent::__construct($pattern, $targetClassName); + parent::__construct($pattern, $target); } /** @@ -100,5 +100,4 @@ class TemplateRoute extends RegexRoute return $pattern; } - } diff --git a/test/Routes/TemplateRouteTest.php b/test/Routes/TemplateRouteTest.php index c89a036..988ddb2 100644 --- a/test/Routes/TemplateRouteTest.php +++ b/test/Routes/TemplateRouteTest.php @@ -2,60 +2,119 @@ namespace pjdietz\WellRESTed\Test; -use pjdietz\WellRESTed\Interfaces\HandlerInterface; -use pjdietz\WellRESTed\Interfaces\RequestInterface; -use pjdietz\WellRESTed\Response; use pjdietz\WellRESTed\Routes\TemplateRoute; +use Prophecy\Argument; +/** + * @covers pjdietz\WellRESTed\Routes\TemplateRoute + */ class TemplateRouteTest extends \PHPUnit_Framework_TestCase { + private $handler; + private $request; + private $response; + /** * @dataProvider matchingTemplateProvider */ - public function testMatchTemplate($template, $default, $vars, $path, $testName, $expected) + public function testMatchesTemplate($template, $default, $vars, $path) { - $mockRequest = $this->getMock('\pjdietz\WellRESTed\Interfaces\RequestInterface'); - $mockRequest->expects($this->any()) - ->method('getPath') - ->will($this->returnValue($path)); + $this->request->getPath()->willReturn($path); + $route = new TemplateRoute($template, $this->handler->reveal(), $default, $vars); + $resp = $route->getResponse($this->request->reveal()); + $this->assertNotNull($resp); + } - $route = new TemplateRoute($template, __NAMESPACE__ . '\TemplateRouteTestMockHandler', $default, $vars); - $resp = $route->getResponse($mockRequest); - $args = json_decode($resp->getBody(), true); - $this->assertEquals($expected, $args[$testName]); + /** + * @dataProvider matchingTemplateProvider + */ + public function testExtractsCaptures($template, $default, $vars, $path, $expectedCaptures) + { + $this->request->getPath()->willReturn($path); + $route = new TemplateRoute($template, $this->handler->reveal(), $default, $vars); + $route->getResponse($this->request->reveal()); + $this->handler->getResponse( + Argument::any(), + Argument::that( + function ($args) use ($expectedCaptures) { + return count(array_diff_assoc($expectedCaptures, $args)) === 0; + } + ) + )->shouldHaveBeenCalled(); } public function matchingTemplateProvider() { return [ - ["/cat/{id}", TemplateRoute::RE_NUM, null, "/cat/12", "id", "12"], - ["/cat/{catId}/{dogId}", TemplateRoute::RE_SLUG, null, "/cat/molly/bear", "dogId", "bear"], - ["/cat/{catId}/{dogId}", TemplateRoute::RE_NUM, [ - "catId" => TemplateRoute::RE_SLUG, - "dogId" => TemplateRoute::RE_SLUG], - "/cat/molly/bear", "dogId", "bear"], - ["/cat/{catId}/{dogId}", TemplateRoute::RE_NUM, (object) [ - "catId" => TemplateRoute::RE_SLUG, - "dogId" => TemplateRoute::RE_SLUG], - "/cat/molly/bear", "dogId", "bear"], - ["/cat/{id}/*", null, null, "/cat/12/molly", "id", "12"], - ["/cat/{id}-{width}x{height}.jpg", TemplateRoute::RE_NUM, null, "/cat/17-100x100.jpg", "id", "17"], - ["/cat/{path}", ".*", null, "/cat/this/section/has/slashes", "path", "this/section/has/slashes"] + ["/cat/{id}", TemplateRoute::RE_NUM, null, "/cat/12", ["id" => "12"]], + [ + "/cat/{catId}/{dogId}", + TemplateRoute::RE_SLUG, + null, + "/cat/molly/bear", + [ + "catId" => "molly", + "dogId" => "bear" + ] + ], + [ + "/cat/{catId}/{dogId}", + TemplateRoute::RE_NUM, + [ + "catId" => TemplateRoute::RE_SLUG, + "dogId" => TemplateRoute::RE_SLUG + ], + "/cat/molly/bear", + [ + "catId" => "molly", + "dogId" => "bear" + ] + ], + [ + "/cat/{catId}/{dogId}", + TemplateRoute::RE_NUM, + (object) [ + "catId" => TemplateRoute::RE_SLUG, + "dogId" => TemplateRoute::RE_SLUG + ], + "/cat/molly/bear", + [ + "catId" => "molly", + "dogId" => "bear" + ] + ], + ["/cat/{id}/*", null, null, "/cat/12/molly", ["id" => "12"]], + [ + "/cat/{id}-{width}x{height}.jpg", + TemplateRoute::RE_NUM, + null, + "/cat/17-200x100.jpg", + [ + "id" => "17", + "width" => "200", + "height" => "100" + ] + ], + ["/cat/{path}", ".*", null, "/cat/this/section/has/slashes", ["path" => "this/section/has/slashes"]] ]; } + public function setUp() + { + $this->request = $this->prophesize("\\pjdietz\\WellRESTed\\Interfaces\\RequestInterface"); + $this->response = $this->prophesize("\\pjdietz\\WellRESTed\\Interfaces\\ResponseInterface"); + $this->handler = $this->prophesize("\\pjdietz\\WellRESTed\\Interfaces\\HandlerInterface"); + $this->handler->getResponse(Argument::cetera())->willReturn($this->response->reveal()); + } + /** * @dataProvider nonmatchingTemplateProvider */ public function testSkipNonmatchingTemplate($template, $default, $vars, $path) { - $mockRequest = $this->getMock('\pjdietz\WellRESTed\Interfaces\RequestInterface'); - $mockRequest->expects($this->any()) - ->method('getPath') - ->will($this->returnValue($path)); - - $route = new TemplateRoute($template, "NoClass", $default, $vars); - $resp = $route->getResponse($mockRequest); + $this->request->getPath()->willReturn($path); + $route = new TemplateRoute($template, $this->handler->reveal(), $default, $vars); + $resp = $route->getResponse($this->request->reveal()); $this->assertNull($resp); } @@ -64,25 +123,15 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase return array( array("/cat/{id}", TemplateRoute::RE_NUM, null, "/cat/molly"), array("/cat/{catId}/{dogId}", TemplateRoute::RE_ALPHA, null, "/cat/12/13"), - array("/cat/{catId}/{dogId}", TemplateRoute::RE_NUM, array( - "catId" => TemplateRoute::RE_ALPHA, - "dogId" => TemplateRoute::RE_ALPHA), - "/cat/12/13") + array( + "/cat/{catId}/{dogId}", + TemplateRoute::RE_NUM, + array( + "catId" => TemplateRoute::RE_ALPHA, + "dogId" => TemplateRoute::RE_ALPHA + ), + "/cat/12/13" + ) ); } - -} - -/** - * Mini Handler class that allways returns a 200 status code Response. - */ -class TemplateRouteTestMockHandler implements HandlerInterface -{ - public function getResponse(RequestInterface $request, array $args = null) - { - $resp = new Response(); - $resp->setStatusCode(200); - $resp->setBody(json_encode($args)); - return $resp; - } }