Update TemplateRoute tests

This commit is contained in:
PJ Dietz 2015-02-18 21:39:07 -05:00
parent 6859bd9707
commit c38659a310
2 changed files with 104 additions and 56 deletions

View File

@ -4,7 +4,7 @@
* pjdietz\WellRESTed\TemplateRoute * pjdietz\WellRESTed\TemplateRoute
* *
* @author PJ Dietz <pj@pjdietz.com> * @author PJ Dietz <pj@pjdietz.com>
* @copyright Copyright 2014 by PJ Dietz * @copyright Copyright 2015 by PJ Dietz
* @license MIT * @license MIT
*/ */
@ -35,18 +35,18 @@ class TemplateRoute extends RegexRoute
* Optionally provide patterns for the variables in the template. * Optionally provide patterns for the variables in the template.
* *
* @param string $template URI template the path must match * @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 string $defaultPattern Regular expression for variables
* @param array|null $variablePatterns Map of variable names and regular expression * @param array|null $variablePatterns Map of variable names and regular expression
*/ */
public function __construct( public function __construct(
$template, $template,
$targetClassName, $target,
$defaultPattern = self::RE_SLUG, $defaultPattern = self::RE_SLUG,
$variablePatterns = null $variablePatterns = null
) { ) {
$pattern = $this->buildPattern($template, $defaultPattern, $variablePatterns); $pattern = $this->buildPattern($template, $defaultPattern, $variablePatterns);
parent::__construct($pattern, $targetClassName); parent::__construct($pattern, $target);
} }
/** /**
@ -100,5 +100,4 @@ class TemplateRoute extends RegexRoute
return $pattern; return $pattern;
} }
} }

View File

@ -2,60 +2,119 @@
namespace pjdietz\WellRESTed\Test; namespace pjdietz\WellRESTed\Test;
use pjdietz\WellRESTed\Interfaces\HandlerInterface;
use pjdietz\WellRESTed\Interfaces\RequestInterface;
use pjdietz\WellRESTed\Response;
use pjdietz\WellRESTed\Routes\TemplateRoute; use pjdietz\WellRESTed\Routes\TemplateRoute;
use Prophecy\Argument;
/**
* @covers pjdietz\WellRESTed\Routes\TemplateRoute
*/
class TemplateRouteTest extends \PHPUnit_Framework_TestCase class TemplateRouteTest extends \PHPUnit_Framework_TestCase
{ {
private $handler;
private $request;
private $response;
/** /**
* @dataProvider matchingTemplateProvider * @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'); $this->request->getPath()->willReturn($path);
$mockRequest->expects($this->any()) $route = new TemplateRoute($template, $this->handler->reveal(), $default, $vars);
->method('getPath') $resp = $route->getResponse($this->request->reveal());
->will($this->returnValue($path)); $this->assertNotNull($resp);
}
$route = new TemplateRoute($template, __NAMESPACE__ . '\TemplateRouteTestMockHandler', $default, $vars); /**
$resp = $route->getResponse($mockRequest); * @dataProvider matchingTemplateProvider
$args = json_decode($resp->getBody(), true); */
$this->assertEquals($expected, $args[$testName]); 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() public function matchingTemplateProvider()
{ {
return [ return [
["/cat/{id}", TemplateRoute::RE_NUM, null, "/cat/12", "id", "12"], ["/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, [ "/cat/{catId}/{dogId}",
"catId" => TemplateRoute::RE_SLUG, TemplateRoute::RE_SLUG,
"dogId" => TemplateRoute::RE_SLUG], null,
"/cat/molly/bear", "dogId", "bear"], "/cat/molly/bear",
["/cat/{catId}/{dogId}", TemplateRoute::RE_NUM, (object) [ [
"catId" => TemplateRoute::RE_SLUG, "catId" => "molly",
"dogId" => TemplateRoute::RE_SLUG], "dogId" => "bear"
"/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/{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 * @dataProvider nonmatchingTemplateProvider
*/ */
public function testSkipNonmatchingTemplate($template, $default, $vars, $path) public function testSkipNonmatchingTemplate($template, $default, $vars, $path)
{ {
$mockRequest = $this->getMock('\pjdietz\WellRESTed\Interfaces\RequestInterface'); $this->request->getPath()->willReturn($path);
$mockRequest->expects($this->any()) $route = new TemplateRoute($template, $this->handler->reveal(), $default, $vars);
->method('getPath') $resp = $route->getResponse($this->request->reveal());
->will($this->returnValue($path));
$route = new TemplateRoute($template, "NoClass", $default, $vars);
$resp = $route->getResponse($mockRequest);
$this->assertNull($resp); $this->assertNull($resp);
} }
@ -64,25 +123,15 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase
return array( return array(
array("/cat/{id}", TemplateRoute::RE_NUM, null, "/cat/molly"), 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_ALPHA, null, "/cat/12/13"),
array("/cat/{catId}/{dogId}", TemplateRoute::RE_NUM, array( array(
"catId" => TemplateRoute::RE_ALPHA, "/cat/{catId}/{dogId}",
"dogId" => TemplateRoute::RE_ALPHA), TemplateRoute::RE_NUM,
"/cat/12/13") 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;
}
} }