3 declare(strict_types
=1);
5 namespace PhpMyAdmin\Tests
;
7 use Fig\Http\Message\StatusCodeInterface
;
9 use PhpMyAdmin\Current
;
10 use PhpMyAdmin\Dbal\DatabaseInterface
;
11 use PhpMyAdmin\Header
;
12 use PhpMyAdmin\Html\MySQLDocumentation
;
13 use PhpMyAdmin\Message
;
14 use PhpMyAdmin\ResponseRenderer
;
15 use PhpMyAdmin\Scripts
;
16 use PhpMyAdmin\Template
;
17 use PHPUnit\Framework\Attributes\CoversClass
;
18 use ReflectionProperty
;
20 use function array_column
;
21 use function json_decode
;
23 #[CoversClass(ResponseRenderer::class)]
24 final class ResponseRendererTest
extends AbstractTestCase
26 protected function setUp(): void
30 DatabaseInterface
::$instance = $this->createDatabaseInterface();
32 Current
::$lang = 'en';
35 public function testSetAjax(): void
38 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);
39 $response = ResponseRenderer
::getInstance();
40 self
::assertFalse($response->isAjax());
41 $response->setAjax(true);
42 self
::assertTrue($response->isAjax());
43 $response->setAjax(false);
44 self
::assertFalse($response->isAjax());
45 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);
48 public function testAddScriptFiles(): void
50 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);
51 $response = ResponseRenderer
::getInstance();
52 $header = $response->getHeader();
53 $headerScripts = (new ReflectionProperty(Header
::class, 'scripts'))->getValue($header);
54 self
::assertInstanceOf(Scripts
::class, $headerScripts);
55 $files = array_column($headerScripts->getFiles(), 'name');
56 self
::assertNotContains('server/privileges.js', $files);
57 self
::assertNotContains('vendor/zxcvbn-ts.js', $files);
59 $response->addScriptFiles(['server/privileges.js', 'vendor/zxcvbn-ts.js']);
61 $files = array_column($headerScripts->getFiles(), 'name');
62 self
::assertContains('server/privileges.js', $files);
63 self
::assertContains('vendor/zxcvbn-ts.js', $files);
64 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);
67 public function testMissingParameterError(): void
69 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);
70 $responseRenderer = ResponseRenderer
::getInstance();
71 $responseRenderer->setAjax(false);
73 $message = 'Missing parameter: param_name';
74 $message .= MySQLDocumentation
::showDocumentation('faq', 'faqmissingparameters', true);
76 $expected = Message
::error($message)->getDisplay();
78 $response = $responseRenderer->missingParameterError('param_name');
80 self
::assertStringContainsString($expected, (string) $response->getBody());
81 self
::assertSame(StatusCodeInterface
::STATUS_BAD_REQUEST
, $response->getStatusCode());
83 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);
86 public function testHtmlResponse(): void
88 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);
90 $_SERVER['SCRIPT_NAME'] = 'index.php';
92 Current
::$message = null;
94 $responseRenderer = ResponseRenderer
::getInstance();
95 $responseRenderer->setAjax(false);
96 $responseRenderer->addHTML('<div>TEST</div>');
98 $response = $responseRenderer->response();
100 self
::assertSame(StatusCodeInterface
::STATUS_OK
, $response->getStatusCode());
101 self
::assertSame('text/html; charset=utf-8', $response->getHeaderLine('Content-Type'));
102 $header = $responseRenderer->getHeader();
104 (new Template(new Config()))->render('base', [
107 'allow_third_party_framing' => false,
111 'title' => 'phpMyAdmin',
112 'scripts' => $header->getScripts()->getDisplay(),
115 'custom_header' => '',
116 'load_user_preferences' => '',
118 'is_warnings_enabled' => true,
119 'is_menu_enabled' => true,
120 'is_logged_in' => true,
122 'console' => $header->getConsole()->getDisplay(),
124 'theme_color_mode' => 'light',
125 'theme_color_modes' => ['light'],
127 'current_user' => ['pma_test', 'localhost'],
128 'is_mariadb' => false,
130 'content' => '<div>TEST</div>',
132 'is_minimal' => false,
133 'self_url' => 'index.php?route=%2F&server=0&lang=en',
134 'error_messages' => '',
135 'scripts' => <<<'HTML'
137 <script data-cfasync="false">
139 window.Console.debugSqlInfo = 'false';
146 'git_revision_info' => [],
150 (string) $response->getBody(),
153 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);
156 public function testJsonResponse(): void
158 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);
160 $_SERVER['SCRIPT_NAME'] = 'index.php';
161 Current
::$server = 0;
162 Current
::$message = null;
164 $responseRenderer = ResponseRenderer
::getInstance();
165 $responseRenderer->setAjax(true);
166 $responseRenderer->addJSON('message', 'test message');
167 $responseRenderer->addJSON('test', 'test');
169 $response = $responseRenderer->response();
171 self
::assertSame(StatusCodeInterface
::STATUS_OK
, $response->getStatusCode());
172 self
::assertSame('application/json; charset=UTF-8', $response->getHeaderLine('Content-Type'));
173 $body = (string) $response->getBody();
174 self
::assertJson($body);
175 $header = $responseRenderer->getHeader();
178 'message' => 'test message',
181 'title' => '<title>phpMyAdmin</title>',
182 'menu' => $header->getMenu()->getDisplay(),
183 'scripts' => $header->getScripts()->getFiles(),
184 'selflink' => 'index.php?route=%2F&server=0&lang=en',
185 'displayMessage' => '',
186 'debug' => "'false'",
187 'promptPhpErrors' => false,
188 'reloadQuerywindow' => ['db' => '', 'table' => '', 'sql_query' => ''],
189 'params' => $header->getJsParams(),
191 json_decode($body, true),
194 (new ReflectionProperty(ResponseRenderer
::class, 'instance'))->setValue(null, null);