From 89742ecd5542c740f3625af76c843a7471dbe98a Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Wed, 27 Nov 2019 19:11:37 +0100 Subject: Response: Added with and withInput methods and back/redirect functions --- tests/Unit/HelpersTest.php | 47 ++++++++++++++++++++ tests/Unit/Http/RedirectServiceProviderTest.php | 23 ++++++++++ tests/Unit/Http/RedirectorTest.php | 53 +++++++++++++++++++++++ tests/Unit/Http/ResponseTest.php | 57 +++++++++++++++++++++++++ tests/Unit/Middleware/ErrorHandlerTest.php | 9 +++- 5 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/Http/RedirectServiceProviderTest.php create mode 100644 tests/Unit/Http/RedirectorTest.php (limited to 'tests') diff --git a/tests/Unit/HelpersTest.php b/tests/Unit/HelpersTest.php index 09362a90..710deff5 100644 --- a/tests/Unit/HelpersTest.php +++ b/tests/Unit/HelpersTest.php @@ -7,6 +7,7 @@ use Engelsystem\Config\Config; use Engelsystem\Container\Container; use Engelsystem\Helpers\Authenticator; use Engelsystem\Helpers\Translation\Translator; +use Engelsystem\Http\Redirector; use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Engelsystem\Http\UrlGeneratorInterface; @@ -98,6 +99,29 @@ class HelpersTest extends TestCase $this->assertEquals(['user' => 'FooBar'], config('mail')); } + /** + * @covers \back + */ + public function testBack() + { + $response = new Response(); + /** @var Redirector|MockObject $redirect */ + $redirect = $this->createMock(Redirector::class); + $redirect->expects($this->exactly(2)) + ->method('back') + ->withConsecutive([302, []], [303, ['test' => 'ing']]) + ->willReturn($response); + + $app = new Application(); + $app->instance('redirect', $redirect); + + $return = back(); + $this->assertEquals($response, $return); + + $return = back(303, ['test' => 'ing']); + $this->assertEquals($response, $return); + } + /** * @covers \config_path */ @@ -117,6 +141,29 @@ class HelpersTest extends TestCase $this->assertEquals('/foo/conf/bar.php', config_path('bar.php')); } + /** + * @covers \redirect + */ + public function testRedirect() + { + $response = new Response(); + /** @var Redirector|MockObject $redirect */ + $redirect = $this->createMock(Redirector::class); + $redirect->expects($this->exactly(2)) + ->method('to') + ->withConsecutive(['/lorem', 302, []], ['/ipsum', 303, ['test' => 'er']]) + ->willReturn($response); + + $app = new Application(); + $app->instance('redirect', $redirect); + + $return = redirect('/lorem'); + $this->assertEquals($response, $return); + + $return = redirect('/ipsum', 303, ['test' => 'er']); + $this->assertEquals($response, $return); + } + /** * @covers \request */ diff --git a/tests/Unit/Http/RedirectServiceProviderTest.php b/tests/Unit/Http/RedirectServiceProviderTest.php new file mode 100644 index 00000000..9c2a07fc --- /dev/null +++ b/tests/Unit/Http/RedirectServiceProviderTest.php @@ -0,0 +1,23 @@ +register(); + + $this->assertTrue($app->has('redirect')); + } +} diff --git a/tests/Unit/Http/RedirectorTest.php b/tests/Unit/Http/RedirectorTest.php new file mode 100644 index 00000000..300b0180 --- /dev/null +++ b/tests/Unit/Http/RedirectorTest.php @@ -0,0 +1,53 @@ +to('/test'); + $this->assertEquals(['/test'], $return->getHeader('location')); + $this->assertEquals(302, $return->getStatusCode()); + + $return = $redirector->to('/foo', 303, ['test' => 'data']); + $this->assertEquals(['/foo'], $return->getHeader('location')); + $this->assertEquals(303, $return->getStatusCode()); + $this->assertEquals(['data'], $return->getHeader('test')); + } + + /** + * @covers \Engelsystem\Http\Redirector::back + * @covers \Engelsystem\Http\Redirector::getPreviousUrl + */ + public function testBack() + { + $request = new Request(); + $response = new Response(); + $redirector = new Redirector($request, $response); + + $return = $redirector->back(); + $this->assertEquals(['/'], $return->getHeader('location')); + $this->assertEquals(302, $return->getStatusCode()); + + $request = $request->withHeader('referer', '/old-page'); + $redirector = new Redirector($request, $response); + $return = $redirector->back(303, ['foo' => 'bar']); + $this->assertEquals(303, $return->getStatusCode()); + $this->assertEquals(['/old-page'], $return->getHeader('location')); + $this->assertEquals(['bar'], $return->getHeader('foo')); + } +} diff --git a/tests/Unit/Http/ResponseTest.php b/tests/Unit/Http/ResponseTest.php index b8e6e527..56d8410f 100644 --- a/tests/Unit/Http/ResponseTest.php +++ b/tests/Unit/Http/ResponseTest.php @@ -10,6 +10,8 @@ use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Http\Message\ResponseInterface; use Symfony\Component\HttpFoundation\Response as SymfonyResponse; +use Symfony\Component\HttpFoundation\Session\Session; +use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; class ResponseTest extends TestCase { @@ -116,4 +118,59 @@ class ResponseTest extends TestCase $newResponse->getHeaders() ); } + + /** + * @covers \Engelsystem\Http\Response::with + */ + public function testWith() + { + $session = new Session(new MockArraySessionStorage()); + $response = new Response('', 200, [], null, $session); + + $response->with('foo', 'bar'); + $this->assertEquals('bar', $session->get('foo')); + + $response->with('lorem', ['ipsum', 'dolor' => ['foo' => 'bar']]); + $this->assertEquals(['ipsum', 'dolor' => ['foo' => 'bar']], $session->get('lorem')); + + $response->with('lorem', ['dolor' => ['test' => 'er']]); + $this->assertEquals(['ipsum', 'dolor' => ['foo' => 'bar', 'test' => 'er']], $session->get('lorem')); + } + + /** + * @covers \Engelsystem\Http\Response::with + */ + public function testWithNoSession() + { + $this->expectException(InvalidArgumentException::class); + + $response = new Response(); + $response->with('foo', 'bar'); + } + + /** + * @covers \Engelsystem\Http\Response::withInput + */ + public function testWithInput() + { + $session = new Session(new MockArraySessionStorage()); + $response = new Response('', 200, [], null, $session); + + $response->withInput(['some' => 'value']); + $this->assertEquals(['some' => 'value'], $session->get('form-data')); + + $response->withInput(['lorem' => 'ipsum']); + $this->assertEquals(['lorem' => 'ipsum'], $session->get('form-data')); + } + + /** + * @covers \Engelsystem\Http\Response::withInput + */ + public function testWithInputNoSession() + { + $this->expectException(InvalidArgumentException::class); + + $response = new Response(); + $response->withInput(['some' => 'value']); + } } diff --git a/tests/Unit/Middleware/ErrorHandlerTest.php b/tests/Unit/Middleware/ErrorHandlerTest.php index ef2f7be0..91b59507 100644 --- a/tests/Unit/Middleware/ErrorHandlerTest.php +++ b/tests/Unit/Middleware/ErrorHandlerTest.php @@ -6,6 +6,7 @@ use Engelsystem\Application; use Engelsystem\Http\Exceptions\HttpException; use Engelsystem\Http\Exceptions\ValidationException; use Engelsystem\Http\Psr7ServiceProvider; +use Engelsystem\Http\RedirectServiceProvider; use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Engelsystem\Http\ResponseServiceProvider; @@ -18,6 +19,7 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use Symfony\Component\HttpFoundation\Session\Session; +use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Twig\Loader\LoaderInterface as TwigLoader; @@ -155,7 +157,7 @@ class ErrorHandlerTest extends TestCase /** * @covers \Engelsystem\Middleware\ErrorHandler::process - * @covers \Engelsystem\Middleware\ErrorHandler::getPreviousUrl + * @covers \Engelsystem\Middleware\ErrorHandler::redirectBack */ public function testProcessValidationException() { @@ -185,11 +187,13 @@ class ErrorHandlerTest extends TestCase /** @var Application $app */ $app = app(); + $app->instance(Session::class, $session); + $app->bind(SessionInterface::class, Session::class); (new ResponseServiceProvider($app))->register(); (new Psr7ServiceProvider($app))->register(); + (new RedirectServiceProvider($app))->register(); $errorHandler = new ErrorHandler($twigLoader); - $return = $errorHandler->process($request, $handler); $this->assertEquals(302, $return->getStatusCode()); @@ -209,6 +213,7 @@ class ErrorHandlerTest extends TestCase ], $session->all()); $request = $request->withAddedHeader('referer', '/foo/batz'); + $app->instance(Request::class, $request); $return = $errorHandler->process($request, $handler); $this->assertEquals('/foo/batz', $return->getHeaderLine('location')); -- cgit v1.2.3-54-g00ecf