Fixed dependencies for jquery.collapsibleTabs
[lhc/web/wiklou.git] / tests / phpunit / includes / api / ApiTestCase.php
1 <?php
2
3 abstract class ApiTestCase extends MediaWikiLangTestCase {
4 protected static $apiUrl;
5
6 /**
7 * @var ApiTestContext
8 */
9 protected $apiContext;
10
11 function setUp() {
12 global $wgContLang, $wgAuth, $wgMemc, $wgRequest, $wgUser, $wgServer;
13
14 parent::setUp();
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() );
20
21 ApiQueryInfo::resetTokenCache(); // tokens are invalid because we cleared the session
22
23 self::$users = array(
24 'sysop' => new TestUser(
25 'Apitestsysop',
26 'Api Test Sysop',
27 'api_test_sysop@example.com',
28 array( 'sysop' )
29 ),
30 'uploader' => new TestUser(
31 'Apitestuser',
32 'Api Test User',
33 'api_test_user@example.com',
34 array()
35 )
36 );
37
38 $wgUser = self::$users['sysop']->user;
39
40 $this->apiContext = new ApiTestContext();
41
42 }
43
44 protected function doApiRequest( Array $params, Array $session = null, $appendModule = false, User $user = null ) {
45 global $wgRequest, $wgUser;
46
47 if ( is_null( $session ) ) {
48 # re-use existing global session by default
49 $session = $wgRequest->getSessionArray();
50 }
51
52 # set up global environment
53 if ( $user ) {
54 $wgUser = $user;
55 }
56
57 $wgRequest = new FauxRequest( $params, true, $session );
58 RequestContext::getMain()->setRequest( $wgRequest );
59
60 # set up local environment
61 $context = $this->apiContext->newTestContext( $wgRequest, $wgUser );
62
63 $module = new ApiMain( $context, true );
64
65 # run it!
66 $module->execute();
67
68 # construct result
69 $results = array(
70 $module->getResultData(),
71 $context->getRequest(),
72 $context->getRequest()->getSessionArray()
73 );
74 if( $appendModule ) {
75 $results[] = $module;
76 }
77
78 return $results;
79 }
80
81 /**
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
88 */
89 protected function doApiRequestWithToken( Array $params, Array $session = null, User $user = null ) {
90 global $wgRequest;
91
92 if ( $session === null ) {
93 $session = $wgRequest->getSessionArray();
94 }
95
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 );
102 } else {
103 throw new Exception( "request data not in right format" );
104 }
105 }
106
107 protected function doLogin() {
108 $data = $this->doApiRequest( array(
109 'action' => 'login',
110 'lgname' => self::$users['sysop']->username,
111 'lgpassword' => self::$users['sysop']->password ) );
112
113 $token = $data[0]['login']['token'];
114
115 $data = $this->doApiRequest( array(
116 'action' => 'login',
117 'lgtoken' => $token,
118 'lgname' => self::$users['sysop']->username,
119 'lgpassword' => self::$users['sysop']->password
120 ), $data[2] );
121
122 return $data;
123 }
124
125 protected function getTokenList( $user, $session = null ) {
126 $data = $this->doApiRequest( array(
127 'action' => 'query',
128 'titles' => 'Main Page',
129 'intoken' => 'edit|delete|protect|move|block|unblock|watch',
130 'prop' => 'info' ), $session, false, $user->user );
131 return $data;
132 }
133 }
134
135 class UserWrapper {
136 public $userName, $password, $user;
137
138 public function __construct( $userName, $password, $group = '' ) {
139 $this->userName = $userName;
140 $this->password = $password;
141
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" ) );
147 }
148 $this->user->setPassword( $this->password );
149
150 if ( $group !== '' ) {
151 $this->user->addGroup( $group );
152 }
153 $this->user->saveSettings();
154 }
155 }
156
157 class MockApi extends ApiBase {
158 public function execute() { }
159 public function getVersion() { }
160
161 public function __construct() { }
162
163 public function getAllowedParams() {
164 return array(
165 'filename' => null,
166 'enablechunks' => false,
167 'sessionkey' => null,
168 );
169 }
170 }
171
172 class ApiTestContext extends RequestContext {
173
174 /**
175 * Returns a DerivativeContext with the request variables in place
176 *
177 * @param $request WebRequest request object including parameters and session
178 * @param $user User or null
179 * @return DerivativeContext
180 */
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 );
186 }
187 return $context;
188 }
189 }