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
*
* @author PJ Dietz <pj@pjdietz.com>
* @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;
}
}

View File

@ -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;
}
}