Personal tools

SpecialSelenium.php

From OrganicDesign Wiki

Jump to: navigation, search
<?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 [http://www.organicdesign.co.nz/User:Sven 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(
				"|<div class=\"selenium\" id=\"(.+?)\">\\s*(.+?)\\s*</div><!-- selenium-end -->|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 = "<html><head><meta content=\"text/html; charset=ISO-8859-1\" http-equiv=\"content-type\">
						<title>Selenium</title></head><body><table cellpadding=\"1\" cellspacing=\"1\" border=\"1\">
						<tbody><tr><td><b>$suite</b></td></tr>\n";
					$title = Title::makeTitle(NS_SPECIAL, 'Selenium');
					foreach (array_keys($tests) as $test) {
						$url = $title->getLocalURL("suite=$suite&test=$test");
						$html .= "<tr><td><a href=\"$url\">$test</a></td></tr>\n";
					}
					print "$html</tbody></table></body></html>";
				}
			}
		}
 
		# 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 = "<b>".array_pop($schedule)."</b>";
			if (count($schedule) > 0) $desc = "<b>".join("</b>, <b>", $schedule)."</b> 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));
		}
	}
}

The GNU Project Debian Linux Ubuntu Linux Wikipedia online encycopedia MediaWiki