summaryrefslogtreecommitdiff
path: root/tests/phpunit/includes/specials
diff options
context:
space:
mode:
Diffstat (limited to 'tests/phpunit/includes/specials')
-rw-r--r--tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php79
-rw-r--r--tests/phpunit/includes/specials/SpecialRecentchangesTest.php (renamed from tests/phpunit/includes/specials/SpecialRecentchanges.php)16
-rw-r--r--tests/phpunit/includes/specials/SpecialSearchTest.php108
3 files changed, 194 insertions, 9 deletions
diff --git a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
new file mode 100644
index 00000000..a33c7b68
--- /dev/null
+++ b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Test class to run the query of most of all our special pages
+ *
+ * Copyright © 2011, Antoine Musso
+ *
+ * @author Antoine Musso
+ * @group Database
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( 1 );
+}
+
+global $IP;
+require_once "$IP/includes/QueryPage.php"; // Needed to populate $wgQueryPages
+
+class QueryAllSpecialPagesTest extends MediaWikiTestCase {
+
+ /** List query pages that can not be tested automatically */
+ protected $manualTest = array(
+ 'LinkSearchPage'
+ );
+
+ /**
+ * Pages whose query use the same DB table more than once.
+ * This is used to skip testing those pages when run against a MySQL backend
+ * which does not support reopening a temporary table. See upstream bug:
+ * http://bugs.mysql.com/bug.php?id=10327
+ */
+ protected $reopensTempTable = array(
+ 'BrokenRedirects',
+ );
+
+ /**
+ * Initialize all query page objects
+ */
+ function __construct() {
+ parent::__construct();
+
+ global $wgQueryPages;
+ foreach( $wgQueryPages as $page ) {
+ $class = $page[0];
+ if( ! in_array( $class, $this->manualTest ) ) {
+ $this->queryPages[$class] = new $class;
+ }
+ }
+ }
+
+ /**
+ * Test SQL for each of our QueryPages objects
+ * @group Database
+ */
+ function testQuerypageSqlQuery() {
+ global $wgDBtype;
+
+ foreach( $this->queryPages as $page ) {
+
+ // With MySQL, skips special pages reopening a temporary table
+ // See http://bugs.mysql.com/bug.php?id=10327
+ if(
+ $wgDBtype === 'mysql'
+ && in_array( $page->getName(), $this->reopensTempTable )
+ ) {
+ $this->markTestSkipped( "SQL query for page {$page->getName()} can not be tested on MySQL backend (it reopens a temporary table)" );
+ continue;
+ }
+
+ $msg = "SQL query for page {$page->getName()} should give a result wrapper object" ;
+
+ $result = $page->reallyDoQuery( 50 );
+ if( $result instanceof ResultWrapper ) {
+ $this->assertTrue( true, $msg );
+ } else {
+ $this->assertFalse( false, $msg );
+ }
+ }
+ }
+}
diff --git a/tests/phpunit/includes/specials/SpecialRecentchanges.php b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
index a98e7c1a..2e4f4b09 100644
--- a/tests/phpunit/includes/specials/SpecialRecentchanges.php
+++ b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
@@ -2,9 +2,10 @@
/**
* Test class for SpecialRecentchanges class
*
- * Copyright © 2011, Ashar Voultoiz
+ * Copyright © 2011, Antoine Musso
*
- * @author Ashar Voultoiz
+ * @author Antoine Musso
+ * @group Database
*/
class SpecialRecentchangesTest extends MediaWikiTestCase {
@@ -18,13 +19,12 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
/** helper to test SpecialRecentchanges::buildMainQueryConds() */
private function assertConditions( $expected, $requestOptions = null, $message = '' ) {
- global $wgRequest;
- $savedGlobal = $wgRequest;
+ $context = new RequestContext;
+ $context->setRequest( new FauxRequest( $requestOptions ) );
- # Initialize a WebRequest object ...
- $wgRequest = new FauxRequest( $requestOptions );
- # ... then setup the rc object (which use wgRequest internally)
+ # setup the rc object
$this->rc = new SpecialRecentChanges();
+ $this->rc->setContext( $context );
$formOptions = $this->rc->setup( null );
# Filter out rc_timestamp conditions which depends on the test runtime
@@ -40,8 +40,6 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
$queryConditions,
$message
);
-
- $wgRequest = $savedGlobal;
}
/** return false if condition begin with 'rc_timestamp ' */
diff --git a/tests/phpunit/includes/specials/SpecialSearchTest.php b/tests/phpunit/includes/specials/SpecialSearchTest.php
new file mode 100644
index 00000000..ea9d5533
--- /dev/null
+++ b/tests/phpunit/includes/specials/SpecialSearchTest.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Test class for SpecialSearch class
+ * Copyright © 2012, Antoine Musso
+ *
+ * @author Antoine Musso
+ * @group Database
+ */
+
+class SpecialSearchTest extends MediaWikiTestCase {
+ private $search;
+
+ function setUp() { }
+ function tearDown() { }
+
+ /**
+ * @covers SpecialSearch::load
+ * @dataProvider provideSearchOptionsTests
+ * @param $requested Array Request parameters. For example array( 'ns5' => true, 'ns6' => true). NULL to use default options.
+ * @param $userOptions Array User options to test with. For example array('searchNs5' => 1 );. NULL to use default options.
+ * @param $expectedProfile An expected search profile name
+ * @param $expectedNs Array Expected namespaces
+ */
+ function testProfileAndNamespaceLoading(
+ $requested, $userOptions, $expectedProfile, $expectedNS,
+ $message = 'Profile name and namespaces mismatches!'
+ ) {
+ $context = new RequestContext;
+ $context->setUser(
+ $this->newUserWithSearchNS( $userOptions )
+ );
+ /*
+ $context->setRequest( new FauxRequest( array(
+ 'ns5'=>true,
+ 'ns6'=>true,
+ ) ));
+ */
+ $context->setRequest( new FauxRequest( $requested ));
+ $search = new SpecialSearch();
+ $search->setContext( $context );
+ $search->load();
+
+ /**
+ * Verify profile name and namespace in the same assertion to make
+ * sure we will be able to fully compare the above code. PHPUnit stop
+ * after an assertion fail.
+ */
+ $this->assertEquals(
+ array( /** Expected: */
+ 'ProfileName' => $expectedProfile,
+ 'Namespaces' => $expectedNS,
+ )
+ , array( /** Actual: */
+ 'ProfileName' => $search->getProfile(),
+ 'Namespaces' => $search->getNamespaces(),
+ )
+ , $message
+ );
+
+ }
+
+ function provideSearchOptionsTests() {
+ $defaultNS = SearchEngine::defaultNamespaces();
+ $EMPTY_REQUEST = array();
+ $NO_USER_PREF = null;
+
+ return array(
+ /**
+ * Parameters:
+ * <Web Request>, <User options>
+ * Followed by expected values:
+ * <ProfileName>, <NSList>
+ * Then an optional message.
+ */
+ array(
+ $EMPTY_REQUEST, $NO_USER_PREF,
+ 'default', $defaultNS,
+ 'Bug 33270: No request nor user preferences should give default profile'
+ ),
+ array(
+ array( 'ns5' => 1 ), $NO_USER_PREF,
+ 'advanced', array( 5),
+ 'Web request with specific NS should override user preference'
+ ),
+ array(
+ $EMPTY_REQUEST, array( 'searchNs2' => 1, 'searchNs14' => 1 ),
+ 'advanced', array( 2, 14 ),
+ 'Bug 33583: search with no option should honor User search preferences'
+ ),
+ );
+ }
+
+ /**
+ * Helper to create a new User object with given options
+ * User remains anonymous though
+ */
+ function newUserWithSearchNS( $opt = null ) {
+ $u = User::newFromId(0);
+ if( $opt === null ) {
+ return $u;
+ }
+ foreach($opt as $name => $value) {
+ $u->setOption( $name, $value );
+ }
+ return $u;
+ }
+}
+