MediaWiki
REL1_24
|
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 00056 return $page->doEditContent( ContentHandler::makeContent( $text, $title ), $summary ); 00057 } 00058 00075 protected function doApiRequest( array $params, array $session = null, 00076 $appendModule = false, User $user = null 00077 ) { 00078 global $wgRequest, $wgUser; 00079 00080 if ( is_null( $session ) ) { 00081 // re-use existing global session by default 00082 $session = $wgRequest->getSessionArray(); 00083 } 00084 00085 // set up global environment 00086 if ( $user ) { 00087 $wgUser = $user; 00088 } 00089 00090 $wgRequest = new FauxRequest( $params, true, $session ); 00091 RequestContext::getMain()->setRequest( $wgRequest ); 00092 00093 // set up local environment 00094 $context = $this->apiContext->newTestContext( $wgRequest, $wgUser ); 00095 00096 $module = new ApiMain( $context, true ); 00097 00098 // run it! 00099 $module->execute(); 00100 00101 // construct result 00102 $results = array( 00103 $module->getResultData(), 00104 $context->getRequest(), 00105 $context->getRequest()->getSessionArray() 00106 ); 00107 00108 if ( $appendModule ) { 00109 $results[] = $module; 00110 } 00111 00112 return $results; 00113 } 00114 00127 protected function doApiRequestWithToken( array $params, array $session = null, 00128 User $user = null 00129 ) { 00130 global $wgRequest; 00131 00132 if ( $session === null ) { 00133 $session = $wgRequest->getSessionArray(); 00134 } 00135 00136 if ( isset( $session['wsToken'] ) && $session['wsToken'] ) { 00137 // add edit token to fake session 00138 $session['wsEditToken'] = $session['wsToken']; 00139 // add token to request parameters 00140 $params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX; 00141 00142 return $this->doApiRequest( $params, $session, false, $user ); 00143 } else { 00144 throw new Exception( "Session token not available" ); 00145 } 00146 } 00147 00148 protected function doLogin( $user = 'sysop' ) { 00149 if ( !array_key_exists( $user, self::$users ) ) { 00150 throw new MWException( "Can not log in to undefined user $user" ); 00151 } 00152 00153 $data = $this->doApiRequest( array( 00154 'action' => 'login', 00155 'lgname' => self::$users[$user]->username, 00156 'lgpassword' => self::$users[$user]->password ) ); 00157 00158 $token = $data[0]['login']['token']; 00159 00160 $data = $this->doApiRequest( 00161 array( 00162 'action' => 'login', 00163 'lgtoken' => $token, 00164 'lgname' => self::$users[$user]->username, 00165 'lgpassword' => self::$users[$user]->password, 00166 ), 00167 $data[2] 00168 ); 00169 00170 return $data; 00171 } 00172 00173 protected function getTokenList( $user, $session = null ) { 00174 $data = $this->doApiRequest( array( 00175 'action' => 'tokens', 00176 'type' => 'edit|delete|protect|move|block|unblock|watch' 00177 ), $session, false, $user->user ); 00178 00179 if ( !array_key_exists( 'tokens', $data[0] ) ) { 00180 throw new MWException( 'Api failed to return a token list' ); 00181 } 00182 00183 return $data[0]['tokens']; 00184 } 00185 00186 public function testApiTestGroup() { 00187 $groups = PHPUnit_Util_Test::getGroups( get_class( $this ) ); 00188 $constraint = PHPUnit_Framework_Assert::logicalOr( 00189 $this->contains( 'medium' ), 00190 $this->contains( 'large' ) 00191 ); 00192 $this->assertThat( $groups, $constraint, 00193 'ApiTestCase::setUp can be slow, tests must be "medium" or "large"' 00194 ); 00195 } 00196 }