MediaWiki
REL1_21
|
00001 <?php 00002 00003 abstract class ApiTestCase extends MediaWikiLangTestCase { 00004 protected static $apiUrl; 00005 00009 protected $apiContext; 00010 00011 protected function setUp() { 00012 global $wgServer; 00013 00014 parent::setUp(); 00015 self::$apiUrl = $wgServer . wfScript( 'api' ); 00016 00017 ApiQueryInfo::resetTokenCache(); // tokens are invalid because we cleared the session 00018 00019 self::$users = array( 00020 'sysop' => new TestUser( 00021 'Apitestsysop', 00022 'Api Test Sysop', 00023 '[email protected]', 00024 array( 'sysop' ) 00025 ), 00026 'uploader' => new TestUser( 00027 'Apitestuser', 00028 'Api Test User', 00029 '[email protected]', 00030 array() 00031 ) 00032 ); 00033 00034 $this->setMwGlobals( array( 00035 'wgMemc' => new EmptyBagOStuff(), 00036 'wgAuth' => new StubObject( 'wgAuth', 'AuthPlugin' ), 00037 'wgRequest' => new FauxRequest( array() ), 00038 'wgUser' => self::$users['sysop']->user, 00039 ) ); 00040 00041 $this->apiContext = new ApiTestContext(); 00042 } 00043 00052 protected function editPage( $pageName, $text, $summary = '', $defaultNs = NS_MAIN ) { 00053 $title = Title::newFromText( $pageName, $defaultNs ); 00054 $page = WikiPage::factory( $title ); 00055 return $page->doEditContent( ContentHandler::makeContent( $text, $title ), $summary ); 00056 } 00057 00074 protected function doApiRequest( array $params, array $session = null, $appendModule = false, User $user = null ) { 00075 global $wgRequest, $wgUser; 00076 00077 if ( is_null( $session ) ) { 00078 // re-use existing global session by default 00079 $session = $wgRequest->getSessionArray(); 00080 } 00081 00082 // set up global environment 00083 if ( $user ) { 00084 $wgUser = $user; 00085 } 00086 00087 $wgRequest = new FauxRequest( $params, true, $session ); 00088 RequestContext::getMain()->setRequest( $wgRequest ); 00089 00090 // set up local environment 00091 $context = $this->apiContext->newTestContext( $wgRequest, $wgUser ); 00092 00093 $module = new ApiMain( $context, true ); 00094 00095 // run it! 00096 $module->execute(); 00097 00098 // construct result 00099 $results = array( 00100 $module->getResultData(), 00101 $context->getRequest(), 00102 $context->getRequest()->getSessionArray() 00103 ); 00104 00105 if ( $appendModule ) { 00106 $results[] = $module; 00107 } 00108 00109 return $results; 00110 } 00111 00122 protected function doApiRequestWithToken( array $params, array $session = null, User $user = null ) { 00123 global $wgRequest; 00124 00125 if ( $session === null ) { 00126 $session = $wgRequest->getSessionArray(); 00127 } 00128 00129 if ( $session['wsToken'] ) { 00130 // add edit token to fake session 00131 $session['wsEditToken'] = $session['wsToken']; 00132 // add token to request parameters 00133 $params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX; 00134 return $this->doApiRequest( $params, $session, false, $user ); 00135 } else { 00136 throw new Exception( "request data not in right format" ); 00137 } 00138 } 00139 00140 protected function doLogin() { 00141 $data = $this->doApiRequest( array( 00142 'action' => 'login', 00143 'lgname' => self::$users['sysop']->username, 00144 'lgpassword' => self::$users['sysop']->password ) ); 00145 00146 $token = $data[0]['login']['token']; 00147 00148 $data = $this->doApiRequest( 00149 array( 00150 'action' => 'login', 00151 'lgtoken' => $token, 00152 'lgname' => self::$users['sysop']->username, 00153 'lgpassword' => self::$users['sysop']->password, 00154 ), 00155 $data[2] 00156 ); 00157 00158 return $data; 00159 } 00160 00161 protected function getTokenList( $user, $session = null ) { 00162 $data = $this->doApiRequest( array( 00163 'action' => 'query', 00164 'titles' => 'Main Page', 00165 'intoken' => 'edit|delete|protect|move|block|unblock|watch', 00166 'prop' => 'info' ), $session, false, $user->user ); 00167 return $data; 00168 } 00169 00170 public function testApiTestGroup() { 00171 $groups = PHPUnit_Util_Test::getGroups( get_class( $this ) ); 00172 $constraint = PHPUnit_Framework_Assert::logicalOr( 00173 $this->contains( 'medium' ), 00174 $this->contains( 'large' ) 00175 ); 00176 $this->assertThat( $groups, $constraint, 00177 'ApiTestCase::setUp can be slow, tests must be "medium" or "large"' 00178 ); 00179 } 00180 } 00181 00182 class UserWrapper { 00183 public $userName; 00184 public $password; 00185 public $user; 00186 00187 public function __construct( $userName, $password, $group = '' ) { 00188 $this->userName = $userName; 00189 $this->password = $password; 00190 00191 $this->user = User::newFromName( $this->userName ); 00192 if ( !$this->user->getID() ) { 00193 $this->user = User::createNew( $this->userName, array( 00194 "email" => "[email protected]", 00195 "real_name" => "Test User" ) ); 00196 } 00197 $this->user->setPassword( $this->password ); 00198 00199 if ( $group !== '' ) { 00200 $this->user->addGroup( $group ); 00201 } 00202 $this->user->saveSettings(); 00203 } 00204 } 00205 00206 class MockApi extends ApiBase { 00207 public function execute() {} 00208 00209 public function getVersion() {} 00210 00211 public function __construct() {} 00212 00213 public function getAllowedParams() { 00214 return array( 00215 'filename' => null, 00216 'enablechunks' => false, 00217 'sessionkey' => null, 00218 ); 00219 } 00220 } 00221 00222 class ApiTestContext extends RequestContext { 00223 00231 public function newTestContext( WebRequest $request, User $user = null ) { 00232 $context = new DerivativeContext( $this ); 00233 $context->setRequest( $request ); 00234 if ( $user !== null ) { 00235 $context->setUser( $user ); 00236 } 00237 return $context; 00238 } 00239 }