3 declare(strict_types
=1);
5 namespace PhpMyAdmin\Tests
;
7 use PhpMyAdmin\Bookmarks\BookmarkRepository
;
9 use PhpMyAdmin\ConfigStorage\Relation
;
10 use PhpMyAdmin\ConfigStorage\RelationParameters
;
11 use PhpMyAdmin\Current
;
12 use PhpMyAdmin\Dbal\DatabaseInterface
;
13 use PhpMyAdmin\Encoding
;
14 use PhpMyAdmin\Html\MySQLDocumentation
;
15 use PhpMyAdmin\SqlQueryForm
;
16 use PhpMyAdmin\Template
;
17 use PhpMyAdmin\Tests\Stubs\DbiDummy
;
19 use PhpMyAdmin\UrlParams
;
20 use PHPUnit\Framework\Attributes\CoversClass
;
21 use ReflectionProperty
;
24 use function htmlspecialchars
;
26 #[CoversClass(SqlQueryForm::class)]
27 class SqlQueryFormTest
extends AbstractTestCase
29 protected DatabaseInterface
$dbi;
31 protected DbiDummy
$dummyDbi;
33 private SqlQueryForm
$sqlQueryForm;
38 protected function setUp(): void
44 $this->dummyDbi
= $this->createDbiDummy();
45 $this->dummyDbi
->addResult(
46 'SHOW FULL COLUMNS FROM `PMA_db`.`PMA_table`',
47 [['field1', '', null, 'NO', '', null, '', '', 'Comment1']],
48 ['Field', 'Type', 'Collation', 'Null', 'Key', 'Default', 'Extra', 'Privileges', 'Comment'],
51 $this->dummyDbi
->addResult(
52 'SHOW INDEXES FROM `PMA_db`.`PMA_table`',
55 $this->dbi
= $this->createDatabaseInterface($this->dummyDbi
);
56 DatabaseInterface
::$instance = $this->dbi
;
57 $relation = new Relation($this->dbi
);
58 $bookmarkRepository = new BookmarkRepository($this->dbi
, $relation);
59 $this->sqlQueryForm
= new SqlQueryForm(new Template(), $this->dbi
, $bookmarkRepository);
61 Current
::$database = 'PMA_db';
62 Current
::$table = 'PMA_table';
64 $config = Config
::getInstance();
65 $config->settings
['GZipDump'] = false;
66 $config->settings
['BZipDump'] = false;
67 $config->settings
['ZipDump'] = false;
68 $config->settings
['ServerDefault'] = 'default';
69 $config->settings
['TextareaAutoSelect'] = true;
70 $config->settings
['TextareaRows'] = 100;
71 $config->settings
['TextareaCols'] = 11;
72 $config->settings
['DefaultTabDatabase'] = '/database/structure';
73 $config->settings
['RetainQueryBox'] = true;
74 $config->settings
['ActionLinksMode'] = 'both';
75 $config->settings
['DefaultTabTable'] = '/sql';
76 $config->settings
['CodemirrorEnable'] = true;
77 $config->settings
['DefaultForeignKeyChecks'] = 'default';
79 $relationParameters = RelationParameters
::fromArray([
80 'table_coords' => 'table_name',
81 'displaywork' => true,
82 'db' => 'information_schema',
83 'table_info' => 'table_info',
85 'relation' => 'relation',
87 (new ReflectionProperty(Relation
::class, 'cache'))->setValue(null, $relationParameters);
89 $config->selectedServer
['user'] = 'user';
90 $config->selectedServer
['pmadb'] = 'pmadb';
91 $config->selectedServer
['bookmarktable'] = 'bookmarktable';
95 * Test for getHtmlForInsert
97 public function testPMAGetHtmlForSqlQueryFormInsert(): void
99 //Call the test function
100 $query = 'select * from PMA';
101 $html = $this->sqlQueryForm
->getHtml('PMA_db', 'PMA_table', $query);
104 self
::assertStringContainsString(
105 htmlspecialchars($query),
109 //validate 2: enable auto select text in textarea
110 $autoSel = ' data-textarea-auto-select="true"';
111 self
::assertStringContainsString($autoSel, $html);
113 //validate 3: MySQLDocumentation::show
114 self
::assertStringContainsString(
115 MySQLDocumentation
::show('SELECT'),
119 //validate 4: $fields_list
120 self
::assertStringContainsString('<input type="button" value="DELETE" id="delete"', $html);
121 self
::assertStringContainsString('<input type="button" value="UPDATE" id="update"', $html);
122 self
::assertStringContainsString('<input type="button" value="INSERT" id="insert"', $html);
123 self
::assertStringContainsString('<input type="button" value="SELECT" id="select"', $html);
124 self
::assertStringContainsString('<input type="button" value="SELECT *" id="selectall"', $html);
126 //validate 5: Clear button
127 self
::assertStringContainsString('<input type="button" value="DELETE" id="delete"', $html);
128 self
::assertStringContainsString(
137 public function testPMAGetHtmlForSqlQueryForm(): void
139 //Call the test function
140 Current
::$lang = 'ja';
141 $query = 'select * from PMA';
142 $html = $this->sqlQueryForm
->getHtml('PMA_db', 'PMA_table', $query);
145 self
::assertStringContainsString(
146 htmlspecialchars($query),
150 //validate 2: $enctype
151 $enctype = ' enctype="multipart/form-data">';
152 self
::assertStringContainsString($enctype, $html);
154 //validate 3: sqlqueryform
155 self
::assertStringContainsString('id="sqlqueryform" name="sqlform"', $html);
157 //validate 4: $db, $table
158 $table = Current
::$table;
159 $db = Current
::$database;
160 self
::assertStringContainsString(
161 Url
::getHiddenInputs($db, $table),
166 $goto = UrlParams
::$goto === '' ? Url
::getFromRoute('/table/sql') : UrlParams
::$goto;
167 self
::assertStringContainsString(
168 htmlspecialchars($goto),
172 //validate 6: Kanji encoding form
173 self
::assertStringContainsString(
174 Encoding
::kanjiEncodingForm(),
177 Current
::$lang = 'en';