Merge "tests related to API block action and its gettoken"
[lhc/web/wiklou.git] / tests / phpunit / includes / api / ApiBlockTest.php
index b90e77b..1f40b5a 100644 (file)
@@ -1,12 +1,10 @@
 <?php
 
-require_once dirname( __FILE__ ) . '/ApiSetup.php';
-
 /**
+ * @group API
  * @group Database
- * @group Destructive
  */
-class ApiBlockTest extends ApiTestSetup {
+class ApiBlockTest extends ApiTestCase {
 
        function setUp() {
                parent::setUp();
@@ -14,28 +12,36 @@ class ApiBlockTest extends ApiTestSetup {
        }
 
        function getTokens() {
-               return $this->getTokenList( $this->sysopUser );
+               return $this->getTokenList( self::$users['sysop'] );
        }
 
        function addDBData() {
-               $user = User::newFromName( 'UTBlockee' );
+               $user = User::newFromName( 'UTApiBlockee' );
 
                if ( $user->getId() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTBlockeePassword' );
+                       $user->setPassword( 'UTApiBlockeePassword' );
 
                        $user->saveSettings();
                }
        }
 
+       /**
+        * This test has probably always been broken and use an invalid token
+        * Bug tracking brokenness is https://bugzilla.wikimedia.org/35646
+        *
+        * Root cause is https://gerrit.wikimedia.org/r/3434
+        * Which made the Block/Unblock API to actually verify the token
+        * previously always considered valid (bug 34212).
+        */
        function testMakeNormalBlock() {
 
                $data = $this->getTokens();
 
-               $user = User::newFromName( 'UTBlockee' );
+               $user = User::newFromName( 'UTApiBlockee' );
 
                if ( !$user->getId() ) {
-                       $this->markTestIncomplete( "The user UTBlockee does not exist" );
+                       $this->markTestIncomplete( "The user UTApiBlockee does not exist" );
                }
 
                if( !isset( $data[0]['query']['pages'] ) ) {
@@ -48,18 +54,64 @@ class ApiBlockTest extends ApiTestSetup {
 
                $data = $this->doApiRequest( array(
                        'action' => 'block',
-                       'user' => 'UTBlockee',
+                       'user' => 'UTApiBlockee',
                        'reason' => 'Some reason',
-                       'token' => $pageinfo['blocktoken'] ), $data );
+                       'token' => $pageinfo['blocktoken'] ), $data, false, self::$users['sysop']->user );
 
-               $block = Block::newFromTarget('UTBlockee');
+               $block = Block::newFromTarget('UTApiBlockee');
 
                $this->assertTrue( !is_null( $block ), 'Block is valid' );
 
-               $this->assertEquals( 'UTBlockee', (string)$block->getTarget() );
+               $this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
                $this->assertEquals( 'Some reason', $block->mReason );
                $this->assertEquals( 'infinity', $block->mExpiry );
 
        }
 
+       /**
+        * @dataProvider provideBlockUnblockAction
+        */
+       function testGetTokenUsingABlockingAction( $action ) {
+               $data = $this->doApiRequest(
+                       array(
+                               'action' => $action,
+                               'user' => 'UTApiBlockee',
+                               'gettoken' => '' ),
+                       null,
+                       false,
+                       self::$users['sysop']->user
+               );
+               $this->assertEquals( 34, strlen( $data[0][$action]["{$action}token"] ) );
+       }
+
+       /**
+        * Attempting to block without a token should give a UsageException with
+        * error message:
+        *   "The token parameter must be set"
+        *
+        * @dataProvider provideBlockUnblockAction
+        * @expectedException UsageException
+        */
+       function testBlockingActionWithNoToken( $action ) {
+               $this->doApiRequest(
+                       array(
+                               'action' => $action,
+                               'user' => 'UTApiBlockee',
+                               'reason' => 'Some reason',
+                               ),
+                       null,
+                       false,
+                       self::$users['sysop']->user
+               );
+       }
+
+       /**
+        * Just provide the 'block' and 'unblock' action to test both API calls
+        */
+       function provideBlockUnblockAction() {
+               return array(
+                       array( 'block'   ),
+                       array( 'unblock' ),
+               );
+       }
 }