Difference between revisions of "SpecialSelenium.php"

From Organic Design wiki
m
m
Line 35: Line 35:
 
# Extract the tests from the expanded content and  
 
# Extract the tests from the expanded content and  
 
$numTests = preg_match_all(
 
$numTests = preg_match_all(
"|<div class=\"selenium\" id=\"(.+?)\">\\s*(.+?)\\s*</div><!-- selenium end -->|is",
+
"|<div class=\"selenium\" id=\"(.+?)\">\\s*(.+?)\\s*</div><!-- selenium-end -->|is",
 
$text,
 
$text,
 
$matches,
 
$matches,
Line 70: Line 70:
 
# No suite specified, render the main special page and form
 
# No suite specified, render the main special page and form
 
else {
 
else {
global $egSeleniumCategory, $egSeleniumPath, $egResultsUrlPath;
+
global $egSeleniumCategory, $egSeleniumSchdeule, $egSeleniumEnabled, $egSeleniumFailLog,
 +
$egSeleniumPath, $egResultsUrlPath, $wgServer;
 
$this->setHeaders();
 
$this->setHeaders();
 
$title = Title::makeTitle(NS_SPECIAL, 'Selenium');
 
$title = Title::makeTitle(NS_SPECIAL, 'Selenium');
 
+
$ide = "$egSeleniumPath/core/TestRunner.html";
# Render section for running tests manually with a select list of all the suites
 
$wgOut->addWikitext('=='.wfMsg('selenium-runmanual').'==');
 
  
 
# Retrieve suites from Selenium category (only selenium tests should be in this cat)
 
# Retrieve suites from Selenium category (only selenium tests should be in this cat)
Line 84: Line 83:
 
while ($row = $dbr->fetchRow($res)) $suites[] = Title::newFromID($row[0])->getPrefixedText();
 
while ($row = $dbr->fetchRow($res)) $suites[] = Title::newFromID($row[0])->getPrefixedText();
  
 +
# Render section for running tests manually with a select list of all the suites
 +
$wgOut->addWikitext('=='.wfMsg('selenium-runmanual').'==');
 +
$html = "<fieldset><legend>".wfMsg('selenium-select')."</legend><ul>";
 +
foreach ($suites as $suite) {
 +
$path = "$ide?test=".urlencode($title->getLocalURL("suite=$suite"));
 +
$html .= "<li><a href=\"$path\">$suite</a></li>\n";
 +
}
 +
$html .= "</ul></fieldset>";
 +
$wgOut->addHTML($html);
 +
 +
# Manage the automatic test run schedule
 +
$wgOut->addWikitext('=='.wfMsg('selenium-manage').'==');
 +
$schedule = "<b>".array_pop($egSeleniumSchdeule)."</b>";
 +
if (count($egSeleniumSchdeule) > 0) $schedule = "<b>".join("</b>, <b>", $egSeleniumSchdeule)."</b> and $schedule";
 +
$wgOut->addHTML("<fieldset><legend>".wfMsg('selenium-schedule', $schedule)."</legend>");
 
$form  = wfElement('form', array('action' => $title->getLocalURL('action=submit'), 'method' => 'post'), null);
 
$form  = wfElement('form', array('action' => $title->getLocalURL('action=submit'), 'method' => 'post'), null);
$form .= "<fieldset><legend>".wfMsg('selenium-select')."</legend>";
+
foreach ($suites as $suite) {
$form .= "<select name=\"selenium\"><option>".join("</option>\n<option>", $suites)."</option></select>";
+
$path = "$ide?test=".urlencode($title->getLocalURL("suite=$suite"));
$form .= wfElement('input', array('type' => 'submit', value => 'Go'));
+
$form .= wfCheckLabel($suite, "wfEnabledTests[]", $suite, $checked = false)."<br />\n";
$form .= "<br /><br />".wfCheckLabel(wfMsg('selenium-autorun'), 'wfRunAuto' , 'wfRunAuto', $checked = false);
+
}
$form .= '</fieldset></form>';
+
$form .= wfElement('input', array('type' => 'submit', name => 'wpSave', value => 'Save'))."</form><br />";
 
$wgOut->addHTML($form);
 
$wgOut->addHTML($form);
 +
$wgOut->addWikitext(wfMsg('selenium-failinfo', $egSeleniumFailLog));
 +
$wgOut->addHTML("</fieldset>");
 +
 +
# If suites have been enabled or disabled, update their categorisation
 +
if ($wgRequest->getText('wpSave')) {
  
# Render link to run test
+
# Construct the posted checkboxes as a bullet list
$selenium = $wgRequest->getText('selenium');
+
$newList = '';
$path = "$egSeleniumPath/core/TestRunner.html?test=".urlencode($title->getLocalURL("suite=$selenium"));
+
foreach ($egSeleniumEnabled as $suite) $newList .= "*[[$suite]]\n";
if ($wgRequest->getBool('wfRunAuto')) $path .= "&auto=true&resultsUrl=$egResultsUrlPath";
+
$wgOut->addHTML("<fieldset><legend>".wfMsg('selenium-runcore')."</legend><a href=\"$path\">$selenium</a></fieldset>");
+
# Get the current state as an array from $egSeleniumEnabled article content
 
+
$cur = new Article(Title::newFromText($egSeleniumEnabled));
$wgOut->addWikitext('=='.wfMsg('selenium-manage').'==');
+
preg_match_all("|\\*\\[\\[(.+?)\\]\\]|", $cur->getContent(), $matches, PREG_PATTERN_ORDER);
 
+
$cur = $matches[1];
 +
 +
# Find which tests have been added or removed
 +
$add = array();
 +
$del = array();
 +
 +
if (count($add) || count($del)) {
 +
# create a string describing the added and removed members
 +
# render the string in a msg in the form
 +
# update the $egSeleniumEnabled article with the new list using msg as comment
 +
}
 +
}
 +
 +
# Section about creating new tests
 
$wgOut->addWikitext('=='.wfMsg('selenium-create').'==');
 
$wgOut->addWikitext('=='.wfMsg('selenium-create').'==');
 +
$wgOut->addWikitext(wfMsg('selenium-createinfo', "$wgServer$ide"));
  
 
}
 
}
 
}
 
}
 
}
 
}

Revision as of 12:23, 2 August 2008

<?php /**

* Selenium extension
* Template:Php
* See http://www.mediawiki.org/Extension:Selenium for installation and usage details
* See http://www.organicdesign.co.nz/Extension_talk:Selenium.php for development notes and disucssion
* 
* @package MediaWiki
* @subpackage Extensions
* @author Marcus Davy User:Sven
* @copyright © 2007 Marcus Davy
* @licence GNU General Public Licence 2.0 or later
*/

if (!defined('MEDIAWIKI')) die();

class SpecialSelenium extends SpecialPage {

function __construct() { SpecialPage::SpecialPage('Selenium', , true, false, false, false); }

public function execute() { global $wgOut, $wgParser, $wgRequest, $egResultsUrlPath;

# Process suite or test if ?suite=article_name in query string if ($suite = $wgRequest->getText('suite')) {

# Get the content of the suite article and parse it # NOTE: parsing the content results in the head, body, thead, tbody etc being removed, # but it seems that the TestRunner doesn't care and can work with the basic table structure $suiteTitle = Title::newFromText($suite); $suiteArticle = new Article($suiteTitle); $text = $wgParser->parse($suiteArticle->getContent(), $suiteTitle, new ParserOptions(), true, true)->getText();

# Extract the tests from the expanded content and $numTests = preg_match_all(

"|

\\s*(.+?)\\s*

|is",

$text, $matches, PREG_PATTERN_ORDER );

# If any tests were extracted, build content and return it to the client if ($numTests > 0) {

# Re-organise the matched test content into a hash indexed by test name $tests = array(); for ($i = 0; $i < $numTests; $i++) $tests[$matches[1][$i]] = $matches[2][$i];

# If a test is specified, return it from the suite article content in raw HTML Selenium test format if ($test = $wgRequest->getText('test')) { if (array_key_exists($test, $tests)) print $tests[$test]; }

# Or if no test specified, return the whole suite in raw HTML Selenium test-suite format else { $html = " Selenium

\n"; $title = Title::makeTitle(NS_SPECIAL, 'Selenium'); foreach (array_keys($tests) as $test) { $url = $title->getLocalURL("suite=$suite&test=$test"); $html .= "\n"; } print "$html
$suite
$test

"; } } }

# No suite specified, render the main special page and form else { global $egSeleniumCategory, $egSeleniumSchdeule, $egSeleniumEnabled, $egSeleniumFailLog, $egSeleniumPath, $egResultsUrlPath, $wgServer; $this->setHeaders(); $title = Title::makeTitle(NS_SPECIAL, 'Selenium'); $ide = "$egSeleniumPath/core/TestRunner.html";

# Retrieve suites from Selenium category (only selenium tests should be in this cat) $suites = array(); $dbr = &wfGetDB(DB_SLAVE); $cl = $dbr->tableName('categorylinks'); $res = $dbr->select($cl, 'cl_from', "cl_to = '$egSeleniumCategory'", __METHOD__, array('ORDER BY' => 'cl_sortkey')); while ($row = $dbr->fetchRow($res)) $suites[] = Title::newFromID($row[0])->getPrefixedText();

# Render section for running tests manually with a select list of all the suites $wgOut->addWikitext('=='.wfMsg('selenium-runmanual').'==');

$html = "<fieldset><legend>".wfMsg('selenium-select')."</legend>

    "; foreach ($suites as $suite) { $path = "$ide?test=".urlencode($title->getLocalURL("suite=$suite")); $html .= "
  • <a href=\"$path\">$suite</a>
  • \n";

    }

    $html .= "

</fieldset>";

$wgOut->addHTML($html);

# Manage the automatic test run schedule $wgOut->addWikitext('=='.wfMsg('selenium-manage').'=='); $schedule = "".array_pop($egSeleniumSchdeule).""; if (count($egSeleniumSchdeule) > 0) $schedule = "".join(", ", $egSeleniumSchdeule)." and $schedule"; $wgOut->addHTML("<fieldset><legend>".wfMsg('selenium-schedule', $schedule)."</legend>"); $form = wfElement('form', array('action' => $title->getLocalURL('action=submit'), 'method' => 'post'), null); foreach ($suites as $suite) { $path = "$ide?test=".urlencode($title->getLocalURL("suite=$suite")); $form .= wfCheckLabel($suite, "wfEnabledTests[]", $suite, $checked = false)."
\n"; } $form .= wfElement('input', array('type' => 'submit', name => 'wpSave', value => 'Save'))."</form>
"; $wgOut->addHTML($form); $wgOut->addWikitext(wfMsg('selenium-failinfo', $egSeleniumFailLog)); $wgOut->addHTML("</fieldset>");

# If suites have been enabled or disabled, update their categorisation if ($wgRequest->getText('wpSave')) {

# Construct the posted checkboxes as a bullet list $newList = ; foreach ($egSeleniumEnabled as $suite) $newList .= "*$suite\n";

# Get the current state as an array from $egSeleniumEnabled article content $cur = new Article(Title::newFromText($egSeleniumEnabled)); preg_match_all("|\\*\\[\\[(.+?)\\]\\]|", $cur->getContent(), $matches, PREG_PATTERN_ORDER); $cur = $matches[1];

# Find which tests have been added or removed $add = array(); $del = array();

if (count($add) || count($del)) { # create a string describing the added and removed members # render the string in a msg in the form # update the $egSeleniumEnabled article with the new list using msg as comment } }

# Section about creating new tests $wgOut->addWikitext('=='.wfMsg('selenium-create').'=='); $wgOut->addWikitext(wfMsg('selenium-createinfo', "$wgServer$ide"));

} } }