forked from phpmyadmin/phpmyadmin
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Selenium tests for typing and executing SQL query
* Adds separate tests for Server SQL, Database SQL, Table SQL query pages * Add tests for inline-edit on SQL results page Signed-off-by: Deven Bansod <devenbansod.bits@gmail.com>
- Loading branch information
1 parent
fca2173
commit e71c08d
Showing
1 changed file
with
242 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,242 @@ | ||
<?php | ||
/* vim: set expandtab sw=4 ts=4 sts=4: */ | ||
/** | ||
* Selenium TestCase for typing and executing SQL query tests | ||
* | ||
* @package PhpMyAdmin-test | ||
* @subpackage Selenium | ||
*/ | ||
|
||
require_once 'TestBase.php'; | ||
|
||
/** | ||
* PmaSeleniumSqlQueryTest class | ||
* | ||
* @package PhpMyAdmin-test | ||
* @subpackage Selenium | ||
* @group selenium | ||
*/ | ||
class PMA_SeleniumSqlQueryTest extends PMA_SeleniumBase | ||
{ | ||
|
||
/** | ||
* Setup the browser environment to run the selenium test case | ||
* | ||
* @return void | ||
*/ | ||
public function setUp() | ||
{ | ||
parent::setUp(); | ||
|
||
$this->dbQuery( | ||
"CREATE TABLE `test_table` (" | ||
. " `id` int(11) NOT NULL AUTO_INCREMENT," | ||
. " `val` int(11) NOT NULL," | ||
. " PRIMARY KEY (`id`)" | ||
. ")" | ||
); | ||
$this->dbQuery( | ||
"INSERT INTO `test_table` (val) VALUES (2), (3), (4), (5);" | ||
); | ||
} | ||
|
||
/** | ||
* setUp function that can use the selenium session (called before each test) | ||
* | ||
* @return void | ||
*/ | ||
public function setUpPage() | ||
{ | ||
parent::setUpPage(); | ||
|
||
$this->login(); | ||
} | ||
|
||
/** | ||
* Test typing a SQL query on Server SQL page and submitting it | ||
* | ||
* @return void | ||
*/ | ||
public function testServerSqlQuery() | ||
{ | ||
$this->waitForElement('byPartialLinkText', 'SQL')->click(); | ||
$this->waitForElementNotPresent('byId', 'ajax_message_num_1'); | ||
|
||
// Minimum wait | ||
sleep(1); | ||
|
||
// Dynamic wait | ||
$this->waitUntil(function () { | ||
if ($this->byCssSelector('div.CodeMirror')) { | ||
return true; | ||
} | ||
return null; | ||
}, 5000); | ||
$this->typeInTextArea( | ||
'SET @t1=1, @t2=2, @t3:=4;' | ||
. 'SELECT 1 as `id`, @t1, @t2, @t3, @t4 := @t1+@t2+@t3;', | ||
2 | ||
); | ||
$this->byId('button_submit_query')->click(); | ||
$this->waitForElementNotPresent('byId', 'ajax_message_num_1'); | ||
|
||
$this->waitForElement('byCssSelector', 'table.table_results'); | ||
$this->assertEquals( | ||
1, | ||
$this->getCellByTableClass('table_results', 1, 1) | ||
); | ||
$this->assertEquals( | ||
1, | ||
$this->getCellByTableClass('table_results', 1, 2) | ||
); | ||
$this->assertEquals( | ||
2, | ||
$this->getCellByTableClass('table_results', 1, 3) | ||
); | ||
$this->assertEquals( | ||
4, | ||
$this->getCellByTableClass('table_results', 1, 4) | ||
); | ||
$this->assertEquals( | ||
7, | ||
$this->getCellByTableClass('table_results', 1, 5) | ||
); | ||
|
||
// test inline edit button | ||
$this->_testInlineEdit(); | ||
} | ||
|
||
/** | ||
* Test typing a SQL query on Database SQL page and submitting it | ||
* | ||
* @return void | ||
*/ | ||
public function testDatabaseSqlQuery() | ||
{ | ||
// Go to server databases | ||
$this->waitForElement('byPartialLinkText','Databases')->click(); | ||
$this->waitForElementNotPresent('byCssSelector', 'div#loading_parent'); | ||
|
||
// go to specific database page | ||
$this->waitForElement("byPartialLinkText", $this->database_name)->click(); | ||
|
||
/* Wait for loading and expanding tree */ | ||
$this->waitForElement( | ||
'byCssSelector', | ||
'li.last.table' | ||
); | ||
|
||
$this->waitForElement('byPartialLinkText', 'SQL')->click(); | ||
$this->waitForElementNotPresent('byId', 'ajax_message_num_1'); | ||
|
||
// Minimum wait | ||
sleep(1); | ||
|
||
// Dynamic wait | ||
$this->waitUntil(function () { | ||
if ($this->byCssSelector('div.CodeMirror')) { | ||
return true; | ||
} | ||
return null; | ||
}, 5000); | ||
$this->typeInTextArea( | ||
'SHOW TABLE STATUS', | ||
2 | ||
); | ||
$this->byId('button_submit_query')->click(); | ||
$this->waitForElementNotPresent('byId', 'ajax_message_num_1'); | ||
|
||
$this->waitForElement('byCssSelector', 'table.table_results'); | ||
$this->assertEquals( | ||
'test_table', | ||
$this->getCellByTableClass('table_results', 1, 1) | ||
); | ||
$this->assertEquals( | ||
'InnoDB', | ||
$this->getCellByTableClass('table_results', 1, 2) | ||
); | ||
$this->assertEquals( | ||
4, | ||
$this->getCellByTableClass('table_results', 1, 5) | ||
); | ||
|
||
// test inline edit button | ||
$this->_testInlineEdit(); | ||
} | ||
|
||
/** | ||
* Test typing a SQL query on Table SQL page and submitting it | ||
* | ||
* @return void | ||
*/ | ||
public function testTableSqlQuery() | ||
{ | ||
$this->navigateTable('test_table'); | ||
|
||
$this->waitForElement('byPartialLinkText', 'SQL')->click(); | ||
$this->waitForElementNotPresent('byId', 'ajax_message_num_1'); | ||
|
||
// Minimum wait | ||
sleep(1); | ||
|
||
// Dynamic wait | ||
$this->waitUntil(function () { | ||
if ($this->byCssSelector('div.CodeMirror')) { | ||
return true; | ||
} | ||
return null; | ||
}, 5000); | ||
$this->typeInTextArea( | ||
'SELECT * FROM `test_table` WHERE `val` NOT IN (2, 3);', | ||
2 | ||
); | ||
$this->byId('button_submit_query')->click(); | ||
$this->waitForElementNotPresent('byId', 'ajax_message_num_1'); | ||
|
||
$this->waitForElement('byCssSelector', 'table.table_results'); | ||
$this->assertEquals( | ||
3, | ||
$this->getCellByTableClass('table_results', 1, 5) | ||
); | ||
$this->assertEquals( | ||
4, | ||
$this->getCellByTableClass('table_results', 2, 5) | ||
); | ||
$this->assertEquals( | ||
4, | ||
$this->getCellByTableClass('table_results', 1, 6) | ||
); | ||
$this->assertEquals( | ||
5, | ||
$this->getCellByTableClass('table_results', 2, 6) | ||
); | ||
|
||
// test inline edit button | ||
$this->_testInlineEdit(); | ||
} | ||
|
||
private function _testInlineEdit() | ||
{ | ||
$this->waitForElement('byCssSelector', 'a.inline_edit_sql')->click(); | ||
// empty current query | ||
$this->typeInTextArea( | ||
'', | ||
3 | ||
); | ||
|
||
// type in next sql query | ||
$this->typeInTextArea( | ||
'SELECT 1', | ||
3 | ||
); | ||
|
||
$this->byId('sql_query_edit_save')->click(); | ||
$this->waitForElementNotPresent('byId', 'ajax_message_num_1'); | ||
|
||
$this->waitForElement('byCssSelector', 'table.table_results'); | ||
$this->assertEquals( | ||
1, | ||
$this->getCellByTableClass('table_results', 1, 1) | ||
); | ||
} | ||
} |