MediaWiki  master
ApiTestCase.php
Go to the documentation of this file.
00001 <?php 
00002 
00003 abstract class ApiTestCase extends MediaWikiLangTestCase {
00004         protected static $apiUrl;
00005 
00009         protected $apiContext;
00010 
00011         protected function setUp() {
00012                 global $wgContLang, $wgAuth, $wgMemc, $wgRequest, $wgUser, $wgServer;
00013 
00014                 parent::setUp();
00015                 self::$apiUrl = $wgServer . wfScript( 'api' );
00016                 $wgMemc = new EmptyBagOStuff();
00017                 $wgContLang = Language::factory( 'en' );
00018                 $wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' );
00019                 $wgRequest = new FauxRequest( array() );
00020 
00021                 ApiQueryInfo::resetTokenCache(); // tokens are invalid because we cleared the session
00022 
00023                 self::$users = array(
00024                         'sysop' => new TestUser(
00025                                 'Apitestsysop',
00026                                 'Api Test Sysop',
00027                                 '[email protected]',
00028                                 array( 'sysop' )
00029                         ),
00030                         'uploader' => new TestUser(
00031                                 'Apitestuser',
00032                                 'Api Test User',
00033                                 '[email protected]',
00034                                 array()
00035                         )
00036                 );
00037 
00038                 $wgUser = self::$users['sysop']->user;
00039 
00040                 $this->apiContext = new ApiTestContext();
00041 
00042         }
00043 
00060         protected function doApiRequest( array $params, array $session = null, $appendModule = false, User $user = null ) {
00061                 global $wgRequest, $wgUser;
00062 
00063                 if ( is_null( $session ) ) {
00064                         // re-use existing global session by default
00065                         $session = $wgRequest->getSessionArray();
00066                 }
00067 
00068                 // set up global environment
00069                 if ( $user ) {
00070                         $wgUser = $user;
00071                 }
00072 
00073                 $wgRequest = new FauxRequest( $params, true, $session );
00074                 RequestContext::getMain()->setRequest( $wgRequest );
00075 
00076                 // set up local environment
00077                 $context = $this->apiContext->newTestContext( $wgRequest, $wgUser );
00078 
00079                 $module = new ApiMain( $context, true );
00080 
00081                 // run it!
00082                 $module->execute();
00083 
00084                 // construct result
00085                 $results = array(
00086                         $module->getResultData(),
00087                         $context->getRequest(),
00088                         $context->getRequest()->getSessionArray()
00089                 );
00090 
00091                 if ( $appendModule ) {
00092                         $results[] = $module;
00093                 }
00094 
00095                 return $results;
00096         }
00097 
00106         protected function doApiRequestWithToken( array $params, array $session = null, User $user = null ) {
00107                 global $wgRequest;
00108 
00109                 if ( $session === null ) {
00110                         $session = $wgRequest->getSessionArray();
00111                 }
00112 
00113                 if ( $session['wsToken'] ) {
00114                         // add edit token to fake session
00115                         $session['wsEditToken'] = $session['wsToken'];
00116                         // add token to request parameters
00117                         $params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX;
00118                         return $this->doApiRequest( $params, $session, false, $user );
00119                 } else {
00120                         throw new Exception( "request data not in right format" );
00121                 }
00122         }
00123 
00124         protected function doLogin() {
00125                 $data = $this->doApiRequest( array(
00126                         'action' => 'login',
00127                         'lgname' => self::$users['sysop']->username,
00128                         'lgpassword' => self::$users['sysop']->password ) );
00129 
00130                 $token = $data[0]['login']['token'];
00131 
00132                 $data = $this->doApiRequest( array(
00133                         'action' => 'login',
00134                         'lgtoken' => $token,
00135                         'lgname' => self::$users['sysop']->username,
00136                         'lgpassword' => self::$users['sysop']->password
00137                         ), $data[2] );
00138 
00139                 return $data;
00140         }
00141 
00142         protected function getTokenList( $user, $session = null ) {
00143                 $data = $this->doApiRequest( array(
00144                         'action' => 'query',
00145                         'titles' => 'Main Page',
00146                         'intoken' => 'edit|delete|protect|move|block|unblock|watch',
00147                         'prop' => 'info' ), $session, false, $user->user );
00148                 return $data;
00149         }
00150 }
00151 
00152 class UserWrapper {
00153         public $userName, $password, $user;
00154 
00155         public function __construct( $userName, $password, $group = '' ) {
00156                 $this->userName = $userName;
00157                 $this->password = $password;
00158 
00159                 $this->user = User::newFromName( $this->userName );
00160                 if ( !$this->user->getID() ) {
00161                         $this->user = User::createNew( $this->userName, array(
00162                                 "email" => "[email protected]",
00163                                 "real_name" => "Test User" ) );
00164                 }
00165                 $this->user->setPassword( $this->password );
00166 
00167                 if ( $group !== '' ) {
00168                         $this->user->addGroup( $group );
00169                 }
00170                 $this->user->saveSettings();
00171         }
00172 }
00173 
00174 class MockApi extends ApiBase {
00175         public function execute() { }
00176         public function getVersion() { }
00177 
00178         public function __construct() { }
00179 
00180         public function getAllowedParams() {
00181                 return array(
00182                         'filename' => null,
00183                         'enablechunks' => false,
00184                         'sessionkey' => null,
00185                 );
00186         }
00187 }
00188 
00189 class ApiTestContext extends RequestContext {
00190 
00198         public function newTestContext( WebRequest $request, User $user = null ) {
00199                 $context = new DerivativeContext( $this );
00200                 $context->setRequest( $request );
00201                 if ( $user !== null ) {
00202                         $context->setUser( $user );
00203                 }
00204                 return $context;
00205         }
00206 }