Difference between revisions of "SpecialSelenium.php"

From Organic Design wiki
m
({{legacy}})
 
(9 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<?php
+
{{legacy}}
 +
<php><?php
 
/**
 
/**
 
  * Selenium extension
 
  * Selenium extension
  * {{php}}
+
  *
 
  * See http://www.mediawiki.org/Extension:Selenium for installation and usage details
 
  * 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
 
  * See http://www.organicdesign.co.nz/Extension_talk:Selenium.php for development notes and disucssion
Line 21: Line 22:
 
   
 
   
 
public function execute() {
 
public function execute() {
global $wgOut, $wgParser, $wgRequest, $egResultsUrlPath;
+
global $wgOut, $wgParser, $wgRequest, $wgServer,
 +
$egSeleniumCategory, $egSeleniumSchdeule, $egSeleniumLog, $egSeleniumPath, $egResultsUrlPath;
  
 
# Process suite or test if ?suite=article_name in query string
 
# Process suite or test if ?suite=article_name in query string
Line 27: Line 29:
  
 
# Get the content of the suite article and parse it
 
# 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);
 
$suiteTitle = Title::newFromText($suite);
 
$suiteArticle = new Article($suiteTitle);
 
$suiteArticle = new Article($suiteTitle);
Line 33: Line 37:
 
# 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 43: Line 47:
  
 
# Re-organise the matched test content into a hash indexed by test name
 
# 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];
 
for ($i = 0; $i < $numTests; $i++) $tests[$matches[1][$i]] = $matches[2][$i];
  
Line 65: Line 70:
 
}
 
}
  
# No suite or test specified, render the main special page and form
+
# No suite specified, render the main special page and form
 
else {
 
else {
global $egSeleniumCategory, $egSeleniumPath, $egResultsUrlPath;
 
 
$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)
 
$suites = array();
 
$suites = array();
 
$dbr = &wfGetDB(DB_SLAVE);
 
$dbr = &wfGetDB(DB_SLAVE);
 +
$cat = Title::makeTitle(NS_CATEGORY, $egSeleniumCategory)->getDBkey();
 
$cl  = $dbr->tableName('categorylinks');
 
$cl  = $dbr->tableName('categorylinks');
$res = $dbr->select($cl, 'cl_from', "cl_to = '$egSeleniumCategory'", __METHOD__, array('ORDER BY' => 'cl_sortkey'));
+
$res = $dbr->select($cl, 'cl_from', "cl_to = '$cat'", __METHOD__, array('ORDER BY' => 'cl_sortkey'));
 
while ($row = $dbr->fetchRow($res)) $suites[] = Title::newFromID($row[0])->getPrefixedText();
 
while ($row = $dbr->fetchRow($res)) $suites[] = Title::newFromID($row[0])->getPrefixedText();
  
$form  = wfElement('form', array('action' => $title->getLocalURL('action=submit'), 'method' => 'post'), null);
+
# Split schedule into times and enabled suites
$form .= "<fieldset><legend>".wfMsg('selenium-select')."</legend>";
+
$schedule = array();
$form .= "<select name=\"selenium\"><option>".join("</option>\n<option>", $suites)."</option></select>";
+
$enabled = array();
$form .=  wfElement('input', array('type' => 'submit', value => 'Go'));
+
foreach ($egSeleniumSchdeule as $k => $v) is_numeric($k) ? $schedule[] = $v : $enabled[$k] = $v;
$form .= "<br /><br />".wfCheckLabel(wfMsg('selenium-autorun'), 'wfRunAuto' , 'wfRunAuto', $checked = false);
+
$desc = "<b>".array_pop($schedule)."</b>";
$form .= '</fieldset></form>';
+
if (count($schedule) > 0) $desc = "<b>".join("</b>, <b>", $schedule)."</b> and $desc";
$wgOut->addHTML($form);
 
 
 
# Render link to run test
 
$selenium = $wgRequest->getText('selenium');
 
$path = "$egSeleniumPath/core/TestRunner.html?test=".urlencode($title->getLocalURL("suite=$selenium"));
 
if ($wgRequest->getBool('wfRunAuto')) $path .= "&auto=true&resultsUrl=$egResultsUrlPath";
 
$wgOut->addHTML("<fieldset><legend>".wfMsg('selenium-runcore')."</legend><a href=\"$path\">$selenium</a></fieldset>");
 
 
 
$wgOut->addWikitext('=='.wfMsg('selenium-manage').'==');
 
 
 
$wgOut->addWikitext('=='.wfMsg('selenium-create').'==');
 
  
 +
# Render table of all available suites and their information
 +
$thead =  "{|class=\"selenium-special\" border\n";
 +
$thead .= "!Test suite!!".wfMsg('selenium-schedule', $desc);
 +
$thead .= "!!".wfMsg('selenium-last')."!!".wfMsg('selenium-run')."!!\n";
 +
$tbody = '';
 +
foreach ($suites as $suite) {
 +
$tbody .= "|-\n|valign=top|[[$suite]]\n|\n";
 +
if (array_key_exists($suite, $enabled)) {
 +
foreach ($enabled[$suite] as $domain) $tbody .= "*$domain\n";
 +
} else $tbody .= "-\n";
 +
$tbody .= "|valign=top|last log item\n";
 +
$tbody .= "|valign=top|[$wgServer$ide?test=".urlencode($title->getLocalURL("suite=$suite"));
 +
$tbody .= " ".wfMsg('selenium-run')."]\n";
 +
}
 +
$wgOut->addWikitext("$thead$tbody|}\n".wfMsg('selenium-loginfo', $egSeleniumLog));
 
}
 
}
 
}
 
}
 
}
 
}
 +
</php>

Latest revision as of 14:20, 22 October 2014

Legacy.svg Legacy: This article describes a concept that has been superseded in the course of ongoing development on the Organic Design wiki. Please do not develop this any further or base work on this concept, this is only useful for a historic record of work done. You may find a link to the currently used concept or function in this article, if not you can contact the author to find out what has taken the place of this legacy item.

<php><?php /**

* Selenium extension
*
* 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, $wgServer, $egSeleniumCategory, $egSeleniumSchdeule, $egSeleniumLog, $egSeleniumPath, $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 { $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); $cat = Title::makeTitle(NS_CATEGORY, $egSeleniumCategory)->getDBkey(); $cl = $dbr->tableName('categorylinks'); $res = $dbr->select($cl, 'cl_from', "cl_to = '$cat'", __METHOD__, array('ORDER BY' => 'cl_sortkey')); while ($row = $dbr->fetchRow($res)) $suites[] = Title::newFromID($row[0])->getPrefixedText();

# Split schedule into times and enabled suites $schedule = array(); $enabled = array(); foreach ($egSeleniumSchdeule as $k => $v) is_numeric($k) ? $schedule[] = $v : $enabled[$k] = $v; $desc = "".array_pop($schedule).""; if (count($schedule) > 0) $desc = "".join(", ", $schedule)." and $desc";

# Render table of all available suites and their information $thead = "{|class=\"selenium-special\" border\n"; $thead .= "!Test suite!!".wfMsg('selenium-schedule', $desc); $thead .= "!!".wfMsg('selenium-last')."!!".wfMsg('selenium-run')."!!\n"; $tbody = ; foreach ($suites as $suite) { $tbody .= "|-\n|valign=top|$suite\n|\n"; if (array_key_exists($suite, $enabled)) { foreach ($enabled[$suite] as $domain) $tbody .= "*$domain\n"; } else $tbody .= "-\n"; $tbody .= "|valign=top|last log item\n"; $tbody .= "|valign=top|[$wgServer$ide?test=".urlencode($title->getLocalURL("suite=$suite")); $tbody .= " ".wfMsg('selenium-run')."]\n"; } $wgOut->addWikitext("$thead$tbody|}\n".wfMsg('selenium-loginfo', $egSeleniumLog)); } } } </php>