From 2fb0f00b4af2f107f51786e62b52bd89218c0b6b Mon Sep 17 00:00:00 2001 From: Chris Morrell Date: Tue, 15 Dec 2020 09:20:33 -0500 Subject: [PATCH] [8.x] When following redirects, terminate each test request in proper order (#35604) * Terminate each test request in proper order * StyleCI * StyleCI --- .../Testing/Concerns/MakesHttpRequests.php | 8 +-- .../Concerns/MakesHttpRequestsTest.php | 60 +++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php b/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php index 10e55aab1358..0be549f99cc2 100644 --- a/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php +++ b/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php @@ -508,12 +508,12 @@ public function call($method, $uri, $parameters = [], $cookies = [], $files = [] $request = Request::createFromBase($symfonyRequest) ); + $kernel->terminate($request, $response); + if ($this->followRedirects) { $response = $this->followRedirects($response); } - $kernel->terminate($request, $response); - return $this->createTestResponse($response); } @@ -623,12 +623,12 @@ protected function prepareCookiesForJsonRequest() */ protected function followRedirects($response) { + $this->followRedirects = false; + while ($response->isRedirect()) { $response = $this->get($response->headers->get('Location')); } - $this->followRedirects = false; - return $response; } diff --git a/tests/Foundation/Testing/Concerns/MakesHttpRequestsTest.php b/tests/Foundation/Testing/Concerns/MakesHttpRequestsTest.php index 277b6dedf8b2..da1540d21f33 100644 --- a/tests/Foundation/Testing/Concerns/MakesHttpRequestsTest.php +++ b/tests/Foundation/Testing/Concerns/MakesHttpRequestsTest.php @@ -2,6 +2,9 @@ namespace Illuminate\Tests\Foundation\Testing\Concerns; +use Illuminate\Contracts\Routing\Registrar; +use Illuminate\Contracts\Routing\UrlGenerator; +use Illuminate\Http\RedirectResponse; use Orchestra\Testbench\TestCase; class MakesHttpRequestsTest extends TestCase @@ -114,6 +117,48 @@ public function testWithoutAndWithCredentials() $this->defaultCookies = ['foo' => 'bar']; $this->assertSame(['foo' => 'bar'], $this->prepareCookiesForJsonRequest()); } + + public function testFollowingRedirects() + { + $router = $this->app->make(Registrar::class); + $url = $this->app->make(UrlGenerator::class); + + $router->get('from', function () use ($url) { + return new RedirectResponse($url->to('to')); + }); + + $router->get('to', function () { + return 'OK'; + }); + + $this->followingRedirects() + ->get('from') + ->assertOk() + ->assertSee('OK'); + } + + public function testFollowingRedirectsTerminatesInExpectedOrder() + { + $router = $this->app->make(Registrar::class); + $url = $this->app->make(UrlGenerator::class); + + $callOrder = []; + TerminatingMiddleware::$callback = function ($request) use (&$callOrder) { + $callOrder[] = $request->path(); + }; + + $router->get('from', function () use ($url) { + return new RedirectResponse($url->to('to')); + })->middleware(TerminatingMiddleware::class); + + $router->get('to', function () { + return 'OK'; + })->middleware(TerminatingMiddleware::class); + + $this->followingRedirects()->get('from'); + + $this->assertEquals(['from', 'to'], $callOrder); + } } class MyMiddleware @@ -123,3 +168,18 @@ public function handle($request, $next) return $next($request.'WithMiddleware'); } } + +class TerminatingMiddleware +{ + public static $callback; + + public function handle($request, $next) + { + return $next($request); + } + + public function terminate($request, $response) + { + call_user_func(static::$callback, $request, $response); + } +}