MediaWiki
master
|
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 }