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);' ); $this->dbQuery( 'SET GLOBAL event_scheduler="ON"' ); $this->login(); $this->navigateDatabase($this->database_name); // Let the Database page load $this->waitAjax(); $this->expandMore(); } /** * Tear Down function for test cases */ protected function tearDown(): void { if (isset($this->_mysqli)) { $this->dbQuery('SET GLOBAL event_scheduler="OFF"'); } parent::tearDown(); } /** * Creates procedure for tests * * @return void */ private function _eventSQL() { $start = date('Y-m-d H:i:s', strtotime('-1 day')); $end = date('Y-m-d H:i:s', strtotime('+1 day')); $this->dbQuery( 'CREATE EVENT `test_event` ON SCHEDULE EVERY 1 MINUTE_SECOND STARTS ' . "'" . $start . "' ENDS '" . $end . "' ON COMPLETION NOT PRESERVE ENABLE " . 'DO UPDATE `' . $this->database_name . '`.`test_table` SET val = val + 1' ); } /** * Create an event * * @return void * * @group large */ public function testAddEvent() { $this->waitForElement('partialLinkText', 'Events')->click(); $this->waitAjax(); $this->waitForElement('partialLinkText', 'Add event')->click(); $this->waitAjax(); $this->waitForElement('className', 'rte_form'); $this->selectByLabel($this->byName('item_type'), 'RECURRING'); $this->byName('item_name')->sendKeys('test_event'); $this->selectByLabel( $this->byName('item_interval_field'), 'MINUTE_SECOND' ); $this->byName('item_starts')->click()->clear()->sendKeys(date('Y-m-d', strtotime('-1 day')) . ' 00:00:00'); $this->byName('item_ends')->click()->clear()->sendKeys(date('Y-m-d', strtotime('+1 day')) . ' 00:00:00'); $this->waitForElement('name', 'item_interval_value')->click()->clear()->sendKeys('1'); $proc = 'UPDATE ' . $this->database_name . '.`test_table` SET val=val+1'; $this->typeInTextArea($proc); $this->byXPath("//button[contains(., 'Go')]")->click(); $this->waitForElement( 'xpath', "//div[@class='alert alert-success' and contains(., " . "'Event `test_event` has been created')]" ); $this->waitForElementNotPresent( 'xpath', '//div[@id=\'alertLabel\' and not(contains(@style,\'display: none;\'))]' ); // Refresh the page $this->webDriver->navigate()->refresh(); $this->assertTrue( $this->isElementPresent( 'xpath', "//td[contains(., 'test_event')]" ) ); $result = $this->dbQuery( "SHOW EVENTS WHERE Db='" . $this->database_name . "' AND Name='test_event'" ); $this->assertEquals(1, $result->num_rows); sleep(2); $result = $this->dbQuery( 'SELECT val FROM `' . $this->database_name . '`.`test_table`' ); $row = $result->fetch_assoc(); $this->assertGreaterThan(2, $row['val']); } /** * Test for editing events * * @return void * * @group large */ public function testEditEvents() { $this->_eventSQL(); $this->waitForElement('partialLinkText', 'Events')->click(); $this->waitAjax(); $this->waitForElement( 'xpath', "//legend[contains(., 'Events')]" ); $this->byPartialLinkText('Edit')->click(); $this->waitForElement('className', 'rte_form'); $this->byName('item_interval_value')->clear(); $this->byName('item_interval_value')->sendKeys('2'); $this->byXPath("//button[contains(., 'Go')]")->click(); $this->waitForElement( 'xpath', "//div[@class='alert alert-success' and contains(., " . "'Event `test_event` has been modified')]" ); sleep(2); $result = $this->dbQuery( 'SELECT val FROM `' . $this->database_name . '`.`test_table`' ); $row = $result->fetch_assoc(); $this->assertGreaterThan(2, $row['val']); } /** * Test for dropping event * * @return void * * @group large */ public function testDropEvent() { $this->_eventSQL(); $this->waitForElement('partialLinkText', 'Events')->click(); $this->waitAjax(); $this->waitForElement( 'xpath', "//legend[contains(., 'Events')]" ); $this->byPartialLinkText('Drop')->click(); $this->waitForElement( 'className', 'submitOK' )->click(); $this->waitAjaxMessage(); $result = $this->dbQuery( "SHOW EVENTS WHERE Db='" . $this->database_name . "' AND Name='test_event'" ); $this->assertEquals(0, $result->num_rows); } }