Mark Routing\Route classes as @internal
This commit is contained in:
parent
c75168afae
commit
4eec56b582
|
|
@ -5,8 +5,12 @@ namespace WellRESTed\Routing\Route;
|
|||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use WellRESTed\Dispatching\DispatcherInterface;
|
||||
use WellRESTed\MiddlewareInterface;
|
||||
|
||||
class MethodMap
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class MethodMap implements MiddlewareInterface
|
||||
{
|
||||
/** @var DispatcherInterface */
|
||||
private $dispatcher;
|
||||
|
|
@ -21,11 +25,8 @@ class MethodMap
|
|||
$this->dispatcher = $dispatcher;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// MethodMapInterface
|
||||
|
||||
/**
|
||||
* Register a dispatchable (handler or middleware) with a method.
|
||||
* Register a dispatchable (e.g.m handler or middleware) with a method.
|
||||
*
|
||||
* $method may be:
|
||||
* - A single verb ("GET"),
|
||||
|
|
@ -41,7 +42,7 @@ class MethodMap
|
|||
* @param string $method
|
||||
* @param mixed $dispatchable
|
||||
*/
|
||||
public function register($method, $dispatchable): void
|
||||
public function register(string $method, $dispatchable): void
|
||||
{
|
||||
$methods = explode(',', $method);
|
||||
$methods = array_map('trim', $methods);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
namespace WellRESTed\Routing\Route;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class PrefixRoute extends Route
|
||||
{
|
||||
public function __construct(string $target, MethodMap $methodMap)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@ namespace WellRESTed\Routing\Route;
|
|||
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class RegexRoute extends Route
|
||||
{
|
||||
/** @var array */
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@ namespace WellRESTed\Routing\Route;
|
|||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
abstract class Route implements RouteInterface
|
||||
{
|
||||
/** @var string */
|
||||
|
|
@ -18,6 +21,11 @@ abstract class Route implements RouteInterface
|
|||
$this->methodMap = $methodMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Path, partial path, or pattern to match request paths against.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTarget(): string
|
||||
{
|
||||
return $this->target;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ namespace WellRESTed\Routing\Route;
|
|||
use WellRESTed\Dispatching\DispatcherInterface;
|
||||
|
||||
/**
|
||||
* Class for creating routes
|
||||
* @internal
|
||||
*/
|
||||
class RouteFactory implements RouteFactoryInterface
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
namespace WellRESTed\Routing\Route;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
interface RouteFactoryInterface
|
||||
{
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -4,19 +4,24 @@ namespace WellRESTed\Routing\Route;
|
|||
|
||||
use WellRESTed\MiddlewareInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
interface RouteInterface extends MiddlewareInterface
|
||||
{
|
||||
/** Matches when path is an exact match only */
|
||||
/** Matches when request path is an exact match to entire target */
|
||||
const TYPE_STATIC = 0;
|
||||
/** Matches when path has the expected beginning */
|
||||
/** Matches when request path is an exact match to start of target */
|
||||
const TYPE_PREFIX = 1;
|
||||
/** Matches by pattern. Use matchesRequestTarget to test for matches */
|
||||
/** Matches by request path by pattern and may extract matched varialbes */
|
||||
const TYPE_PATTERN = 2;
|
||||
|
||||
/**
|
||||
* Path, partial path, or pattern to match request paths against.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTarget();
|
||||
public function getTarget(): string;
|
||||
|
||||
/**
|
||||
* Return the RouteInterface::TYPE_ constants that identifies the type.
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
namespace WellRESTed\Routing\Route;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class StaticRoute extends Route
|
||||
{
|
||||
public function getType(): int
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
namespace WellRESTed\Routing\Route;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class TemplateRoute extends Route
|
||||
{
|
||||
/** @var array */
|
||||
|
|
|
|||
|
|
@ -1,11 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace WellRESTed\Test\Unit\Routing\Route;
|
||||
namespace WellRESTed\Routing\Route;
|
||||
|
||||
use WellRESTed\Dispatching\Dispatcher;
|
||||
use WellRESTed\Message\Response;
|
||||
use WellRESTed\Message\ServerRequest;
|
||||
use WellRESTed\Routing\Route\MethodMap;
|
||||
use WellRESTed\Test\Doubles\MiddlewareMock;
|
||||
use WellRESTed\Test\Doubles\NextMock;
|
||||
use WellRESTed\Test\TestCase;
|
||||
|
|
@ -27,14 +26,14 @@ class MethodMapTest extends TestCase
|
|||
$this->dispatcher = new Dispatcher();
|
||||
}
|
||||
|
||||
private function getMethodMap()
|
||||
private function getMethodMap(): MethodMap
|
||||
{
|
||||
return new MethodMap($this->dispatcher);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
public function testDispatchesMiddlewareWithMatchingMethod()
|
||||
public function testDispatchesMiddlewareWithMatchingMethod(): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('GET');
|
||||
|
||||
|
|
@ -45,7 +44,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertTrue($this->middleware->called);
|
||||
}
|
||||
|
||||
public function testTreatsMethodNamesCaseSensitively()
|
||||
public function testTreatsMethodNamesCaseSensitively(): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('get');
|
||||
|
||||
|
|
@ -60,7 +59,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertTrue($middlewareLower->called);
|
||||
}
|
||||
|
||||
public function testDispatchesWildcardMiddlewareWithNonMatchingMethod()
|
||||
public function testDispatchesWildcardMiddlewareWithNonMatchingMethod(): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('GET');
|
||||
|
||||
|
|
@ -71,7 +70,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertTrue($this->middleware->called);
|
||||
}
|
||||
|
||||
public function testDispatchesGetMiddlewareForHeadByDefault()
|
||||
public function testDispatchesGetMiddlewareForHeadByDefault(): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('HEAD');
|
||||
|
||||
|
|
@ -82,7 +81,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertTrue($this->middleware->called);
|
||||
}
|
||||
|
||||
public function testRegistersMiddlewareForMultipleMethods()
|
||||
public function testRegistersMiddlewareForMultipleMethods(): void
|
||||
{
|
||||
$map = $this->getMethodMap();
|
||||
$map->register('GET,POST', $this->middleware);
|
||||
|
|
@ -96,7 +95,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertEquals(2, $this->middleware->callCount);
|
||||
}
|
||||
|
||||
public function testSettingNullDeregistersMiddleware()
|
||||
public function testSettingNullUnregistersMiddleware(): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('POST');
|
||||
|
||||
|
|
@ -108,7 +107,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertEquals(405, $response->getStatusCode());
|
||||
}
|
||||
|
||||
public function testSetsStatusTo200ForOptions()
|
||||
public function testSetsStatusTo200ForOptions(): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('OPTIONS');
|
||||
|
||||
|
|
@ -119,7 +118,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertEquals(200, $response->getStatusCode());
|
||||
}
|
||||
|
||||
public function testStopsPropagatingAfterOptions()
|
||||
public function testStopsPropagatingAfterOptions(): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('OPTIONS');
|
||||
|
||||
|
|
@ -130,8 +129,12 @@ class MethodMapTest extends TestCase
|
|||
$this->assertFalse($this->next->called);
|
||||
}
|
||||
|
||||
/** @dataProvider allowedMethodProvider */
|
||||
public function testSetsAllowHeaderForOptions($methodsDeclared, $methodsAllowed)
|
||||
/**
|
||||
* @dataProvider allowedMethodProvider
|
||||
* @param string[] $methodsDeclared
|
||||
* @param string[] $methodsAllowed
|
||||
*/
|
||||
public function testSetsAllowHeaderForOptions(array $methodsDeclared, array $methodsAllowed): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('OPTIONS');
|
||||
|
||||
|
|
@ -144,8 +147,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertContainsEach($methodsAllowed, $response->getHeaderLine('Allow'));
|
||||
}
|
||||
|
||||
/** @dataProvider allowedMethodProvider */
|
||||
public function testSetsStatusTo405ForBadMethod()
|
||||
public function testSetsStatusTo405ForBadMethod(): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('POST');
|
||||
|
||||
|
|
@ -156,11 +158,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertEquals(405, $response->getStatusCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* @coversNothing
|
||||
* @dataProvider allowedMethodProvider
|
||||
*/
|
||||
public function testStopsPropagatingAfterBadMethod()
|
||||
public function testStopsPropagatingAfterBadMethod(): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('POST');
|
||||
|
||||
|
|
@ -170,8 +168,12 @@ class MethodMapTest extends TestCase
|
|||
$this->assertFalse($this->next->called);
|
||||
}
|
||||
|
||||
/** @dataProvider allowedMethodProvider */
|
||||
public function testSetsAllowHeaderForBadMethod($methodsDeclared, $methodsAllowed)
|
||||
/**
|
||||
* @dataProvider allowedMethodProvider
|
||||
* @param string[] $methodsDeclared
|
||||
* @param string[] $methodsAllowed
|
||||
*/
|
||||
public function testSetsAllowHeaderForBadMethod(array $methodsDeclared, array $methodsAllowed): void
|
||||
{
|
||||
$this->request = $this->request->withMethod('BAD');
|
||||
|
||||
|
|
@ -184,7 +186,7 @@ class MethodMapTest extends TestCase
|
|||
$this->assertContainsEach($methodsAllowed, $response->getHeaderLine('Allow'));
|
||||
}
|
||||
|
||||
public function allowedMethodProvider()
|
||||
public function allowedMethodProvider(): array
|
||||
{
|
||||
return [
|
||||
[['GET'], ['GET', 'HEAD', 'OPTIONS']],
|
||||
|
|
@ -195,7 +197,7 @@ class MethodMapTest extends TestCase
|
|||
];
|
||||
}
|
||||
|
||||
private function assertContainsEach($expectedList, $actual)
|
||||
private function assertContainsEach($expectedList, $actual): void
|
||||
{
|
||||
foreach ($expectedList as $expected) {
|
||||
if (strpos($actual, $expected) === false) {
|
||||
|
|
|
|||
|
|
@ -1,53 +1,50 @@
|
|||
<?php
|
||||
|
||||
namespace WellRESTed\Test\Unit\Routing\Route;
|
||||
namespace WellRESTed\Routing\Route;
|
||||
|
||||
use Prophecy\PhpUnit\ProphecyTrait;
|
||||
use WellRESTed\Routing\Route\MethodMap;
|
||||
use WellRESTed\Routing\Route\PrefixRoute;
|
||||
use WellRESTed\Routing\Route\RouteInterface;
|
||||
use WellRESTed\Test\TestCase;
|
||||
|
||||
class PrefixRouteTest extends TestCase
|
||||
{
|
||||
use ProphecyTrait;
|
||||
|
||||
public function testTrimsAsteriskFromEndOfTarget()
|
||||
public function testTrimsAsteriskFromEndOfTarget(): void
|
||||
{
|
||||
$methodMap = $this->prophesize(MethodMap::class);
|
||||
$route = new PrefixRoute('/cats/*', $methodMap->reveal());
|
||||
$this->assertEquals('/cats/', $route->getTarget());
|
||||
}
|
||||
|
||||
public function testReturnsPrefixType()
|
||||
public function testReturnsPrefixType(): void
|
||||
{
|
||||
$methodMap = $this->prophesize(MethodMap::class);
|
||||
$route = new PrefixRoute('/*', $methodMap->reveal());
|
||||
$this->assertSame(RouteInterface::TYPE_PREFIX, $route->getType());
|
||||
}
|
||||
|
||||
public function testReturnsEmptyArrayForPathVariables()
|
||||
public function testReturnsEmptyArrayForPathVariables(): void
|
||||
{
|
||||
$methodMap = $this->prophesize(MethodMap::class);
|
||||
$route = new PrefixRoute('/*', $methodMap->reveal());
|
||||
$this->assertSame([], $route->getPathVariables());
|
||||
}
|
||||
|
||||
public function testMatchesExactRequestTarget()
|
||||
public function testMatchesExactRequestTarget(): void
|
||||
{
|
||||
$methodMap = $this->prophesize(MethodMap::class);
|
||||
$route = new PrefixRoute('/*', $methodMap->reveal());
|
||||
$this->assertTrue($route->matchesRequestTarget('/'));
|
||||
}
|
||||
|
||||
public function testMatchesRequestTargetWithSamePrefix()
|
||||
public function testMatchesRequestTargetWithSamePrefix(): void
|
||||
{
|
||||
$methodMap = $this->prophesize(MethodMap::class);
|
||||
$route = new PrefixRoute('/*', $methodMap->reveal());
|
||||
$this->assertTrue($route->matchesRequestTarget('/cats/'));
|
||||
}
|
||||
|
||||
public function testDoesNotMatchNonmatchingRequestTarget()
|
||||
public function testDoesNotMatchNonMatchingRequestTarget(): void
|
||||
{
|
||||
$methodMap = $this->prophesize(MethodMap::class);
|
||||
$route = new PrefixRoute('/animals/cats/', $methodMap->reveal());
|
||||
|
|
|
|||
Loading…
Reference in New Issue