Skip to content

Commit

Permalink
LinkGenerator: allow semicolon destination prefix
Browse files Browse the repository at this point in the history
  • Loading branch information
dakujem committed Mar 25, 2020
1 parent 22d5246 commit 82ad558
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/Application/LinkGenerator.php
Expand Up @@ -50,6 +50,13 @@ public function link(string $dest, array $params = []): string
}
[, $presenter, $action, $frag] = $m;

if ($presenter[0] === ':') { // absolute
$presenter = substr($presenter, 1);
if (!$presenter) {
throw new UI\InvalidLinkException("Missing presenter name in '$dest'.");
}
}

try {
$class = $this->presenterFactory ? $this->presenterFactory->getPresenterClass($presenter) : null;
} catch (InvalidPresenterException $e) {
Expand Down
20 changes: 20 additions & 0 deletions tests/Routers/LinkGenerator.phpt
Expand Up @@ -52,9 +52,13 @@ namespace {
test(function () use ($pf) {
$generator = new LinkGenerator(new Routers\SimpleRouter, new Http\UrlScript('http://nette.org/en/'), $pf);
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link('Homepage:default'));
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link(':Homepage:default'));
Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link('Module:My:default'));
Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link(':Module:My:default'));
Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link('Module:My:'));
Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link(':Module:My:'));
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link('Homepage:'));
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link(':Homepage:'));
Assert::same('http://nette.org/en/?a=10&action=default&presenter=Homepage', $generator->link('Homepage:', [10]));
Assert::same('http://nette.org/en/?id=20&b=10&action=detail&presenter=Homepage', $generator->link('Homepage:detail', [10, 'id' => 20]));
Assert::same('http://nette.org/en/?action=default&presenter=Homepage#frag:ment', $generator->link('Homepage:#frag:ment'));
Expand All @@ -68,6 +72,18 @@ namespace {
}, Nette\Application\UI\InvalidLinkException::class, "Invalid link destination 'default'.");


Assert::exception(function () use ($pf) {
$generator = new LinkGenerator(new Routers\Route('/', 'Homepage:'), new Http\UrlScript('http://nette.org/en/'), $pf);
$generator->link(':');
}, Nette\Application\UI\InvalidLinkException::class, 'Invalid link destination \':\'.');


Assert::exception(function () use ($pf) {
$generator = new LinkGenerator(new Routers\Route('/', 'Homepage:'), new Http\UrlScript('http://nette.org/en/'), $pf);
$generator->link('::');
}, Nette\Application\UI\InvalidLinkException::class, 'Missing presenter name in \'::\'.');


Assert::exception(function () use ($pf) {
$generator = new LinkGenerator(new Routers\Route('/', 'Product:'), new Http\UrlScript('http://nette.org/en/'), $pf);
$generator->link('Homepage:default', ['id' => 10]);
Expand All @@ -83,9 +99,13 @@ namespace {
test(function () {
$generator = new LinkGenerator(new Routers\SimpleRouter, new Http\UrlScript('http://nette.org/en/'));
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link('Homepage:default'));
Assert::same('http://nette.org/en/?action=default&presenter=Homepage', $generator->link(':Homepage:default'));
Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link('Module:My:default'));
Assert::same('http://nette.org/en/?action=default&presenter=Module%3AMy', $generator->link(':Module:My:default'));
Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link('Module:My:'));
Assert::same('http://nette.org/en/?presenter=Module%3AMy', $generator->link(':Module:My:'));
Assert::same('http://nette.org/en/?presenter=Homepage', $generator->link('Homepage:'));
Assert::same('http://nette.org/en/?presenter=Homepage', $generator->link(':Homepage:'));
Assert::same('http://nette.org/en/?0=10&presenter=Homepage', $generator->link('Homepage:', [10]));
Assert::same('http://nette.org/en/?0=10&id=20&action=detail&presenter=Homepage', $generator->link('Homepage:detail', [10, 'id' => 20]));
Assert::same('http://nette.org/en/?presenter=Homepage#frag:ment', $generator->link('Homepage:#frag:ment'));
Expand Down

0 comments on commit 82ad558

Please sign in to comment.