MediaWiki  REL1_20
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         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                 self::$users = array(
00022                         'sysop' => new TestUser(
00023                                 'Apitestsysop',
00024                                 'Api Test Sysop',
00025                                 '[email protected]',
00026                                 array( 'sysop' )
00027                         ),
00028                         'uploader' => new TestUser(
00029                                 'Apitestuser',
00030                                 'Api Test User',
00031                                 '[email protected]',
00032                                 array()
00033                         )
00034                 );
00035 
00036                 $wgUser = self::$users['sysop']->user;
00037 
00038                 $this->apiContext = new ApiTestContext();
00039 
00040         }
00041 
00042         protected function doApiRequest( Array $params, Array $session = null, $appendModule = false, User $user = null ) {
00043                 global $wgRequest, $wgUser;
00044 
00045                 if ( is_null( $session ) ) {
00046                         # re-use existing global session by default
00047                         $session = $wgRequest->getSessionArray();
00048                 }
00049 
00050                 # set up global environment
00051                 if ( $user ) {
00052                         $wgUser = $user;
00053                 }
00054 
00055                 $wgRequest = new FauxRequest( $params, true, $session );
00056                 RequestContext::getMain()->setRequest( $wgRequest );
00057 
00058                 # set up local environment
00059                 $context = $this->apiContext->newTestContext( $wgRequest, $wgUser );
00060 
00061                 $module = new ApiMain( $context, true );
00062 
00063                 # run it!
00064                 $module->execute();
00065 
00066                 # construct result
00067                 $results = array(
00068                         $module->getResultData(),
00069                         $context->getRequest(),
00070                         $context->getRequest()->getSessionArray()
00071                 );
00072                 if( $appendModule ) {
00073                         $results[] = $module;
00074                 }
00075 
00076                 return $results;
00077         }
00078 
00087         protected function doApiRequestWithToken( Array $params, Array $session = null, User $user = null ) {
00088                 global $wgRequest;
00089 
00090                 if ( $session === null ) {
00091                         $session = $wgRequest->getSessionArray();
00092                 }
00093 
00094                 if ( $session['wsToken'] ) {
00095                         // add edit token to fake session
00096                         $session['wsEditToken'] = $session['wsToken'];
00097                         // add token to request parameters
00098                         $params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX;
00099                         return $this->doApiRequest( $params, $session, false, $user );
00100                 } else {
00101                         throw new Exception( "request data not in right format" );
00102                 }
00103         }
00104 
00105         protected function doLogin() {
00106                 $data = $this->doApiRequest( array(
00107                         'action' => 'login',
00108                         'lgname' => self::$users['sysop']->username,
00109                         'lgpassword' => self::$users['sysop']->password ) );
00110 
00111                 $token = $data[0]['login']['token'];
00112 
00113                 $data = $this->doApiRequest( array(
00114                         'action' => 'login',
00115                         'lgtoken' => $token,
00116                         'lgname' => self::$users['sysop']->username,
00117                         'lgpassword' => self::$users['sysop']->password
00118                         ), $data[2] );
00119 
00120                 return $data;
00121         }
00122 
00123         protected function getTokenList( $user, $session = null ) {
00124                 $data = $this->doApiRequest( array(
00125                         'action' => 'query',
00126                         'titles' => 'Main Page',
00127                         'intoken' => 'edit|delete|protect|move|block|unblock|watch',
00128                         'prop' => 'info' ), $session, false, $user->user );
00129                 return $data;
00130         }
00131 }
00132 
00133 class UserWrapper {
00134         public $userName, $password, $user;
00135 
00136         public function __construct( $userName, $password, $group = '' ) {
00137                 $this->userName = $userName;
00138                 $this->password = $password;
00139 
00140                 $this->user = User::newFromName( $this->userName );
00141                 if ( !$this->user->getID() ) {
00142                         $this->user = User::createNew( $this->userName, array(
00143                                 "email" => "[email protected]",
00144                                 "real_name" => "Test User" ) );
00145                 }
00146                 $this->user->setPassword( $this->password );
00147 
00148                 if ( $group !== '' ) {
00149                         $this->user->addGroup( $group );
00150                 }
00151                 $this->user->saveSettings();
00152         }
00153 }
00154 
00155 class MockApi extends ApiBase {
00156         public function execute() { }
00157         public function getVersion() { }
00158 
00159         public function __construct() { }
00160 
00161         public function getAllowedParams() {
00162                 return array(
00163                         'filename' => null,
00164                         'enablechunks' => false,
00165                         'sessionkey' => null,
00166                 );
00167         }
00168 }
00169 
00170 class ApiTestContext extends RequestContext {
00171 
00179         public function newTestContext( WebRequest $request, User $user = null ) {
00180                 $context = new DerivativeContext( $this );
00181                 $context->setRequest( $request );
00182                 if ( $user !== null ) {
00183                         $context->setUser( $user );
00184                 }
00185                 return $context;
00186         }
00187 }