ApiMainTest: Fix typo
[lhc/web/wiklou.git] / tests / phpunit / includes / api / ApiDeleteTest.php
index 87167f0..0f2bcc6 100644 (file)
  * @covers ApiDelete
  */
 class ApiDeleteTest extends ApiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->doLogin();
-       }
-
        public function testDelete() {
-               $name = 'Help:ApiDeleteTest_testDelete';
-
-               // test non-existing page
-               try {
-                       $this->doApiRequestWithToken( [
-                               'action' => 'delete',
-                               'title' => $name,
-                       ] );
-                       $this->fail( "Should have raised an ApiUsageException" );
-               } catch ( ApiUsageException $e ) {
-                       $this->assertTrue( self::apiExceptionHasCode( $e, 'missingtitle' ) );
-               }
+               $name = 'Help:' . ucfirst( __FUNCTION__ );
 
                // create new page
                $this->editPage( $name, 'Some text' );
@@ -40,23 +22,31 @@ class ApiDeleteTest extends ApiTestCase {
                $apiResult = $this->doApiRequestWithToken( [
                        'action' => 'delete',
                        'title' => $name,
-               ] );
-               $apiResult = $apiResult[0];
+               ] )[0];
 
                $this->assertArrayHasKey( 'delete', $apiResult );
                $this->assertArrayHasKey( 'title', $apiResult['delete'] );
-               // Normalized $name is used
-               $this->assertSame(
-                       'Help:ApiDeleteTest testDelete',
-                       $apiResult['delete']['title']
-               );
+               $this->assertSame( $name, $apiResult['delete']['title'] );
                $this->assertArrayHasKey( 'logid', $apiResult['delete'] );
 
                $this->assertFalse( Title::newFromText( $name )->exists() );
        }
 
+       public function testDeleteNonexistent() {
+               $this->setExpectedException( ApiUsageException::class,
+                       "The page you specified doesn't exist." );
+
+               $this->doApiRequestWithToken( [
+                       'action' => 'delete',
+                       'title' => 'This page deliberately left nonexistent',
+               ] );
+       }
+
        public function testDeletionWithoutPermission() {
-               $name = 'Help:ApiDeleteTest_testDeleteWithoutPermission';
+               $this->setExpectedException( ApiUsageException::class,
+                       'The action you have requested is limited to users in the group:' );
+
+               $name = 'Help:' . ucfirst( __FUNCTION__ );
 
                // create new page
                $this->editPage( $name, 'Some text' );
@@ -69,11 +59,110 @@ class ApiDeleteTest extends ApiTestCase {
                                'title' => $name,
                                'token' => $user->getEditToken(),
                        ], null, null, $user );
-                       $this->fail( "Should have raised an ApiUsageException" );
-               } catch ( ApiUsageException $e ) {
-                       $this->assertTrue( self::apiExceptionHasCode( $e, 'permissiondenied' ) );
+               } finally {
+                       $this->assertTrue( Title::newFromText( $name )->exists() );
+               }
+       }
+
+       public function testDeleteWithTag() {
+               $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+               ChangeTags::defineTag( 'custom tag' );
+
+               $this->editPage( $name, 'Some text' );
+
+               $this->doApiRequestWithToken( [
+                       'action' => 'delete',
+                       'title' => $name,
+                       'tags' => 'custom tag',
+               ] );
+
+               $this->assertFalse( Title::newFromText( $name )->exists() );
+
+               $dbw = wfGetDB( DB_MASTER );
+               $this->assertSame( 'custom tag', $dbw->selectField(
+                       [ 'change_tag', 'logging' ],
+                       'ct_tag',
+                       [
+                               'log_namespace' => NS_HELP,
+                               'log_title' => ucfirst( __FUNCTION__ ),
+                       ],
+                       __METHOD__,
+                       [],
+                       [ 'change_tag' => [ 'INNER JOIN', 'ct_log_id = log_id' ] ]
+               ) );
+       }
+
+       public function testDeleteWithoutTagPermission() {
+               $this->setExpectedException( ApiUsageException::class,
+                       'You do not have permission to apply change tags along with your changes.' );
+
+               $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+               ChangeTags::defineTag( 'custom tag' );
+               $this->setMwGlobals( 'wgRevokePermissions',
+                       [ 'user' => [ 'applychangetags' => true ] ] );
+
+               $this->editPage( $name, 'Some text' );
+
+               try {
+                       $this->doApiRequestWithToken( [
+                               'action' => 'delete',
+                               'title' => $name,
+                               'tags' => 'custom tag',
+                       ] );
+               } finally {
+                       $this->assertTrue( Title::newFromText( $name )->exists() );
+               }
+       }
+
+       public function testDeleteAbortedByHook() {
+               $this->setExpectedException( ApiUsageException::class,
+                       'Deletion aborted by hook. It gave no explanation.' );
+
+               $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+               $this->editPage( $name, 'Some text' );
+
+               $this->setTemporaryHook( 'ArticleDelete',
+                       function () {
+                               return false;
+                       }
+               );
+
+               try {
+                       $this->doApiRequestWithToken( [ 'action' => 'delete', 'title' => $name ] );
+               } finally {
+                       $this->assertTrue( Title::newFromText( $name )->exists() );
                }
+       }
+
+       public function testDeleteWatch() {
+               $name = 'Help:' . ucfirst( __FUNCTION__ );
+               $user = self::$users['sysop']->getUser();
 
+               $this->editPage( $name, 'Some text' );
                $this->assertTrue( Title::newFromText( $name )->exists() );
+               $this->assertFalse( $user->isWatched( Title::newFromText( $name ) ) );
+
+               $this->doApiRequestWithToken( [ 'action' => 'delete', 'title' => $name, 'watch' => '' ] );
+
+               $this->assertFalse( Title::newFromText( $name )->exists() );
+               $this->assertTrue( $user->isWatched( Title::newFromText( $name ) ) );
+       }
+
+       public function testDeleteUnwatch() {
+               $name = 'Help:' . ucfirst( __FUNCTION__ );
+               $user = self::$users['sysop']->getUser();
+
+               $this->editPage( $name, 'Some text' );
+               $this->assertTrue( Title::newFromText( $name )->exists() );
+               $user->addWatch( Title::newFromText( $name ) );
+               $this->assertTrue( $user->isWatched( Title::newFromText( $name ) ) );
+
+               $this->doApiRequestWithToken( [ 'action' => 'delete', 'title' => $name, 'unwatch' => '' ] );
+
+               $this->assertFalse( Title::newFromText( $name )->exists() );
+               $this->assertFalse( $user->isWatched( Title::newFromText( $name ) ) );
        }
 }