3 declare(strict_types
=1);
5 namespace PhpMyAdmin\Tests\Selenium\Table
;
7 use Facebook\WebDriver\WebDriverKeys
;
8 use PhpMyAdmin\Tests\Selenium\TestBase
;
9 use PHPUnit\Framework\Attributes\CoversNothing
;
10 use PHPUnit\Framework\Attributes\Large
;
14 class BrowseTest
extends TestBase
17 * Setup the browser environment to run the selenium test case
19 protected function setUp(): void
24 'USE `' . $this->databaseName
. '`;'
25 . 'CREATE TABLE `test_table` ('
26 . ' `id` int(11) NOT NULL AUTO_INCREMENT,'
27 . ' `name` varchar(20) NOT NULL,'
28 . ' `datetimefield` datetime NOT NULL,'
29 . ' PRIMARY KEY (`id`)'
31 . 'INSERT INTO `test_table` (`id`, `name`, `datetimefield`) VALUES'
32 . " (1, 'abcd', '2011-01-20 02:00:02'),"
33 . " (2, 'foo', '2010-01-20 02:00:02'),"
34 . " (3, 'Abcd', '2012-01-20 02:00:02');",
38 $this->navigateTable('test_table');
44 * Test sorting of records in browse table
46 public function testSortRecords(): void
49 $this->byPartialLinkText('name')->click();
54 $this->getCellByTableClass('table_results', 1, 5),
59 $this->getCellByTableClass('table_results', 2, 5),
64 $this->getCellByTableClass('table_results', 3, 5),
68 $this->byPartialLinkText('name')->click();
73 $this->getCellByTableClass('table_results', 1, 5),
78 $this->getCellByTableClass('table_results', 2, 5),
83 $this->getCellByTableClass('table_results', 3, 5),
87 $this->byLinkText('datetimefield')->click();
90 $this->getCellByTableClass('table_results', 1, 5);
93 $this->getCellByTableClass('table_results', 1, 5),
98 $this->getCellByTableClass('table_results', 2, 5),
103 $this->getCellByTableClass('table_results', 3, 5),
107 $this->byPartialLinkText('datetimefield')->click();
112 $this->getCellByTableClass('table_results', 1, 5),
117 $this->getCellByTableClass('table_results', 2, 5),
122 $this->getCellByTableClass('table_results', 3, 5),
129 public function testChangeRecords(): void
131 $ele = $this->byCssSelector('table.table_results tbody tr:nth-child(2) td:nth-child(2)');
135 $this->waitForElement('id', 'insertForm');
138 $this->waitForElement('id', 'insertForm');
142 $this->byId('field_1_3')->getAttribute('value'),
147 $this->byId('field_2_3')->getAttribute('value'),
151 '2010-01-20 02:00:02',
152 $this->byId('field_3_3')->getAttribute('value'),
155 $this->byId('field_3_3')->clear();
156 $this->byId('field_3_3')->sendKeys('2009-01-2');
157 // shorter date to prevent error,
158 // automatically gets appended with 00:00:00
160 $this->byId('field_2_3')->clear();
161 $this->byId('field_2_3')->sendKeys('foobar');
163 $this->byId('buttonYes')->click();
166 $success = $this->waitForElement('className', 'alert-success');
167 self
::assertStringContainsString('1 row affected', $success->getText());
171 $this->getCellByTableClass('table_results', 2, 6),
175 '2009-01-02 00:00:00',
176 $this->getCellByTableClass('table_results', 2, 7),
181 * Test edit record by double click
183 public function testChangeRecordsByDoubleClick(): void
185 $element = $this->byCssSelector('table.table_results tbody tr:nth-child(1) td:nth-child(6)');
187 $this->moveto($element);
188 $this->doubleclick();
191 $this->waitForElement(
193 "//div[not(contains(@style,'display: none;'))]//textarea[contains(@class, 'edit_box')]",
194 )->getAttribute('value'),
198 $this->byCssSelector('textarea.edit_box')->clear();
199 $this->byCssSelector('textarea.edit_box')->sendKeys('abcde');
201 $this->keys(WebDriverKeys
::RETURN_KEY
);
204 $success = $this->waitForElement('cssSelector', 'span.ajax_notification .alert-success');
205 self
::assertStringContainsString('1 row affected', $success->getText());
209 $this->getCellByTableClass('table_results', 1, 6),
214 * Test copy and insert record
216 public function testCopyRecords(): void
218 $ele = $this->byCssSelector('table.table_results tbody tr:nth-child(3) td:nth-child(3)');
221 $this->waitForElement('id', 'insertForm');
225 $this->byId('field_2_3')->getAttribute('value'),
229 '2012-01-20 02:00:02',
230 $this->byId('field_3_3')->getAttribute('value'),
233 $this->byId('field_2_3')->clear();
234 $this->byId('field_2_3')->sendKeys('ABCDEFG');
236 $this->byId('field_3_3')->clear();
237 $this->byId('field_3_3')->sendKeys('2012-01-02');
239 $this->waitForElement('id', 'buttonYes')->click();
242 $success = $this->waitForElement('className', 'alert-success');
243 self
::assertStringContainsString('1 row inserted', $success->getText());
247 $this->getCellByTableClass('table_results', 4, 6),
251 '2012-01-02 00:00:00',
252 $this->getCellByTableClass('table_results', 4, 7),
259 public function testSearchRecords(): void
263 $this->byPartialLinkText('Search')->click();
264 $this->waitForElement('id', 'tbl_search_form');
266 $this->byId('fieldID_1')->sendKeys('abcd');
267 $this->selectByLabel(
268 $this->byName('criteriaColumnOperators[1]'),
272 $this->scrollToBottom();
273 $elem = $this->waitForElement('cssSelector', '.card-footer input[name=submit]');
274 $this->moveto($elem);
278 $success = $this->waitForElement('className', 'alert-success');
279 self
::assertStringContainsString('Showing rows', $success->getText());
283 $this->getCellByTableClass('table_results', 1, 5),
288 $this->getCellByTableClass('table_results', 2, 5),
293 * Test delete multiple records
295 public function testDeleteRecords(): void
297 $this->byId('id_rows_to_delete1_left')->click();
298 $this->byId('id_rows_to_delete2_left')->click();
300 $this->byCssSelector('button[value=delete]')->click();
302 $this->waitForElement('id', 'buttonYes')->click();
306 $success = $this->waitForElement(
308 '.sqlqueryresults > .result_query:nth-child(1) > .alert-success',
310 self
::assertStringContainsString('Your SQL query has been executed successfully.', $success->getText());
311 $success = $this->waitForElement(
313 '.sqlqueryresults > .result_query:nth-child(2) > .alert-success',
315 self
::assertStringContainsString('Showing rows', $success->getText());
318 $this->isElementPresent(
320 'table.table_results tbody tr:nth-child(2)',