3 abstract class ApiTestCase
extends MediaWikiLangTestCase
{
4 protected static $apiUrl;
11 protected function setUp() {
12 global $wgContLang, $wgAuth, $wgMemc, $wgRequest, $wgUser, $wgServer;
15 self
::$apiUrl = $wgServer . wfScript( 'api' );
16 $wgMemc = new EmptyBagOStuff();
17 $wgContLang = Language
::factory( 'en' );
18 $wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' );
19 $wgRequest = new FauxRequest( array() );
21 ApiQueryInfo
::resetTokenCache(); // tokens are invalid because we cleared the session
24 'sysop' => new TestUser(
27 'api_test_sysop@example.com',
30 'uploader' => new TestUser(
33 'api_test_user@example.com',
38 $wgUser = self
::$users['sysop']->user
;
40 $this->apiContext
= new ApiTestContext();
44 protected function doApiRequest( array $params, array $session = null, $appendModule = false, User
$user = null ) {
45 global $wgRequest, $wgUser;
47 if ( is_null( $session ) ) {
48 # re-use existing global session by default
49 $session = $wgRequest->getSessionArray();
52 # set up global environment
57 $wgRequest = new FauxRequest( $params, true, $session );
58 RequestContext
::getMain()->setRequest( $wgRequest );
60 # set up local environment
61 $context = $this->apiContext
->newTestContext( $wgRequest, $wgUser );
63 $module = new ApiMain( $context, true );
70 $module->getResultData(),
71 $context->getRequest(),
72 $context->getRequest()->getSessionArray()
82 * Add an edit token to the API request
83 * This is cheating a bit -- we grab a token in the correct format and then add it to the pseudo-session and to the
84 * request, without actually requesting a "real" edit token
85 * @param $params Array: key-value API params
86 * @param $session Array|null: session array
87 * @param $user User|null A User object for the context
89 protected function doApiRequestWithToken( array $params, array $session = null, User
$user = null ) {
92 if ( $session === null ) {
93 $session = $wgRequest->getSessionArray();
96 if ( $session['wsToken'] ) {
97 // add edit token to fake session
98 $session['wsEditToken'] = $session['wsToken'];
99 // add token to request parameters
100 $params['token'] = md5( $session['wsToken'] ) . User
::EDIT_TOKEN_SUFFIX
;
101 return $this->doApiRequest( $params, $session, false, $user );
103 throw new Exception( "request data not in right format" );
107 protected function doLogin() {
108 $data = $this->doApiRequest( array(
110 'lgname' => self
::$users['sysop']->username
,
111 'lgpassword' => self
::$users['sysop']->password
) );
113 $token = $data[0]['login']['token'];
115 $data = $this->doApiRequest( array(
118 'lgname' => self
::$users['sysop']->username
,
119 'lgpassword' => self
::$users['sysop']->password
125 protected function getTokenList( $user, $session = null ) {
126 $data = $this->doApiRequest( array(
128 'titles' => 'Main Page',
129 'intoken' => 'edit|delete|protect|move|block|unblock|watch',
130 'prop' => 'info' ), $session, false, $user->user
);
136 public $userName, $password, $user;
138 public function __construct( $userName, $password, $group = '' ) {
139 $this->userName
= $userName;
140 $this->password
= $password;
142 $this->user
= User
::newFromName( $this->userName
);
143 if ( !$this->user
->getID() ) {
144 $this->user
= User
::createNew( $this->userName
, array(
145 "email" => "test@example.com",
146 "real_name" => "Test User" ) );
148 $this->user
->setPassword( $this->password
);
150 if ( $group !== '' ) {
151 $this->user
->addGroup( $group );
153 $this->user
->saveSettings();
157 class MockApi
extends ApiBase
{
158 public function execute() { }
159 public function getVersion() { }
161 public function __construct() { }
163 public function getAllowedParams() {
166 'enablechunks' => false,
167 'sessionkey' => null,
172 class ApiTestContext
extends RequestContext
{
175 * Returns a DerivativeContext with the request variables in place
177 * @param $request WebRequest request object including parameters and session
178 * @param $user User or null
179 * @return DerivativeContext
181 public function newTestContext( WebRequest
$request, User
$user = null ) {
182 $context = new DerivativeContext( $this );
183 $context->setRequest( $request );
184 if ( $user !== null ) {
185 $context->setUser( $user );