tests: Assert that the user who deleted a page is logged as such
authorJames D. Forrester <jforrester@wikimedia.org>
Wed, 28 Feb 2018 23:03:26 +0000 (15:03 -0800)
committerKrinkle <krinklemail@gmail.com>
Thu, 26 Apr 2018 00:49:00 +0000 (00:49 +0000)
These tests are rather basic, but they're better than the nothing that
seems to be the current state. Revision deletion is still untested and
suppression is only very lightly tested. More tests should be added.

Bug: T188479
Bug: T188773
Change-Id: Iba0f41ffddc6af45e0a4be86176708160f4821f4

tests/phpunit/includes/page/WikiPageDbTestBase.php

index 53b659f..40c4e1e 100644 (file)
@@ -155,6 +155,9 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
        }
 
        /**
+        * Undeletion is covered in PageArchiveTest::testUndeleteRevisions()
+        * TODO: Revision deletion
+        *
         * @covers WikiPage::doDeleteArticle
         * @covers WikiPage::doDeleteArticleReal
         */
@@ -203,6 +206,169 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
        }
 
+       /**
+        * @covers WikiPage::doDeleteArticleReal
+        */
+       public function testDoDeleteArticleReal_user0() {
+               $page = $this->createPage(
+                       __METHOD__,
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
+               $id = $page->getId();
+
+               $errorStack = '';
+               $status = $page->doDeleteArticleReal(
+                       /* reason */ "testing user 0 deletion",
+                       /* suppress */ false,
+                       /* unused 1 */ null,
+                       /* unused 2 */ null,
+                       /* errorStack */ $errorStack,
+                       null
+               );
+               $logId = $status->getValue();
+               $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
+               $this->assertSelect(
+                       [ 'logging' ] + $actorQuery['tables'], /* table */
+                       [
+                               'log_type',
+                               'log_action',
+                               'log_comment',
+                               'log_user' => $actorQuery['fields']['log_user'],
+                               'log_user_text' => $actorQuery['fields']['log_user_text'],
+                               'log_namespace',
+                               'log_title',
+                       ],
+                       [ 'log_id' => $logId ],
+                       [ [
+                               'delete',
+                               'delete',
+                               'testing user 0 deletion',
+                               '0',
+                               '127.0.0.1',
+                               (string)$page->getTitle()->getNamespace(),
+                               $page->getTitle()->getDBkey(),
+                       ] ],
+                       [],
+                       $actorQuery['joins']
+               );
+       }
+
+       /**
+        * @covers WikiPage::doDeleteArticleReal
+        */
+       public function testDoDeleteArticleReal_userSysop() {
+               $page = $this->createPage(
+                       __METHOD__,
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
+               $id = $page->getId();
+
+               $user = $this->getTestSysop()->getUser();
+               $errorStack = '';
+               $status = $page->doDeleteArticleReal(
+                       /* reason */ "testing sysop deletion",
+                       /* suppress */ false,
+                       /* unused 1 */ null,
+                       /* unused 2 */ null,
+                       /* errorStack */ $errorStack,
+                       $user
+               );
+               $logId = $status->getValue();
+               $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
+               $this->assertSelect(
+                       [ 'logging' ] + $actorQuery['tables'], /* table */
+                       [
+                               'log_type',
+                               'log_action',
+                               'log_comment',
+                               'log_user' => $actorQuery['fields']['log_user'],
+                               'log_user_text' => $actorQuery['fields']['log_user_text'],
+                               'log_namespace',
+                               'log_title',
+                       ],
+                       [ 'log_id' => $logId ],
+                       [ [
+                               'delete',
+                               'delete',
+                               'testing sysop deletion',
+                               (string)$user->getId(),
+                               $user->getName(),
+                               (string)$page->getTitle()->getNamespace(),
+                               $page->getTitle()->getDBkey(),
+                       ] ],
+                       [],
+                       $actorQuery['joins']
+               );
+       }
+
+       /**
+        * TODO: Test more stuff about suppression.
+        *
+        * @covers WikiPage::doDeleteArticleReal
+        */
+       public function testDoDeleteArticleReal_suppress() {
+               $page = $this->createPage(
+                       __METHOD__,
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
+               $id = $page->getId();
+
+               $user = $this->getTestSysop()->getUser();
+               $errorStack = '';
+               $status = $page->doDeleteArticleReal(
+                       /* reason */ "testing deletion",
+                       /* suppress */ true,
+                       /* unused 1 */ null,
+                       /* unused 2 */ null,
+                       /* errorStack */ $errorStack,
+                       $user
+               );
+               $logId = $status->getValue();
+               $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
+               $this->assertSelect(
+                       [ 'logging' ] + $actorQuery['tables'], /* table */
+                       [
+                               'log_type',
+                               'log_action',
+                               'log_comment',
+                               'log_user' => $actorQuery['fields']['log_user'],
+                               'log_user_text' => $actorQuery['fields']['log_user_text'],
+                               'log_namespace',
+                               'log_title',
+                       ],
+                       [ 'log_id' => $logId ],
+                       [ [
+                               'suppress',
+                               'delete',
+                               'testing deletion',
+                               (string)$user->getId(),
+                               $user->getName(),
+                               (string)$page->getTitle()->getNamespace(),
+                               $page->getTitle()->getDBkey(),
+                       ] ],
+                       [],
+                       $actorQuery['joins']
+               );
+
+               $this->assertNull(
+                       $page->getContent( Revision::FOR_PUBLIC ),
+                       "WikiPage::getContent should return null after the page was suppressed for general users"
+               );
+
+               $this->assertNull(
+                       $page->getContent( Revision::FOR_THIS_USER, null ),
+                       "WikiPage::getContent should return null after the page was suppressed for user zero"
+               );
+
+               $this->assertNull(
+                       $page->getContent( Revision::FOR_THIS_USER, $user ),
+                       "WikiPage::getContent should return null after the page was suppressed even for a sysop"
+               );
+       }
+
        /**
         * @covers WikiPage::doDeleteUpdates
         */