namespace Symfony\Component\Routing\Tests\Matcher;
-use PHPUnit\Framework\TestCase;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RequestContext;
-class RedirectableUrlMatcherTest extends TestCase
+class RedirectableUrlMatcherTest extends UrlMatcherTest
{
- public function testRedirectWhenNoSlash()
+ public function testMissingTrailingSlash()
{
$coll = new RouteCollection();
$coll->add('foo', new Route('/foo/'));
- $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext()));
- $matcher->expects($this->once())->method('redirect');
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher->expects($this->once())->method('redirect')->will($this->returnValue(array()));
$matcher->match('/foo');
}
$context = new RequestContext();
$context->setMethod('POST');
- $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, $context));
+ $matcher = $this->getUrlMatcher($coll, $context);
$matcher->match('/foo');
}
$coll = new RouteCollection();
$coll->add('foo', new Route('/foo', array(), array(), array(), '', array('FTP', 'HTTPS')));
- $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext()));
+ $matcher = $this->getUrlMatcher($coll);
$matcher
->expects($this->once())
->method('redirect')
$matcher->match('/foo');
}
- public function testNoSchemaRedirectIfOnOfMultipleSchemesMatches()
+ public function testNoSchemaRedirectIfOneOfMultipleSchemesMatches()
{
$coll = new RouteCollection();
$coll->add('foo', new Route('/foo', array(), array(), array(), '', array('https', 'http')));
- $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext()));
+ $matcher = $this->getUrlMatcher($coll);
$matcher
->expects($this->never())
+ ->method('redirect');
+ $matcher->match('/foo');
+ }
+
+ public function testSchemeRedirectWithParams()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/{bar}', array(), array(), array(), '', array('https')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher
+ ->expects($this->once())
->method('redirect')
+ ->with('/foo/baz', 'foo', 'https')
+ ->will($this->returnValue(array('redirect' => 'value')))
;
- $matcher->match('/foo');
+ $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz', 'redirect' => 'value'), $matcher->match('/foo/baz'));
+ }
+
+ public function testSlashRedirectWithParams()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/{bar}/'));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher
+ ->expects($this->once())
+ ->method('redirect')
+ ->with('/foo/baz/', 'foo', null)
+ ->will($this->returnValue(array('redirect' => 'value')))
+ ;
+ $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz', 'redirect' => 'value'), $matcher->match('/foo/baz'));
+ }
+
+ public function testRedirectPreservesUrlEncoding()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo:bar/'));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher->expects($this->once())->method('redirect')->with('/foo%3Abar/')->willReturn(array());
+ $matcher->match('/foo%3Abar');
+ }
+
+ public function testSchemeRequirement()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo', array(), array(), array(), '', array('https')));
+ $matcher = $this->getUrlMatcher($coll, new RequestContext());
+ $matcher->expects($this->once())->method('redirect')->with('/foo', 'foo', 'https')->willReturn(array());
+ $this->assertSame(array('_route' => 'foo'), $matcher->match('/foo'));
+ }
+
+ protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
+ {
+ return $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($routes, $context ?: new RequestContext()));
}
}