20 private static $Success = [
'options' =>
'success' ];
25 $this->mUserMock = $this->getMockBuilder(
'User' )
26 ->disableOriginalConstructor()
30 $this->mUserMock->expects( $this->
any() )
31 ->method(
'getEffectiveGroups' )->will( $this->returnValue( [
'*',
'user' ] ) );
32 $this->mUserMock->expects( $this->
any() )
33 ->method(
'isAllowedAny' )->will( $this->returnValue(
true ) );
36 $this->mUserMock->expects( $this->
any() )
37 ->method(
'getOptionKinds' )->will( $this->returnCallback( [ $this,
'getOptionKinds' ] ) );
40 $this->mUserMock->expects( $this->
any() )
41 ->method(
'getInstanceForUpdate' )->will( $this->returnValue( $this->mUserMock ) );
46 $this->mContext->setUser( $this->mUserMock );
48 $main =
new ApiMain( $this->mContext );
53 $this->mTested =
new ApiOptions( $main,
'options' );
57 [ $this,
'hookGetPreferences' ]
65 foreach ( [
'name',
'willBeNull',
'willBeEmpty',
'willBeHappy' ]
as $k ) {
73 $preferences[
'testmultiselect'] = [
74 'type' =>
'multiselect',
77 '<span dir="auto">Some HTML here for option 1</span>' =>
'opt1',
78 '<span dir="auto">Some HTML here for option 2</span>' =>
'opt2',
79 '<span dir="auto">Some HTML here for option 3</span>' =>
'opt3',
80 '<span dir="auto">Some HTML here for option 4</span>' =>
'opt4',
85 'prefix' =>
'testmultiselect-',
101 'name' =>
'registered',
102 'willBeNull' =>
'registered',
103 'willBeEmpty' =>
'registered',
104 'willBeHappy' =>
'registered',
105 'testmultiselect-opt1' =>
'registered-multiselect',
106 'testmultiselect-opt2' =>
'registered-multiselect',
107 'testmultiselect-opt3' =>
'registered-multiselect',
108 'testmultiselect-opt4' =>
'registered-multiselect',
109 'special' =>
'special',
118 if ( isset( $kinds[$key] ) ) {
119 $mapping[$key] = $kinds[$key];
120 } elseif ( substr( $key, 0, 7 ) ===
'userjs-' ) {
121 $mapping[$key] =
'userjs';
123 $mapping[$key] =
'unused';
134 'optionname' =>
null,
135 'optionvalue' =>
null,
138 return array_merge(
$request, $custom );
143 $this->mTested->execute();
145 return $this->mTested->getResult()->getResultData(
null, [
'Strip' =>
'all' ] );
158 $this->mUserMock->expects( $this->once() )
160 ->will( $this->returnValue(
true ) );
170 $this->fail(
"ApiUsageException was not thrown" );
182 $this->fail(
"ApiUsageException was not thrown" );
186 $this->mUserMock->expects( $this->never() )
187 ->method(
'resetOptions' );
189 $this->mUserMock->expects( $this->never() )
190 ->method(
'setOption' );
192 $this->mUserMock->expects( $this->never() )
193 ->method(
'saveSettings' );
203 $this->fail(
"ApiUsageException was not thrown" );
207 $this->mUserMock->expects( $this->once() )
208 ->method(
'resetOptions' )
209 ->with( $this->equalTo( [
'all' ] ) );
211 $this->mUserMock->expects( $this->never() )
212 ->method(
'setOption' );
214 $this->mUserMock->expects( $this->once() )
215 ->method(
'saveSettings' );
221 $this->assertEquals( self::$Success,
$response );
225 $this->mUserMock->expects( $this->once() )
226 ->method(
'resetOptions' )
227 ->with( $this->equalTo( [
'registered' ] ) );
229 $this->mUserMock->expects( $this->never() )
230 ->method(
'setOption' );
232 $this->mUserMock->expects( $this->once() )
233 ->method(
'saveSettings' );
239 $this->assertEquals( self::$Success,
$response );
243 $this->mUserMock->expects( $this->never() )
244 ->method(
'resetOptions' );
246 $this->mUserMock->expects( $this->once() )
247 ->method(
'setOption' )
248 ->with( $this->equalTo(
'name' ), $this->equalTo(
'value' ) );
250 $this->mUserMock->expects( $this->once() )
251 ->method(
'saveSettings' );
257 $this->assertEquals( self::$Success,
$response );
261 $this->mUserMock->expects( $this->never() )
262 ->method(
'resetOptions' );
264 $this->mUserMock->expects( $this->once() )
265 ->method(
'setOption' )
266 ->with( $this->equalTo(
'name' ), $this->identicalTo(
null ) );
268 $this->mUserMock->expects( $this->once() )
269 ->method(
'saveSettings' );
274 $this->assertEquals( self::$Success,
$response );
278 $this->mUserMock->expects( $this->never() )
279 ->method(
'resetOptions' );
281 $this->mUserMock->expects( $this->at( 2 ) )
282 ->method(
'getOptions' );
284 $this->mUserMock->expects( $this->at( 5 ) )
285 ->method(
'setOption' )
286 ->with( $this->equalTo(
'willBeNull' ), $this->identicalTo(
null ) );
288 $this->mUserMock->expects( $this->at( 6 ) )
289 ->method(
'getOptions' );
291 $this->mUserMock->expects( $this->at( 7 ) )
292 ->method(
'setOption' )
293 ->with( $this->equalTo(
'willBeEmpty' ), $this->equalTo(
'' ) );
295 $this->mUserMock->expects( $this->at( 8 ) )
296 ->method(
'getOptions' );
298 $this->mUserMock->expects( $this->at( 9 ) )
299 ->method(
'setOption' )
300 ->with( $this->equalTo(
'willBeHappy' ), $this->equalTo(
'Happy' ) );
302 $this->mUserMock->expects( $this->once() )
303 ->method(
'saveSettings' );
306 'change' =>
'willBeNull|willBeEmpty=|willBeHappy=Happy'
311 $this->assertEquals( self::$Success,
$response );
315 $this->mUserMock->expects( $this->once() )
316 ->method(
'resetOptions' );
318 $this->mUserMock->expects( $this->at( 5 ) )
319 ->method(
'getOptions' );
321 $this->mUserMock->expects( $this->at( 6 ) )
322 ->method(
'setOption' )
323 ->with( $this->equalTo(
'willBeHappy' ), $this->equalTo(
'Happy' ) );
325 $this->mUserMock->expects( $this->at( 7 ) )
326 ->method(
'getOptions' );
328 $this->mUserMock->expects( $this->at( 8 ) )
329 ->method(
'setOption' )
330 ->with( $this->equalTo(
'name' ), $this->equalTo(
'value' ) );
332 $this->mUserMock->expects( $this->once() )
333 ->method(
'saveSettings' );
337 'change' =>
'willBeHappy=Happy',
338 'optionname' =>
'name',
339 'optionvalue' =>
'value'
344 $this->assertEquals( self::$Success,
$response );
348 $this->mUserMock->expects( $this->never() )
349 ->method(
'resetOptions' );
351 $this->mUserMock->expects( $this->at( 4 ) )
352 ->method(
'setOption' )
353 ->with( $this->equalTo(
'testmultiselect-opt1' ), $this->identicalTo(
true ) );
355 $this->mUserMock->expects( $this->at( 5 ) )
356 ->method(
'setOption' )
357 ->with( $this->equalTo(
'testmultiselect-opt2' ), $this->identicalTo(
null ) );
359 $this->mUserMock->expects( $this->at( 6 ) )
360 ->method(
'setOption' )
361 ->with( $this->equalTo(
'testmultiselect-opt3' ), $this->identicalTo(
false ) );
363 $this->mUserMock->expects( $this->at( 7 ) )
364 ->method(
'setOption' )
365 ->with( $this->equalTo(
'testmultiselect-opt4' ), $this->identicalTo(
false ) );
367 $this->mUserMock->expects( $this->once() )
368 ->method(
'saveSettings' );
371 'change' =>
'testmultiselect-opt1=1|testmultiselect-opt2|'
372 .
'testmultiselect-opt3=|testmultiselect-opt4=0'
377 $this->assertEquals( self::$Success,
$response );
381 $this->mUserMock->expects( $this->never() )
382 ->method(
'resetOptions' );
384 $this->mUserMock->expects( $this->never() )
385 ->method(
'saveSettings' );
388 'change' =>
'special=1'
393 $this->assertEquals( [
394 'options' =>
'success',
397 'warnings' =>
"Validation error for \"special\": cannot be set by this module."
404 $this->mUserMock->expects( $this->never() )
405 ->method(
'resetOptions' );
407 $this->mUserMock->expects( $this->never() )
408 ->method(
'saveSettings' );
411 'change' =>
'unknownOption=1'
416 $this->assertEquals( [
417 'options' =>
'success',
420 'warnings' =>
"Validation error for \"unknownOption\": not a valid preference."
427 $this->mUserMock->expects( $this->never() )
428 ->method(
'resetOptions' );
430 $this->mUserMock->expects( $this->once() )
431 ->method(
'setOption' )
432 ->with( $this->equalTo(
'userjs-option' ), $this->equalTo(
'1' ) );
434 $this->mUserMock->expects( $this->once() )
435 ->method(
'saveSettings' );
438 'change' =>
'userjs-option=1'
443 $this->assertEquals( self::$Success,
$response );