From ad1336feb55591572876fa00bc319ce2d9a5f172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Mon, 6 May 2024 20:12:07 -0300 Subject: [PATCH] Remove ResponseRenderer::disable from SchemaExportController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Creates a new Response object instead of using the response from ResponseRenderer class. Signed-off-by: MaurĂ­cio Meneghini Fauth --- app/services_controllers.php | 2 +- psalm-baseline.xml | 5 --- src/Controllers/SchemaExportController.php | 13 +++++--- .../SchemaExportControllerTest.php | 32 +++++++++++++------ tests/unit/Stubs/ResponseRenderer.php | 5 --- 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/app/services_controllers.php b/app/services_controllers.php index 538ae6d494..94fe19832a 100644 --- a/app/services_controllers.php +++ b/app/services_controllers.php @@ -616,7 +616,7 @@ return [ ], SchemaExportController::class => [ 'class' => SchemaExportController::class, - 'arguments' => ['$export' => '@export', '$response' => '@response'], + 'arguments' => ['@export', '@response', '@' . ResponseFactory::class], ], Server\BinlogController::class => [ 'class' => Server\BinlogController::class, diff --git a/psalm-baseline.xml b/psalm-baseline.xml index ccbd69d870..47fc674b85 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -2503,11 +2503,6 @@ - - - - - diff --git a/src/Controllers/SchemaExportController.php b/src/Controllers/SchemaExportController.php index e9c8fda199..ac23784550 100644 --- a/src/Controllers/SchemaExportController.php +++ b/src/Controllers/SchemaExportController.php @@ -8,6 +8,7 @@ use PhpMyAdmin\Core; use PhpMyAdmin\Exceptions\ExportException; use PhpMyAdmin\Export\Export; use PhpMyAdmin\Html\MySQLDocumentation; +use PhpMyAdmin\Http\Factory\ResponseFactory; use PhpMyAdmin\Http\Response; use PhpMyAdmin\Http\ServerRequest; use PhpMyAdmin\Identifiers\DatabaseName; @@ -23,8 +24,11 @@ use function mb_strlen; */ final class SchemaExportController implements InvocableController { - public function __construct(private readonly Export $export, private readonly ResponseRenderer $response) - { + public function __construct( + private readonly Export $export, + private readonly ResponseRenderer $response, + private readonly ResponseFactory $responseFactory, + ) { } public function __invoke(ServerRequest $request): Response|null @@ -54,14 +58,13 @@ final class SchemaExportController implements InvocableController return null; } - $this->response->disable(); + $response = $this->responseFactory->createResponse(); Core::downloadHeader( $exportInfo['fileName'], $exportInfo['mediaType'], mb_strlen($exportInfo['fileData'], '8bit'), ); - echo $exportInfo['fileData']; - return null; + return $response->write($exportInfo['fileData']); } } diff --git a/tests/unit/Controllers/SchemaExportControllerTest.php b/tests/unit/Controllers/SchemaExportControllerTest.php index 1f3f7a1e63..3b8b6633aa 100644 --- a/tests/unit/Controllers/SchemaExportControllerTest.php +++ b/tests/unit/Controllers/SchemaExportControllerTest.php @@ -4,16 +4,23 @@ declare(strict_types=1); namespace PhpMyAdmin\Tests\Controllers; +use Fig\Http\Message\StatusCodeInterface; use PhpMyAdmin\Controllers\SchemaExportController; use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\Export\Export; +use PhpMyAdmin\Http\Factory\ResponseFactory; use PhpMyAdmin\Http\ServerRequest; use PhpMyAdmin\Tests\AbstractTestCase; use PhpMyAdmin\Tests\Stubs\ResponseRenderer; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses; + +use function function_exists; +use function xdebug_get_headers; #[CoversClass(SchemaExportController::class)] -class SchemaExportControllerTest extends AbstractTestCase +#[RunTestsInSeparateProcesses] +final class SchemaExportControllerTest extends AbstractTestCase { public function testExport(): void { @@ -28,13 +35,20 @@ class SchemaExportControllerTest extends AbstractTestCase 'fileData' => 'file data', ]); - $response = new ResponseRenderer(); - $controller = new SchemaExportController($export, $response); - $controller($request); - $output = $this->getActualOutputForAssertion(); - self::assertSame('file data', $output); - self::assertTrue($response->isDisabled()); - self::assertSame('', $response->getHTMLResult()); - self::assertSame([], $response->getJSONResult()); + $controller = new SchemaExportController($export, new ResponseRenderer(), ResponseFactory::create()); + $response = $controller($request); + + self::assertNotNull($response); + self::assertSame(StatusCodeInterface::STATUS_OK, $response->getStatusCode()); + self::assertSame('file data', (string) $response->getBody()); + + if (! function_exists('xdebug_get_headers')) { + return; + } + + $headersList = xdebug_get_headers(); + self::assertContains('Content-Disposition: attachment; filename="file.svg"', $headersList); + self::assertContains('Content-Type: image/svg+xml', $headersList); + self::assertContains('Content-Length: 9', $headersList); } } diff --git a/tests/unit/Stubs/ResponseRenderer.php b/tests/unit/Stubs/ResponseRenderer.php index e2ed1c687a..c4804bf15d 100644 --- a/tests/unit/Stubs/ResponseRenderer.php +++ b/tests/unit/Stubs/ResponseRenderer.php @@ -172,11 +172,6 @@ class ResponseRenderer extends \PhpMyAdmin\ResponseRenderer return $this->isAjax; } - public function isDisabled(): bool - { - return $this->isDisabled; - } - public function getResponse(): Response { return $this->response;