From a19299367160030937ea7f93505c6eb0001c4770 Mon Sep 17 00:00:00 2001 From: OhMyFelix Date: Fri, 13 Feb 2026 12:49:06 +0000 Subject: [PATCH 1/3] CI: fix default branch pipeline --- .github/workflows/tests.yml | 8 +------- ruleset.xml | 2 +- src/LinkGenerator/NetteLinkGenerator.php | 5 ++++- .../LinkGenerator/NetteLinkGeneratorTest.php | 18 ++++++++++++++++++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a574bd1..cd2f698 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,15 +23,9 @@ jobs: with: php: "8.2" - test81: - name: "Nette Tester" - uses: contributte/.github/.github/workflows/nette-tester.yml@master - with: - php: "8.1" - testlower: name: "Nette Tester" uses: contributte/.github/.github/workflows/nette-tester.yml@master with: - php: "8.1" + php: "8.2" composer: "composer update --no-interaction --no-progress --prefer-dist --prefer-stable --prefer-lowest" diff --git a/ruleset.xml b/ruleset.xml index bfa454d..4f7e768 100644 --- a/ruleset.xml +++ b/ruleset.xml @@ -1,7 +1,7 @@ - + diff --git a/src/LinkGenerator/NetteLinkGenerator.php b/src/LinkGenerator/NetteLinkGenerator.php index fe83b11..0d0717a 100644 --- a/src/LinkGenerator/NetteLinkGenerator.php +++ b/src/LinkGenerator/NetteLinkGenerator.php @@ -23,7 +23,10 @@ public function link(IMenuItem $item): string { $action = $item->getActionTarget(); if ($action !== null) { - return $this->linkGenerator->link($action, $item->getActionParameters()); + $generatedLink = $this->linkGenerator->link($action, $item->getActionParameters()); + if ($generatedLink !== null) { + return $generatedLink; + } } $link = $item->getLink(); diff --git a/tests/Cases/LinkGenerator/NetteLinkGeneratorTest.php b/tests/Cases/LinkGenerator/NetteLinkGeneratorTest.php index 00ae806..36dce80 100644 --- a/tests/Cases/LinkGenerator/NetteLinkGeneratorTest.php +++ b/tests/Cases/LinkGenerator/NetteLinkGeneratorTest.php @@ -71,6 +71,24 @@ public function testLinkLink(): void Assert::same('/', $linkGenerator->link($item)); } + public function testLinkActionWithNullGeneratedLinkFallsBackToItemLink(): void + { + $request = $this->createMockHttpRequest(); + $netteLinkGenerator = $this->createMockNetteLinkGenerator(function (MockInterface $netteLinkGenerator): void { + $netteLinkGenerator->shouldReceive('link')->andReturn(null); + }); + + $item = $this->createMockMenuItem(function (MockInterface $item): void { + $item->shouldReceive('getActionTarget')->andReturn('Home:default'); + $item->shouldReceive('getActionParameters')->andReturn([]); + $item->shouldReceive('getLink')->andReturn('/fallback'); + }); + + $linkGenerator = new NetteLinkGenerator($request, $netteLinkGenerator); + + Assert::same('/fallback', $linkGenerator->link($item)); + } + public function testLinkEmpty(): void { $request = $this->createMockHttpRequest(); From a0e997dee575626fe47f01d9eaa99884404d40ce Mon Sep 17 00:00:00 2001 From: OhMyFelix Date: Fri, 13 Feb 2026 14:25:40 +0000 Subject: [PATCH 2/3] LinkGenerator: fallback to item link on invalid action link --- src/LinkGenerator/NetteLinkGenerator.php | 7 ++++--- tests/Cases/LinkGenerator/NetteLinkGeneratorTest.php | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/LinkGenerator/NetteLinkGenerator.php b/src/LinkGenerator/NetteLinkGenerator.php index 0d0717a..8b437b9 100644 --- a/src/LinkGenerator/NetteLinkGenerator.php +++ b/src/LinkGenerator/NetteLinkGenerator.php @@ -4,6 +4,7 @@ use Contributte\MenuControl\IMenuItem; use Nette\Application\LinkGenerator; +use Nette\Application\UI\InvalidLinkException; use Nette\Http\IRequest; final class NetteLinkGenerator implements ILinkGenerator @@ -23,9 +24,9 @@ public function link(IMenuItem $item): string { $action = $item->getActionTarget(); if ($action !== null) { - $generatedLink = $this->linkGenerator->link($action, $item->getActionParameters()); - if ($generatedLink !== null) { - return $generatedLink; + try { + return $this->linkGenerator->link($action, $item->getActionParameters()); + } catch (InvalidLinkException) { } } diff --git a/tests/Cases/LinkGenerator/NetteLinkGeneratorTest.php b/tests/Cases/LinkGenerator/NetteLinkGeneratorTest.php index 36dce80..f778d7b 100644 --- a/tests/Cases/LinkGenerator/NetteLinkGeneratorTest.php +++ b/tests/Cases/LinkGenerator/NetteLinkGeneratorTest.php @@ -4,6 +4,7 @@ use Contributte\MenuControl\LinkGenerator\NetteLinkGenerator; use Mockery\MockInterface; +use Nette\Application\UI\InvalidLinkException; use Tester\Assert; use Tests\Toolkit\AbstractTestCase; @@ -71,11 +72,11 @@ public function testLinkLink(): void Assert::same('/', $linkGenerator->link($item)); } - public function testLinkActionWithNullGeneratedLinkFallsBackToItemLink(): void + public function testLinkActionWithInvalidGeneratedLinkFallsBackToItemLink(): void { $request = $this->createMockHttpRequest(); $netteLinkGenerator = $this->createMockNetteLinkGenerator(function (MockInterface $netteLinkGenerator): void { - $netteLinkGenerator->shouldReceive('link')->andReturn(null); + $netteLinkGenerator->shouldReceive('link')->andThrow(new InvalidLinkException()); }); $item = $this->createMockMenuItem(function (MockInterface $item): void { From 66e0c1d5ff7c3d407401c316d599e6c7a7826ab4 Mon Sep 17 00:00:00 2001 From: OhMyFelix Date: Fri, 13 Feb 2026 14:29:45 +0000 Subject: [PATCH 3/3] LinkGenerator: avoid empty catch in action fallback --- src/LinkGenerator/NetteLinkGenerator.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/LinkGenerator/NetteLinkGenerator.php b/src/LinkGenerator/NetteLinkGenerator.php index 8b437b9..386c708 100644 --- a/src/LinkGenerator/NetteLinkGenerator.php +++ b/src/LinkGenerator/NetteLinkGenerator.php @@ -24,9 +24,9 @@ public function link(IMenuItem $item): string { $action = $item->getActionTarget(); if ($action !== null) { - try { - return $this->linkGenerator->link($action, $item->getActionParameters()); - } catch (InvalidLinkException) { + $generatedLink = $this->tryLink($action, $item->getActionParameters()); + if ($generatedLink !== null) { + return $generatedLink; } } @@ -50,4 +50,16 @@ public function absoluteLink(IMenuItem $item): string return $prefix . $this->link($item); } + /** + * @param array $parameters + */ + private function tryLink(string $action, array $parameters): ?string + { + try { + return $this->linkGenerator->link($action, $parameters); + } catch (InvalidLinkException) { + return null; + } + } + }