Revise RegexRoute

This commit is contained in:
PJ Dietz 2015-05-07 23:56:47 -04:00
parent cfcc3b9690
commit 8f4165cdb6
2 changed files with 49 additions and 24 deletions

View File

@ -2,30 +2,40 @@
namespace WellRESTed\Routing\Route; namespace WellRESTed\Routing\Route;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class RegexRoute extends Route class RegexRoute extends Route
{ {
private $pattern; private $captures;
public function __construct($pattern, $middleware) public function getType()
{ {
parent::__construct($middleware); return RouteInterface::TYPE_PATTERN;
$this->pattern = $pattern;
} }
/** /**
* @param string $requestTarget * @param string $requestTarget
* @param array $captures
* @return bool * @return bool
* @throws \RuntimeException * @throws \RuntimeException
*/ */
public function matchesRequestTarget($requestTarget, &$captures = null) public function matchesRequestTarget($requestTarget)
{ {
$matched = @preg_match($this->pattern, $requestTarget, $captures); $matched = @preg_match($this->getTarget(), $requestTarget, $captures);
if ($matched) { if ($matched) {
$this->captures = $captures;
return true; return true;
} elseif ($matched === false) { } elseif ($matched === false) {
throw new \RuntimeException("Invalid regular expression: " . $this->pattern); throw new \RuntimeException("Invalid regular expression: " . $this->getTarget());
} }
return false; return false;
} }
public function dispatch(ServerRequestInterface $request, ResponseInterface &$response)
{
if ($this->captures) {
$request = $request->withAttribute("path", $this->captures);
}
parent::dispatch($request, $response);
}
} }

View File

@ -4,41 +4,56 @@ namespace WellRESTed\Test\Unit\Routing\Route;
use Prophecy\Argument; use Prophecy\Argument;
use WellRESTed\Routing\Route\RegexRoute; use WellRESTed\Routing\Route\RegexRoute;
use WellRESTed\Routing\Route\RouteInterface;
/** /**
* @covers WellRESTed\Routing\Route\RegexRoute * @coversDefaultClass WellRESTed\Routing\Route\RegexRoute
* @uses WellRESTed\Routing\Route\RegexRoute
* @uses WellRESTed\Routing\Route\Route * @uses WellRESTed\Routing\Route\Route
*/ */
class RegexRouteTest extends \PHPUnit_Framework_TestCase class RegexRouteTest extends \PHPUnit_Framework_TestCase
{ {
private $request; private $methodMap;
private $response;
private $middleware;
public function setUp() public function setUp()
{ {
$this->request = $this->prophesize("\\Psr\\Http\\Message\\ServerRequestInterface"); $this->methodMap = $this->prophesize('WellRESTed\Routing\MethodMapInterface');
$this->response = $this->prophesize("\\Psr\\Http\\Message\\ResponseInterface");
$this->middleware = $this->prophesize("\\WellRESTed\\Routing\\MiddlewareInterface");
} }
/** /**
* @covers ::getType
*/
public function testReturnsPatternType()
{
$route = new RegexRoute("/", $this->methodMap->reveal());
$this->assertSame(RouteInterface::TYPE_PATTERN, $route->getType());
}
/**
* @covers ::matchesRequestTarget
* @dataProvider matchingRouteProvider * @dataProvider matchingRouteProvider
*/ */
public function testMatchesPattern($pattern, $path) public function testMatchesTarget($pattern, $path)
{ {
$route = new RegexRoute($pattern, $this->middleware->reveal()); $route = new RegexRoute($pattern, $this->methodMap->reveal());
$this->assertTrue($route->matchesRequestTarget($path)); $this->assertTrue($route->matchesRequestTarget($path));
} }
/** /**
* @dataProvider matchingRouteProvider * @dataProvider matchingRouteProvider
*/ */
public function testExtractsCaptures($pattern, $path, $expectedCaptures) public function testProvidesCapturesAsRequestAttributes($pattern, $path, $expectedCaptures)
{ {
$route = new RegexRoute($pattern, $this->middleware->reveal()); $request = $this->prophesize('Psr\Http\Message\ServerRequestInterface');
$route->matchesRequestTarget($path, $captures); $request->withAttribute(Argument::cetera())->willReturn($request->reveal());
$this->assertEquals($expectedCaptures, $captures); $response = $this->prophesize('Psr\Http\Message\ResponseInterface');
$responseReveal = $response->reveal();
$route = new RegexRoute($pattern, $this->methodMap->reveal());
$route->matchesRequestTarget($path);
$route->dispatch($request->reveal(), $responseReveal);
$request->withAttribute("path", $expectedCaptures)->shouldHaveBeenCalled();
} }
public function matchingRouteProvider() public function matchingRouteProvider()
@ -61,9 +76,9 @@ class RegexRouteTest extends \PHPUnit_Framework_TestCase
/** /**
* @dataProvider mismatchingRouteProvider * @dataProvider mismatchingRouteProvider
*/ */
public function testFailsToMatchMismatchingPattern($pattern, $path) public function testDoesNotMatchNonmatchingTarget($pattern, $path)
{ {
$route = new RegexRoute($pattern, $this->middleware->reveal()); $route = new RegexRoute($pattern, $this->methodMap->reveal());
$this->assertFalse($route->matchesRequestTarget($path)); $this->assertFalse($route->matchesRequestTarget($path));
} }
@ -82,7 +97,7 @@ class RegexRouteTest extends \PHPUnit_Framework_TestCase
*/ */
public function testThrowsExceptionOnInvalidPattern($pattern) public function testThrowsExceptionOnInvalidPattern($pattern)
{ {
$route = new RegexRoute($pattern, $this->middleware->reveal()); $route = new RegexRoute($pattern, $this->methodMap->reveal());
$route->matchesRequestTarget("/"); $route->matchesRequestTarget("/");
} }