use PHPUnit\Framework\TestCase;
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
+use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface;
+use Symfony\Component\Routing\Matcher\UrlMatcher;
+use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
class PhpMatcherDumperTest extends TestCase
{
+ /**
+ * @var string
+ */
+ private $matcherClass;
+
+ /**
+ * @var string
+ */
+ private $dumpPath;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->matcherClass = uniqid('ProjectUrlMatcher');
+ $this->dumpPath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'php_matcher.'.$this->matcherClass.'.php';
+ }
+
+ protected function tearDown()
+ {
+ parent::tearDown();
+
+ @unlink($this->dumpPath);
+ }
+
/**
* @expectedException \LogicException
*/
$dumper->dump();
}
+ public function testRedirectPreservesUrlEncoding()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo:bar/'));
+
+ $class = $this->generateDumpedMatcher($collection, true);
+
+ $matcher = $this->getMockBuilder($class)
+ ->setMethods(array('redirect'))
+ ->setConstructorArgs(array(new RequestContext()))
+ ->getMock();
+
+ $matcher->expects($this->once())->method('redirect')->with('/foo%3Abar/', 'foo')->willReturn(array());
+
+ $matcher->match('/foo%3Abar');
+ }
+
/**
* @dataProvider getRouteCollections
*/
$route->setCondition('context.getMethod() == "GET"');
$rootprefixCollection->add('with-condition', $route);
+ /* test case 4 */
+ $headMatchCasesCollection = new RouteCollection();
+ $headMatchCasesCollection->add('just_head', new Route(
+ '/just_head',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('HEAD')
+ ));
+ $headMatchCasesCollection->add('head_and_get', new Route(
+ '/head_and_get',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('HEAD', 'GET')
+ ));
+ $headMatchCasesCollection->add('get_and_head', new Route(
+ '/get_and_head',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('GET', 'HEAD')
+ ));
+ $headMatchCasesCollection->add('post_and_head', new Route(
+ '/post_and_head',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('POST', 'HEAD')
+ ));
+ $headMatchCasesCollection->add('put_and_post', new Route(
+ '/put_and_post',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('PUT', 'POST')
+ ));
+ $headMatchCasesCollection->add('put_and_get_and_head', new Route(
+ '/put_and_post',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('PUT', 'GET', 'HEAD')
+ ));
+
+ /* test case 5 */
+ $groupOptimisedCollection = new RouteCollection();
+ $groupOptimisedCollection->add('a_first', new Route('/a/11'));
+ $groupOptimisedCollection->add('a_second', new Route('/a/22'));
+ $groupOptimisedCollection->add('a_third', new Route('/a/333'));
+ $groupOptimisedCollection->add('a_wildcard', new Route('/{param}'));
+ $groupOptimisedCollection->add('a_fourth', new Route('/a/44/'));
+ $groupOptimisedCollection->add('a_fifth', new Route('/a/55/'));
+ $groupOptimisedCollection->add('a_sixth', new Route('/a/66/'));
+ $groupOptimisedCollection->add('nested_wildcard', new Route('/nested/{param}'));
+ $groupOptimisedCollection->add('nested_a', new Route('/nested/group/a/'));
+ $groupOptimisedCollection->add('nested_b', new Route('/nested/group/b/'));
+ $groupOptimisedCollection->add('nested_c', new Route('/nested/group/c/'));
+
+ $groupOptimisedCollection->add('slashed_a', new Route('/slashed/group/'));
+ $groupOptimisedCollection->add('slashed_b', new Route('/slashed/group/b/'));
+ $groupOptimisedCollection->add('slashed_c', new Route('/slashed/group/c/'));
+
+ $trailingSlashCollection = new RouteCollection();
+ $trailingSlashCollection->add('simple_trailing_slash_no_methods', new Route('/trailing/simple/no-methods/', array(), array(), array(), '', array(), array()));
+ $trailingSlashCollection->add('simple_trailing_slash_GET_method', new Route('/trailing/simple/get-method/', array(), array(), array(), '', array(), array('GET')));
+ $trailingSlashCollection->add('simple_trailing_slash_HEAD_method', new Route('/trailing/simple/head-method/', array(), array(), array(), '', array(), array('HEAD')));
+ $trailingSlashCollection->add('simple_trailing_slash_POST_method', new Route('/trailing/simple/post-method/', array(), array(), array(), '', array(), array('POST')));
+ $trailingSlashCollection->add('regex_trailing_slash_no_methods', new Route('/trailing/regex/no-methods/{param}/', array(), array(), array(), '', array(), array()));
+ $trailingSlashCollection->add('regex_trailing_slash_GET_method', new Route('/trailing/regex/get-method/{param}/', array(), array(), array(), '', array(), array('GET')));
+ $trailingSlashCollection->add('regex_trailing_slash_HEAD_method', new Route('/trailing/regex/head-method/{param}/', array(), array(), array(), '', array(), array('HEAD')));
+ $trailingSlashCollection->add('regex_trailing_slash_POST_method', new Route('/trailing/regex/post-method/{param}/', array(), array(), array(), '', array(), array('POST')));
+
+ $trailingSlashCollection->add('simple_not_trailing_slash_no_methods', new Route('/not-trailing/simple/no-methods', array(), array(), array(), '', array(), array()));
+ $trailingSlashCollection->add('simple_not_trailing_slash_GET_method', new Route('/not-trailing/simple/get-method', array(), array(), array(), '', array(), array('GET')));
+ $trailingSlashCollection->add('simple_not_trailing_slash_HEAD_method', new Route('/not-trailing/simple/head-method', array(), array(), array(), '', array(), array('HEAD')));
+ $trailingSlashCollection->add('simple_not_trailing_slash_POST_method', new Route('/not-trailing/simple/post-method', array(), array(), array(), '', array(), array('POST')));
+ $trailingSlashCollection->add('regex_not_trailing_slash_no_methods', new Route('/not-trailing/regex/no-methods/{param}', array(), array(), array(), '', array(), array()));
+ $trailingSlashCollection->add('regex_not_trailing_slash_GET_method', new Route('/not-trailing/regex/get-method/{param}', array(), array(), array(), '', array(), array('GET')));
+ $trailingSlashCollection->add('regex_not_trailing_slash_HEAD_method', new Route('/not-trailing/regex/head-method/{param}', array(), array(), array(), '', array(), array('HEAD')));
+ $trailingSlashCollection->add('regex_not_trailing_slash_POST_method', new Route('/not-trailing/regex/post-method/{param}', array(), array(), array(), '', array(), array('POST')));
+
return array(
+ array(new RouteCollection(), 'url_matcher0.php', array()),
array($collection, 'url_matcher1.php', array()),
array($redirectCollection, 'url_matcher2.php', array('base_class' => 'Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher')),
array($rootprefixCollection, 'url_matcher3.php', array()),
+ array($headMatchCasesCollection, 'url_matcher4.php', array()),
+ array($groupOptimisedCollection, 'url_matcher5.php', array('base_class' => 'Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher')),
+ array($trailingSlashCollection, 'url_matcher6.php', array()),
+ array($trailingSlashCollection, 'url_matcher7.php', array('base_class' => 'Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher')),
);
}
+
+ /**
+ * @param $dumper
+ */
+ private function generateDumpedMatcher(RouteCollection $collection, $redirectableStub = false)
+ {
+ $options = array('class' => $this->matcherClass);
+
+ if ($redirectableStub) {
+ $options['base_class'] = '\Symfony\Component\Routing\Tests\Matcher\Dumper\RedirectableUrlMatcherStub';
+ }
+
+ $dumper = new PhpMatcherDumper($collection);
+ $code = $dumper->dump($options);
+
+ file_put_contents($this->dumpPath, $code);
+ include $this->dumpPath;
+
+ return $this->matcherClass;
+ }
+}
+
+abstract class RedirectableUrlMatcherStub extends UrlMatcher implements RedirectableUrlMatcherInterface
+{
+ public function redirect($path, $route, $scheme = null)
+ {
+ }
}