Follow-up I0b781c11 (2a55449): use User::getAutomaticGroups().
[lhc/web/wiklou.git] / tests / phpunit / includes / api / ApiTestCase.php
1 <?php
2
3 abstract class ApiTestCase extends MediaWikiLangTestCase {
4 /**
5 * @var Array of ApiTestUser
6 */
7 public static $users;
8 protected static $apiUrl;
9
10 /**
11 * @var ApiTestContext
12 */
13 protected $apiContext;
14
15 function setUp() {
16 global $wgContLang, $wgAuth, $wgMemc, $wgRequest, $wgUser, $wgServer;
17
18 parent::setUp();
19 self::$apiUrl = $wgServer . wfScript( 'api' );
20 $wgMemc = new EmptyBagOStuff();
21 $wgContLang = Language::factory( 'en' );
22 $wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' );
23 $wgRequest = new FauxRequest( array() );
24
25 self::$users = array(
26 'sysop' => new ApiTestUser(
27 'Apitestsysop',
28 'Api Test Sysop',
29 'api_test_sysop@example.com',
30 array( 'sysop' )
31 ),
32 'uploader' => new ApiTestUser(
33 'Apitestuser',
34 'Api Test User',
35 'api_test_user@example.com',
36 array()
37 )
38 );
39
40 $wgUser = self::$users['sysop']->user;
41
42 $this->apiContext = new ApiTestContext();
43
44 }
45
46 protected function doApiRequest( Array $params, Array $session = null, $appendModule = false, User $user = null ) {
47 global $wgRequest, $wgUser;
48
49 if ( is_null( $session ) ) {
50 # re-use existing global session by default
51 $session = $wgRequest->getSessionArray();
52 }
53
54 # set up global environment
55 if ( $user ) {
56 $wgUser = $user;
57 }
58
59 $wgRequest = new FauxRequest( $params, true, $session );
60 RequestContext::getMain()->setRequest( $wgRequest );
61
62 # set up local environment
63 $context = $this->apiContext->newTestContext( $wgRequest, $wgUser );
64
65 $module = new ApiMain( $context, true );
66
67 # run it!
68 $module->execute();
69
70 # construct result
71 $results = array(
72 $module->getResultData(),
73 $context->getRequest(),
74 $context->getRequest()->getSessionArray()
75 );
76 if( $appendModule ) {
77 $results[] = $module;
78 }
79
80 return $results;
81 }
82
83 /**
84 * Add an edit token to the API request
85 * This is cheating a bit -- we grab a token in the correct format and then add it to the pseudo-session and to the
86 * request, without actually requesting a "real" edit token
87 * @param $params Array: key-value API params
88 * @param $session Array: session array
89 * @param $user User|null A User object for the context
90 */
91 protected function doApiRequestWithToken( Array $params, Array $session, User $user = null ) {
92 if ( $session['wsToken'] ) {
93 // add edit token to fake session
94 $session['wsEditToken'] = $session['wsToken'];
95 // add token to request parameters
96 $params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX;
97 return $this->doApiRequest( $params, $session, false, $user );
98 } else {
99 throw new Exception( "request data not in right format" );
100 }
101 }
102
103 protected function doLogin() {
104 $data = $this->doApiRequest( array(
105 'action' => 'login',
106 'lgname' => self::$users['sysop']->username,
107 'lgpassword' => self::$users['sysop']->password ) );
108
109 $token = $data[0]['login']['token'];
110
111 $data = $this->doApiRequest( array(
112 'action' => 'login',
113 'lgtoken' => $token,
114 'lgname' => self::$users['sysop']->username,
115 'lgpassword' => self::$users['sysop']->password
116 ), $data[2] );
117
118 return $data;
119 }
120
121 protected function getTokenList( $user, $session = null ) {
122 $data = $this->doApiRequest( array(
123 'action' => 'query',
124 'titles' => 'Main Page',
125 'intoken' => 'edit|delete|protect|move|block|unblock|watch',
126 'prop' => 'info' ), $session, false, $user->user );
127 return $data;
128 }
129 }
130
131 class UserWrapper {
132 public $userName, $password, $user;
133
134 public function __construct( $userName, $password, $group = '' ) {
135 $this->userName = $userName;
136 $this->password = $password;
137
138 $this->user = User::newFromName( $this->userName );
139 if ( !$this->user->getID() ) {
140 $this->user = User::createNew( $this->userName, array(
141 "email" => "test@example.com",
142 "real_name" => "Test User" ) );
143 }
144 $this->user->setPassword( $this->password );
145
146 if ( $group !== '' ) {
147 $this->user->addGroup( $group );
148 }
149 $this->user->saveSettings();
150 }
151 }
152
153 class MockApi extends ApiBase {
154 public function execute() { }
155 public function getVersion() { }
156
157 public function __construct() { }
158
159 public function getAllowedParams() {
160 return array(
161 'filename' => null,
162 'enablechunks' => false,
163 'sessionkey' => null,
164 );
165 }
166 }
167
168 class ApiTestContext extends RequestContext {
169
170 /**
171 * Returns a DerivativeContext with the request variables in place
172 *
173 * @param $request WebRequest request object including parameters and session
174 * @param $user User or null
175 * @return DerivativeContext
176 */
177 public function newTestContext( WebRequest $request, User $user = null ) {
178 $context = new DerivativeContext( $this );
179 $context->setRequest( $request );
180 if ( $user !== null ) {
181 $context->setUser( $user );
182 }
183 return $context;
184 }
185 }