Skip to content

Commit

Permalink
Return correct exception when no original request has been found (#160)
Browse files Browse the repository at this point in the history
Close #158
  • Loading branch information
spaze authored Jul 1, 2023
2 parents 9331ce5 + d85cc15 commit fda48e7
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 19 deletions.
6 changes: 5 additions & 1 deletion site/app/Application/AppRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,24 @@
namespace MichalSpacekCz\Application;

use Exception;
use MichalSpacekCz\Application\Exceptions\NoOriginalRequestException;
use MichalSpacekCz\ShouldNotHappenException;
use Nette\Application\Request;

class AppRequest
{

/**
* @throws NoOriginalRequestException
*/
public function getOriginalRequest(?Request $request): Request
{
if (!$request) {
throw new ShouldNotHappenException('Request should be set before this method is called in UI\Presenter::run()');
}
$requestParam = $request->getParameter('request');
if (!$requestParam instanceof Request) {
throw new ShouldNotHappenException('No original request');
throw new NoOriginalRequestException('No original request');
}
return $requestParam;
}
Expand Down
10 changes: 10 additions & 0 deletions site/app/Application/Exceptions/NoOriginalRequestException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php
declare(strict_types = 1);

namespace MichalSpacekCz\Application\Exceptions;

use Exception;

class NoOriginalRequestException extends Exception
{
}
13 changes: 7 additions & 6 deletions site/app/Www/Presenters/BasePresenter.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
use MichalSpacekCz\Application\LocaleLinkGeneratorInterface;
use MichalSpacekCz\Application\Theme;
use MichalSpacekCz\User\Manager;
use Nette\Application\UI\InvalidLinkException;
use Nette\Application\UI\Presenter;
use Nette\Bridges\ApplicationLatte\DefaultTemplate;
use Nette\Http\IResponse;
Expand Down Expand Up @@ -82,11 +81,13 @@ protected function startup(): void

public function beforeRender(): void
{
try {
$this->template->localeLinks = $this->localeLinkGenerator->links($this->getLocaleLinkAction(), $this->getLocaleLinkParams());
} catch (InvalidLinkException) {
$this->template->localeLinks = $this->getLocaleLinkDefault();
}
$this->addLocaleLinks();
}


protected function addLocaleLinks(): void
{
$this->template->localeLinks = $this->localeLinkGenerator->links($this->getLocaleLinkAction(), $this->getLocaleLinkParams());
}


Expand Down
21 changes: 17 additions & 4 deletions site/app/Www/Presenters/ErrorPresenter.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
namespace MichalSpacekCz\Www\Presenters;

use MichalSpacekCz\Application\AppRequest;
use MichalSpacekCz\Application\Exceptions\NoOriginalRequestException;
use MichalSpacekCz\Application\LocaleLinkGeneratorInterface;
use MichalSpacekCz\EasterEgg\FourOhFourButFound;
use Nette\Application\BadRequestException;
Expand Down Expand Up @@ -32,6 +33,16 @@ public function __construct(
}


protected function addLocaleLinks(): void
{
try {
$this->template->localeLinks = $this->localeLinkGenerator->links($this->getLocaleLinkAction(), $this->getLocaleLinkParams());
} catch (NoOriginalRequestException) {
$this->template->localeLinks = $this->getLocaleLinkDefault();
}
}


public function actionDefault(BadRequestException $exception): void
{
$this->fourOhFourButFound->sendItMaybe($this);
Expand Down Expand Up @@ -62,23 +73,25 @@ protected function getLocaleLinkDefault(): ?array
* Get original module:presenter:action for locale links.
*
* @return string
* @throws NoOriginalRequestException
*/
protected function getLocaleLinkAction(): string
{
$requestParam = $this->appRequest->getOriginalRequest($this->getRequest());
return $requestParam->getPresenterName() . ':' . $requestParam->getParameter(self::ActionKey);
$originalRequest = $this->appRequest->getOriginalRequest($this->getRequest());
return $originalRequest->getPresenterName() . ':' . $originalRequest->getParameter(self::ActionKey);
}


/**
* Get original parameters for locale links.
*
* @return array<string, array<string, string|null>>
* @throws NoOriginalRequestException
*/
protected function getLocaleLinkParams(): array
{
$requestParam = $this->appRequest->getOriginalRequest($this->getRequest());
return $this->localeLinkGenerator->defaultParams($requestParam->getParameters());
$originalRequest = $this->appRequest->getOriginalRequest($this->getRequest());
return $this->localeLinkGenerator->defaultParams($originalRequest->getParameters());
}

}
17 changes: 9 additions & 8 deletions site/tests/Application/AppRequestTest.phpt
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
<?php
/** @noinspection PhpDocMissingThrowsInspection */
/** @noinspection PhpUnhandledExceptionInspection */
/** @noinspection PhpFullyQualifiedNameUsageInspection */
declare(strict_types = 1);

namespace MichalSpacekCz\Application;

use DateTime;
use Exception;
use MichalSpacekCz\Application\Exceptions\NoOriginalRequestException;
use Nette\Application\Request;
use Tester\Assert;
use Tester\TestCase;
Expand All @@ -31,25 +34,23 @@ class AppRequestTest extends TestCase
}


/**
* @throws \MichalSpacekCz\ShouldNotHappenException No original request
*/
public function testGetOriginalRequestNoOriginalRequest(): void
{
$request = new Request('name');
$request->setParameters(['request' => null]);
$this->appRequest->getOriginalRequest($request);
Assert::throws(function () use ($request): void {
$this->appRequest->getOriginalRequest($request);
}, NoOriginalRequestException::class, 'No original request');
}


/**
* @throws \MichalSpacekCz\ShouldNotHappenException No original request
*/
public function testGetOriginalRequestInvalidOriginalRequest(): void
{
$request = new Request('name');
$request->setParameters(['request' => new DateTime()]);
$this->appRequest->getOriginalRequest($request);
Assert::throws(function () use ($request): void {
$this->appRequest->getOriginalRequest($request);
}, NoOriginalRequestException::class, 'No original request');
}


Expand Down

0 comments on commit fda48e7

Please sign in to comment.