Tpt has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/372566 )

Change subject: Moves edit validation to the Content interface implementation
......................................................................

Moves edit validation to the Content interface implementation

Cleans also some details related to ContentHandler

Change-Id: I98f2527209651b6c520db1e3da1453e031b0c712
---
M ProofreadPage.body.php
M extension.json
M i18n/en.json
M i18n/qqq.json
M includes/index/EditIndexPage.php
M includes/index/IndexContent.php
M includes/index/IndexContentHandler.php
M includes/page/EditPagePage.php
M includes/page/PageContent.php
M includes/page/PageContentHandler.php
M tests/phpunit/index/IndexContentHandlerTest.php
M tests/phpunit/index/IndexContentTest.php
M tests/phpunit/page/PageContentBuilderTest.php
M tests/phpunit/page/PageContentHandlerTest.php
M tests/phpunit/page/PageContentTest.php
15 files changed, 240 insertions(+), 214 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/ProofreadPage 
refs/changes/66/372566/1

diff --git a/ProofreadPage.body.php b/ProofreadPage.body.php
index 56b01ed..736e612 100644
--- a/ProofreadPage.body.php
+++ b/ProofreadPage.body.php
@@ -607,58 +607,6 @@
        }
 
        /**
-        * Make validation of the content in the edit API
-        *
-        * @param IContextSource $context
-        * @param Content $content Content of the edit box.
-        * @param Status $status Status object to represent errors, etc.
-        * @param string $summary Edit summary for page.
-        * @param User $user User who is performing the edit.
-        * @param bool $minoredit Whether the edit was marked as minor by the 
user.
-        * @return bool
-        */
-       public static function onEditFilterMergedContent( IContextSource 
$context, Content $content,
-               Status $status, $summary, User $user, $minoredit
-       ) {
-               // If the content's model isn't ours, ignore this; there's 
nothing for us to do here.
-               if ( !( $content instanceof PageContent ) ) {
-                       return true;
-               }
-
-               // Fail if the content is invalid, or the level is being 
removed.
-               if ( !$content->isValid() ) {
-                       $status->fatal( 'proofreadpage_badpagetext' );
-                       return false;
-               }
-
-               $oldContent = $context->getWikiPage()->getContent( 
Revision::FOR_THIS_USER, $user );
-               if ( $oldContent === null ) {
-                       $oldContent = ContentHandler::getForModelID( 
CONTENT_MODEL_PROOFREAD_PAGE )
-                               ->makeEmptyContent();
-               }
-               if ( $oldContent->getModel() !== CONTENT_MODEL_PROOFREAD_PAGE ) 
{
-                       // Let's convert it to Page: page content
-                       $oldContent = $oldContent->convert( 
CONTENT_MODEL_PROOFREAD_PAGE );
-               }
-               if ( !( $oldContent instanceof PageContent ) ) {
-                       // We consider it as a page creation
-                       $oldContent = ContentHandler::getForModelID( 
CONTENT_MODEL_PROOFREAD_PAGE )
-                               ->makeEmptyContent();
-               }
-
-               $oldLevel = $oldContent->getLevel();
-               $newLevel = $content->getLevel();
-
-               // Fail if the user changed the level and the change isn't 
allowed
-               if ( !$oldLevel->isChangeAllowed( $newLevel ) ) {
-                       $status->fatal( 'proofreadpage_notallowedtext' );
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
         * Provides text for preload API
         *
         * @param string $text
@@ -901,16 +849,11 @@
         * Extension registration callback
         */
        public static function onRegister() {
-               global $wgContentHandlers;
-
                // L10n
                include_once __DIR__ . '/ProofreadPage.namespaces.php';
 
                // Content handler
                define( 'CONTENT_MODEL_PROOFREAD_PAGE', 'proofread-page' );
                define( 'CONTENT_MODEL_PROOFREAD_INDEX', 'proofread-index' );
-               $wgContentHandlers[CONTENT_MODEL_PROOFREAD_PAGE] = 
'\ProofreadPage\Page\PageContentHandler';
-               $wgContentHandlers[CONTENT_MODEL_PROOFREAD_INDEX] =
-                       '\ProofreadPage\Index\IndexContentHandler';
        }
 }
diff --git a/extension.json b/extension.json
index 042b62b..56189d8 100644
--- a/extension.json
+++ b/extension.json
@@ -31,6 +31,10 @@
        "APIPropModules": {
                "proofread": "ApiQueryProofread"
        },
+       "ContentHandlers": {
+               "proofread-page": "\\ProofreadPage\\Page\\PageContentHandler",
+               "proofread-index": "\\ProofreadPage\\Index\\IndexContentHandler"
+       },
        "MessagesDirs": {
                "ProofreadPage": [
                        "i18n"
@@ -88,9 +92,6 @@
                "ApiQueryProofreadInfo": "ApiQueryProofreadInfo.php",
                "ProofreadPage\\FileProviderMock": 
"tests/phpunit/FileProviderMock.php",
                "ProofreadPageTestCase": 
"tests/phpunit/ProofreadPageTestCase.php",
-               "ProofreadIndexPageTest": 
"tests/phpunit/index/ProofreadIndexPageTest.php",
-               "ProofreadPagePageTest": 
"tests/phpunit/page/ProofreadPagePageTest.php",
-               "ProofreadPage\\Page\\PageContentTest": 
"tests/phpunit/page/PageContentTest.php",
                "FixProofreadPagePagesContentModel": 
"maintenance/fixProofreadPagePagesContentModel.php",
                "FixProofreadIndexPagesContentModel": 
"maintenance/fixProofreadIndexPagesContentModel.php"
        },
@@ -298,9 +299,6 @@
                ],
                "ContentHandlerDefaultModelFor": [
                        "ProofreadPage::onContentHandlerDefaultModelFor"
-               ],
-               "EditFilterMergedContent": [
-                       "ProofreadPage::onEditFilterMergedContent"
                ],
                "EditFormPreloadText": [
                        "ProofreadPage::onEditFormPreloadText"
diff --git a/i18n/en.json b/i18n/en.json
index c0551f5..e8b5b57 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -14,13 +14,9 @@
        "proofreadpage_index_expected": "Error: Index expected",
        "proofreadpage_nosuch_index": "Error: No such index",
        "proofreadpage_nosuch_file": "Error: No such file",
-       "proofreadpage_badpage": "Wrong format",
-       "proofreadpage_badpagetext": "The format of the page you attempted to 
save is incorrect.",
-       "proofreadpage_indexdupe": "Duplicate link",
        "proofreadpage_indexdupetext": "Pages cannot be listed more than once 
on an index page.",
        "proofreadpage_nologin": "Not logged in",
        "proofreadpage_nologintext": "You must be [[Special:UserLogin|logged 
in]] to modify the proofreading status of pages.",
-       "proofreadpage_notallowed": "Change not allowed",
        "proofreadpage_notallowedtext": "You are not allowed to change the 
proofreading status of this page.",
        "proofreadpage_dataconfig_badformatted": "Bug in data configuration",
        "proofreadpage_dataconfig_badformattedtext": "The page 
[[Mediawiki:Proofreadpage index data config]] is not in well-formatted JSON.",
diff --git a/i18n/qqq.json b/i18n/qqq.json
index ff28c9d..fa818fa 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -40,14 +40,10 @@
        "proofreadpage_index_expected": "Used as error message",
        "proofreadpage_nosuch_index": "Used as error message",
        "proofreadpage_nosuch_file": "Used as error message",
-       "proofreadpage_badpage": "Seems unused inside the extension",
-       "proofreadpage_badpagetext": "Used as error message",
-       "proofreadpage_indexdupe": "Meaning: \"This is a duplicate link\"",
        "proofreadpage_indexdupetext": "Used as error message",
        "proofreadpage_nologin": "{{Identical|Not logged in}}",
        "proofreadpage_nologintext": "Used as error message",
-       "proofreadpage_notallowed": "Used as error title.\n\nThe body for this 
title is {{msg-mw|Proofreadpage notallowedtext}}.\n\nTranslate this as 
\"Changing the proofreading status is not allowed\".",
-       "proofreadpage_notallowedtext": "Used as error message.\n\nThe title 
for this error is {{msg-mw|Proofreadpage notallowed}}.",
+       "proofreadpage_notallowedtext": "Used as error message.",
        "proofreadpage_dataconfig_badformatted": "Title of the error page when 
[[MediaWiki:Proofreadpage index data config]] is not in well-formatted JSON",
        "proofreadpage_dataconfig_badformattedtext": "Content of the error page 
when [[MediaWiki:Proofreadpage index data config]] is not in well-formatted 
JSON",
        "proofreadpage_number_expected": "The place where the data entry should 
be in numeric form",
diff --git a/includes/index/EditIndexPage.php b/includes/index/EditIndexPage.php
index 9f0603e..5a87049 100644
--- a/includes/index/EditIndexPage.php
+++ b/includes/index/EditIndexPage.php
@@ -185,37 +185,4 @@
 
                return $value;
        }
-
-       /**
-        * Check the validity of the page
-        *
-        * @see EditPage::internalAttemptSave
-        */
-       public function internalAttemptSave( &$result, $bot = false ) {
-               $content = $this->toEditContent( $this->textbox1 );
-               if ( $content instanceof IndexContent ) {
-                       // Get list of pages titles
-                       $links = $content->getLinksToNamespace(
-                               $this->extContext->getPageNamespaceId(), 
$this->getTitle()
-                       );
-                       $linksTitle = [];
-                       foreach ( $links as $link ) {
-                               $linksTitle[] = $link->getTarget();
-                       }
-
-                       if ( count( $linksTitle ) !== count( array_unique( 
$linksTitle ) ) ) {
-                               $this->context->getOutput()->showErrorPage(
-                                       'proofreadpage_indexdupe',
-                                       'proofreadpage_indexdupetext'
-                               );
-                               $status = Status::newGood();
-                               $status->fatal( 'hookaborted' );
-                               $status->value = self::AS_HOOK_ERROR;
-
-                               return $status;
-                       }
-               }
-
-               return parent::internalAttemptSave( $result, $bot );
-       }
 }
diff --git a/includes/index/IndexContent.php b/includes/index/IndexContent.php
index 0e113e4..9ef128f 100644
--- a/includes/index/IndexContent.php
+++ b/includes/index/IndexContent.php
@@ -6,12 +6,15 @@
 use MagicWord;
 use MalformedTitleException;
 use ParserOptions;
+use ProofreadPage\Context;
 use ProofreadPage\Link;
 use ProofreadPage\Pagination\PageList;
 use Sanitizer;
+use Status;
 use TextContent;
 use Title;
 use User;
+use WikiPage;
 use WikitextContent;
 
 /**
@@ -131,6 +134,30 @@
        }
 
        /**
+        * @see Content::prepareSave
+        */
+       public function prepareSave( WikiPage $page, $flags, $parentRevId, User 
$user ) {
+               if ( !$this->isValid() ) {
+                       return Status::newFatal( 'invalid-content-data' );
+               }
+
+               // Get list of pages titles
+               $links = $this->getLinksToNamespace(
+                       Context::getDefaultContext()->getPageNamespaceId(), 
$page->getTitle()
+               );
+               $linksTitle = [];
+               foreach ( $links as $link ) {
+                       $linksTitle[] = $link->getTarget();
+               }
+
+               if ( count( $linksTitle ) !== count( array_unique( $linksTitle 
) ) ) {
+                       return Status::newFatal( 'proofreadpage_indexdupetext' 
);
+               }
+
+               return Status::newGood();
+       }
+
+       /**
         * @see Content::getSize
         */
        public function getSize() {
diff --git a/includes/index/IndexContentHandler.php 
b/includes/index/IndexContentHandler.php
index 2b1f606..2c74982 100644
--- a/includes/index/IndexContentHandler.php
+++ b/includes/index/IndexContentHandler.php
@@ -7,7 +7,7 @@
 use MWContentSerializationException;
 use Parser;
 use PPFrame;
-use StubObject;
+use ProofreadPage\Context;
 use TextContentHandler;
 use Title;
 use WikitextContent;
@@ -51,6 +51,14 @@
                        null, $this->makeParserOptions( 'canonical' ), 
Parser::OT_PLAIN
                );
                return $parser;
+       }
+
+       /**
+        * @see ContentHandler::canBeUsedOn
+        */
+       public function canBeUsedOn( Title $title ) {
+               return parent::canBeUsedOn( $title ) &&
+                       $title->getNamespace() === 
Context::getDefaultContext()->getIndexNamespaceId();
        }
 
        /**
@@ -123,8 +131,8 @@
         */
        public function getActionOverrides() {
                return [
-                       'edit' => '\ProofreadPage\Index\IndexEditAction',
-                       'submit' => '\ProofreadPage\Index\IndexSubmitAction'
+                       'edit' => IndexEditAction::class,
+                       'submit' => IndexSubmitAction::class
                ];
        }
 
@@ -132,7 +140,7 @@
         * @see ContentHandler::getDiffEngineClass
         */
        protected function getDiffEngineClass() {
-               return '\ProofreadPage\Index\IndexDifferenceEngine';
+               return IndexDifferenceEngine::class;
        }
 
        /**
diff --git a/includes/page/EditPagePage.php b/includes/page/EditPagePage.php
index b6c4dc4..468ed1a 100644
--- a/includes/page/EditPagePage.php
+++ b/includes/page/EditPagePage.php
@@ -210,32 +210,4 @@
                        $currentContent
                )->serialize();
        }
-
-       /**
-        * Check the validity of the page
-        *
-        * @see EditPage::internalAttemptSave
-        */
-       public function internalAttemptSave( &$result, $bot = false ) {
-               $error = '';
-               $oldContent = $this->getCurrentContent();
-               $newContent = $this->toEditContent( $this->textbox1 );
-
-               if ( !$newContent->isValid() ) {
-                       $error = 'badpage';
-               } elseif ( !$oldContent->getLevel()->isChangeAllowed( 
$newContent->getLevel() ) ) {
-                       $error = 'notallowed';
-               }
-
-               if ( $error !== '' ) {
-                       $this->context->getOutput()->showErrorPage(
-                               'proofreadpage_' . $error, 'proofreadpage_' . 
$error . 'text'
-                       );
-                       $status = Status::newFatal( 'hookaborted' );
-                       $status->value = self::AS_HOOK_ERROR;
-                       return $status;
-               }
-
-               return parent::internalAttemptSave( $result, $bot );
-       }
 }
diff --git a/includes/page/PageContent.php b/includes/page/PageContent.php
index 9b3c1aa..157d3c1 100644
--- a/includes/page/PageContent.php
+++ b/includes/page/PageContent.php
@@ -6,9 +6,12 @@
 use Html;
 use MagicWord;
 use ParserOptions;
+use Revision;
+use Status;
 use TextContent;
 use Title;
 use User;
+use WikiPage;
 use WikitextContent;
 
 /**
@@ -167,6 +170,42 @@
        }
 
        /**
+        * @see Content::prepareSave
+        */
+       public function prepareSave( WikiPage $page, $flags, $parentRevId, User 
$user ) {
+               if ( !$this->isValid() ) {
+                       return Status::newFatal( 'invalid-content-data' );
+               }
+
+               $oldContent = $this->getContentForRevId( $parentRevId );
+               if ( $oldContent->getModel() !== CONTENT_MODEL_PROOFREAD_PAGE ) 
{
+                       // Let's convert it to Page: page content
+                       $oldContent = $oldContent->convert( 
CONTENT_MODEL_PROOFREAD_PAGE );
+               }
+               if ( !( $oldContent instanceof self ) ) {
+                       return Status::newFatal( 'invalid-content-data' );
+               }
+               if ( !$oldContent->getLevel()->isChangeAllowed( 
$this->getLevel() ) ) {
+                       return Status::newFatal( 'proofreadpage_notallowedtext' 
);
+               }
+
+               return Status::newGood();
+       }
+
+       private function getContentForRevId( $revId ) {
+               if ( $revId !== -1 ) {
+                       $revision = Revision::newFromId( $revId );
+                       if ( $revision !== null ) {
+                               $content = $revision->getContent();
+                               if ( $content !== null ) {
+                                       return $content;
+                               }
+                       }
+               }
+               return $this->getContentHandler()->makeEmptyContent();
+       }
+
+       /**
         * @see Content::getRedirectTarget
         */
        public function getRedirectTarget() {
diff --git a/includes/page/PageContentHandler.php 
b/includes/page/PageContentHandler.php
index d86cf58..79a25e6 100644
--- a/includes/page/PageContentHandler.php
+++ b/includes/page/PageContentHandler.php
@@ -6,6 +6,7 @@
 use ContentHandler;
 use FormatJson;
 use MWContentSerializationException;
+use ProofreadPage\Context;
 use TextContentHandler;
 use Title;
 use User;
@@ -29,6 +30,14 @@
        public function __construct( $modelId = CONTENT_MODEL_PROOFREAD_PAGE ) {
                parent::__construct( $modelId, [ CONTENT_FORMAT_WIKITEXT, 
CONTENT_FORMAT_JSON ] );
                $this->wikitextContentHandler = ContentHandler::getForModelID( 
CONTENT_MODEL_WIKITEXT );
+       }
+
+       /**
+        * @see ContentHandler::canBeUsedOn
+        */
+       public function canBeUsedOn( Title $title ) {
+               return parent::canBeUsedOn( $title ) &&
+                       $title->getNamespace() === 
Context::getDefaultContext()->getPageNamespaceId();
        }
 
        /**
@@ -205,9 +214,9 @@
         */
        public function getActionOverrides() {
                return [
-                       'edit' => '\ProofreadPage\Page\PageEditAction',
-                       'submit' => '\ProofreadPage\Page\PageSubmitAction',
-                       'view' => '\ProofreadPage\Page\PageViewAction'
+                       'edit' => PageEditAction::class,
+                       'submit' => PageSubmitAction::class,
+                       'view' => PageViewAction::class
                ];
        }
 
@@ -215,7 +224,7 @@
         * @see ContentHandler::getDiffEngineClass
         */
        protected function getDiffEngineClass() {
-               return '\ProofreadPage\Page\PageDifferenceEngine';
+               return PageDifferenceEngine::class;
        }
 
        /**
diff --git a/tests/phpunit/index/IndexContentHandlerTest.php 
b/tests/phpunit/index/IndexContentHandlerTest.php
index 5f6e1be..e87467a 100644
--- a/tests/phpunit/index/IndexContentHandlerTest.php
+++ b/tests/phpunit/index/IndexContentHandlerTest.php
@@ -25,6 +25,16 @@
                $this->handler = new IndexContentHandler();
        }
 
+       public function testCanBeUsedOn() {
+               $this->assertTrue( $this->handler->canBeUsedOn(
+                       Title::makeTitle( $this->getIndexNamespaceId(), 'Test' )
+               ) );
+               $this->assertFalse( $this->handler->canBeUsedOn(
+                       Title::makeTitle( $this->getPageNamespaceId(), 'Test' )
+               ) );
+               $this->assertFalse( $this->handler->canBeUsedOn( 
Title::makeTitle( NS_MAIN, 'Test' ) ) );
+       }
+
        public function wikitextSerializationProvider() {
                return [
                        [
diff --git a/tests/phpunit/index/IndexContentTest.php 
b/tests/phpunit/index/IndexContentTest.php
index d2a4081..ef00c24 100644
--- a/tests/phpunit/index/IndexContentTest.php
+++ b/tests/phpunit/index/IndexContentTest.php
@@ -9,6 +9,7 @@
 use ProofreadPage\Pagination\PageList;
 use ProofreadPageTestCase;
 use RequestContext;
+use Status;
 use Title;
 use User;
 use WikitextContent;
@@ -182,6 +183,30 @@
                $this->assertEquals( $expectedContent, $content );
        }
 
+       public function prepareSaveProvider() {
+               return [
+                       [
+                               Status::newGood(),
+                               new IndexContent( [] )
+                       ],
+                       [
+                               Status::newFatal( 'proofreadpage_indexdupetext' 
),
+                               new IndexContent( [
+                                       'page' => new WikitextContent( 
'[[Page:Foo]] [[Page:Bar]] [[Page:Foo]]' )
+                               ] )
+                       ]
+               ];
+       }
+
+       /**
+        * @dataProvider prepareSaveProvider
+        */
+       public function testPrepareSave( Status $expectedResult, IndexContent 
$content ) {
+               $this->assertEquals( $expectedResult, $content->prepareSave(
+                       $this->requestContext->getWikiPage(), 0, -1, 
$this->requestContext->getUser()
+               ) );
+       }
+
        public function testGetSize() {
                $content = new IndexContent( [ 'foo' => new WikitextContent( 
'bar' ) ] );
                $this->assertEquals( 3, $content->getSize() );
diff --git a/tests/phpunit/page/PageContentBuilderTest.php 
b/tests/phpunit/page/PageContentBuilderTest.php
index 8688f79..3202914 100644
--- a/tests/phpunit/page/PageContentBuilderTest.php
+++ b/tests/phpunit/page/PageContentBuilderTest.php
@@ -9,6 +9,7 @@
 use ProofreadPageTestCase;
 use RequestContext;
 use User;
+use WikitextContent;
 
 /**
  * @group ProofreadPage
@@ -26,6 +27,15 @@
 
                $this->context = new RequestContext();
                $this->context->setUser( User::newFromName( 'Test' ) );
+       }
+
+       private static function newContent(
+               $header = '', $body = '', $footer = '', $level = 1, 
$proofreader = null
+       ) {
+               return new PageContent(
+                       new WikitextContent( $header ), new WikitextContent( 
$body ), new WikitextContent( $footer ),
+                       new PageLevel( $level, PageLevel::getUserFromUserName( 
$proofreader ) )
+               );
        }
 
        /**
@@ -58,13 +68,13 @@
                                                'Test.djvu', "{{\n|Title=Test 
book\n|Header={{{title}}}\n}}"
                                        )
                                ),
-                               PageContentTest::newContent( 'Test book', '', 
'<references />', 1 ),
+                               self::newContent( 'Test book', '', '<references 
/>', 1 ),
                        ],
                        [
                                $this->newPagePage(
                                        'LoremIpsum.djvu/2'
                                ),
-                               PageContentTest::newContent( '', "Lorem ipsum 
\n2 \n", '<references/>', 1 ),
+                               self::newContent( '', "Lorem ipsum \n2 \n", 
'<references/>', 1 ),
                        ],
                        [
                                $this->newPagePage(
@@ -74,7 +84,7 @@
                                                "{{\n|Title=Test 
book\n|Pages=<pagelist/>\n|Header={{{pagenum}}}\n}}"
                                        )
                                ),
-                               PageContentTest::newContent( '2', "Lorem ipsum 
\n2 \n", '<references />', 1 ),
+                               self::newContent( '2', "Lorem ipsum \n2 \n", 
'<references />', 1 ),
                        ],
                        [
                                $this->newPagePage(
@@ -85,7 +95,7 @@
                                                        
"|Header={{{pagenum}}}\n}}"
                                        )
                                ),
-                               PageContentTest::newContent( 'ii', "Lorem ipsum 
\n2 \n", '<references />', 1 ),
+                               self::newContent( 'ii', "Lorem ipsum \n2 \n", 
'<references />', 1 ),
                        ],
                ];
        }
@@ -110,24 +120,24 @@
                                '42',
                                '42',
                                2,
-                               PageContentTest::newContent( '22', '22', '22', 
2, 'Test2' ),
-                               PageContentTest::newContent( '42', '42', '42', 
2, 'Test2' ),
+                               self::newContent( '22', '22', '22', 2, 'Test2' 
),
+                               self::newContent( '42', '42', '42', 2, 'Test2' 
),
                        ],
                        [
                                '42',
                                '42',
                                '42',
                                2,
-                               PageContentTest::newContent( '22', '22', '22', 
2, null ),
-                               PageContentTest::newContent( '42', '42', '42', 
2, 'Test' ),
+                               self::newContent( '22', '22', '22', 2, null ),
+                               self::newContent( '42', '42', '42', 2, 'Test' ),
                        ],
                        [
                                '42',
                                '42',
                                '42',
                                3,
-                               PageContentTest::newContent( '22', '22', '22', 
2, 'Test2' ),
-                               PageContentTest::newContent( '42', '42', '42', 
3, 'Test' ),
+                               self::newContent( '22', '22', '22', 2, 'Test2' 
),
+                               self::newContent( '42', '42', '42', 3, 'Test' ),
                        ],
                ];
        }
diff --git a/tests/phpunit/page/PageContentHandlerTest.php 
b/tests/phpunit/page/PageContentHandlerTest.php
index bd4cccb..d18cd83 100644
--- a/tests/phpunit/page/PageContentHandlerTest.php
+++ b/tests/phpunit/page/PageContentHandlerTest.php
@@ -7,10 +7,11 @@
 use MWContentSerializationException;
 use ProofreadPageTestCase;
 use Title;
+use WikitextContent;
 
 /**
  * @group ProofreadPage
- * @covers ProofreadPageContentHandler
+ * @covers PageContentHandler
  */
 class PageContentHandlerTest extends ProofreadPageTestCase {
 
@@ -23,6 +24,25 @@
                parent::setUp();
 
                $this->handler = ContentHandler::getForModelID( 
CONTENT_MODEL_PROOFREAD_PAGE );
+       }
+
+       private static function newContent(
+               $header = '', $body = '', $footer = '', $level = 1, 
$proofreader = null
+       ) {
+               return new PageContent(
+                       new WikitextContent( $header ), new WikitextContent( 
$body ), new WikitextContent( $footer ),
+                       new PageLevel( $level, PageLevel::getUserFromUserName( 
$proofreader ) )
+               );
+       }
+
+       public function testCanBeUsedOn() {
+               $this->assertTrue( $this->handler->canBeUsedOn(
+                       Title::makeTitle( $this->getPageNamespaceId(), 'Test' )
+               ) );
+               $this->assertFalse( $this->handler->canBeUsedOn(
+                       Title::makeTitle( $this->getIndexNamespaceId(), 'Test' )
+               ) );
+               $this->assertFalse( $this->handler->canBeUsedOn( 
Title::makeTitle( NS_MAIN, 'Test' ) ) );
        }
 
        public function pageWikitextSerializationProvider() {
@@ -113,7 +133,7 @@
        public function testSerializeContentInWikitext(
                $header, $body, $footer, $level, $proofreader
        ) {
-               $pageContent = PageContentTest::newContent( $header, $body, 
$footer, $level, $proofreader );
+               $pageContent = self::newContent( $header, $body, $footer, 
$level, $proofreader );
 
                $serializedString = '<noinclude><pagequality level="' . $level 
. '" user="';
                $serializedString .= $proofreader;
@@ -131,7 +151,7 @@
                $header, $body, $footer, $level, $proofreader, $text
        ) {
                $this->assertEquals(
-                       PageContentTest::newContent( $header, $body, $footer, 
$level, $proofreader ),
+                       self::newContent( $header, $body, $footer, $level, 
$proofreader ),
                        $this->handler->unserializeContent( $text )
                );
        }
@@ -142,7 +162,7 @@
        public function testRoundTripSerializeContentInWikitext(
                $header, $body, $footer, $level, $proofreader, $text
        ) {
-               $content = PageContentTest::newContent( $header, $body, 
$footer, $level, $proofreader );
+               $content = self::newContent( $header, $body, $footer, $level, 
$proofreader );
                $this->assertEquals(
                        $content,
                        $this->handler->unserializeContent( 
$this->handler->serializeContent( $content ) )
@@ -150,7 +170,7 @@
        }
 
        public function testSerializeContentInJson() {
-               $pageContent = PageContentTest::newContent( 'Foo', 'Bar', 
'FooBar', 2, '1.2.3.4' );
+               $pageContent = self::newContent( 'Foo', 'Bar', 'FooBar', 2, 
'1.2.3.4' );
 
                $this->assertEquals(
                        FormatJson::encode( [
@@ -195,7 +215,7 @@
                $header, $body, $footer, $level, $proofreader, $text
        ) {
                $this->assertEquals(
-                       PageContentTest::newContent( $header, $body, $footer, 
$level, $proofreader ),
+                       self::newContent( $header, $body, $footer, $level, 
$proofreader ),
                        $this->handler->unserializeContent( $text, 
CONTENT_FORMAT_JSON )
                );
        }
@@ -241,7 +261,7 @@
        public function testRoundTripSerializeContentInJson(
                $header, $body, $footer, $level, $proofreader, $text
        ) {
-               $content = PageContentTest::newContent( $header, $body, 
$footer, $level, $proofreader );
+               $content = self::newContent( $header, $body, $footer, $level, 
$proofreader );
                $this->assertEquals(
                        $content,
                        $this->handler->unserializeContent(
@@ -259,27 +279,27 @@
        public static function merge3Provider() {
                return [
                        [
-                               PageContentTest::newContent( '', "first 
paragraph\n\nsecond paragraph\n" ),
-                               PageContentTest::newContent( '', "FIRST 
paragraph\n\nsecond paragraph\n" ),
-                               PageContentTest::newContent( '', "first 
paragraph\n\nSECOND paragraph\n" ),
-                               PageContentTest::newContent( '', "FIRST 
paragraph\n\nSECOND paragraph\n" )
+                               self::newContent( '', "first 
paragraph\n\nsecond paragraph\n" ),
+                               self::newContent( '', "FIRST 
paragraph\n\nsecond paragraph\n" ),
+                               self::newContent( '', "first 
paragraph\n\nSECOND paragraph\n" ),
+                               self::newContent( '', "FIRST 
paragraph\n\nSECOND paragraph\n" )
                        ],
                        [
-                               PageContentTest::newContent( '', "test\n" ),
-                               PageContentTest::newContent( '', "dddd\n" ),
-                               PageContentTest::newContent( '', "ffff\n" ),
+                               self::newContent( '', "test\n" ),
+                               self::newContent( '', "dddd\n" ),
+                               self::newContent( '', "ffff\n" ),
                                false
                        ],
                        [
-                               PageContentTest::newContent( '', "test\n", '', 
1, 'John' ),
-                               PageContentTest::newContent( '', "test2\n", '', 
2, 'Jack' ),
-                               PageContentTest::newContent( '', "test\n", '', 
2, 'Bob' ),
-                               PageContentTest::newContent( '', "test2\n", '', 
2, 'Bob' ),
+                               self::newContent( '', "test\n", '', 1, 'John' ),
+                               self::newContent( '', "test2\n", '', 2, 'Jack' 
),
+                               self::newContent( '', "test\n", '', 2, 'Bob' ),
+                               self::newContent( '', "test2\n", '', 2, 'Bob' ),
                        ],
                        [
-                               PageContentTest::newContent( '', "test\n", '', 
1, 'John' ),
-                               PageContentTest::newContent( '', "test\n", '', 
2, 'Jack' ),
-                               PageContentTest::newContent( '', "test\n", '', 
1, 'Bob' ),
+                               self::newContent( '', "test\n", '', 1, 'John' ),
+                               self::newContent( '', "test\n", '', 2, 'Jack' ),
+                               self::newContent( '', "test\n", '', 1, 'Bob' ),
                                false
                        ],
                ];
@@ -297,18 +317,18 @@
        public static function getAutosummaryProvider() {
                return [
                        [
-                               PageContentTest::newContent( '', '', '', 1 ),
-                               PageContentTest::newContent( 'aa', 'aa', 'aa', 
1 ),
+                               self::newContent( '', '', '', 1 ),
+                               self::newContent( 'aa', 'aa', 'aa', 1 ),
                                ''
                        ],
                        [
                                null,
-                               PageContentTest::newContent( '', 'aaa', '', 1 ),
+                               self::newContent( '', 'aaa', '', 1 ),
                                '/* Not proofread */'
                        ],
                        [
-                               PageContentTest::newContent( '', '', '', 2 ),
-                               PageContentTest::newContent( '', '', '', 1 ),
+                               self::newContent( '', '', '', 2 ),
+                               self::newContent( '', '', '', 1 ),
                                '/* Not proofread */'
                        ]
                ];
diff --git a/tests/phpunit/page/PageContentTest.php 
b/tests/phpunit/page/PageContentTest.php
index 14894a8..7f18235 100644
--- a/tests/phpunit/page/PageContentTest.php
+++ b/tests/phpunit/page/PageContentTest.php
@@ -6,13 +6,14 @@
 use ParserOptions;
 use ProofreadPageTestCase;
 use RequestContext;
+use Status;
 use Title;
 use User;
 use WikitextContent;
 
 /**
  * @group ProofreadPage
- * @covers ProofreadPageContent
+ * @covers \ProofreadPage\Page\PageContent
  */
 class PageContentTest extends ProofreadPageTestCase {
 
@@ -40,31 +41,13 @@
                $this->requestContext->setUser( $user );
        }
 
-       /**
-        * Constructor of a new PageContent
-        * @param WikitextContent|string $header
-        * @param WikitextContent|string $body
-        * @param WikitextContent|string $footer
-        * @param integer $level
-        * @param User|string $proofreader
-        * @return PageContent
-        */
-       public static function newContent(
+       private static function newContent(
                $header = '', $body = '', $footer = '', $level = 1, 
$proofreader = null
        ) {
-               if ( is_string( $header ) ) {
-                       $header = new WikitextContent( $header );
-               }
-               if ( is_string( $body ) ) {
-                       $body = new WikitextContent( $body );
-               }
-               if ( is_string( $footer ) ) {
-                       $footer = new WikitextContent( $footer );
-               }
-               if ( is_string( $proofreader ) ) {
-                       $proofreader = PageLevel::getUserFromUserName( 
$proofreader );
-               }
-               return new PageContent( $header, $body, $footer, new PageLevel( 
$level, $proofreader ) );
+               return new PageContent(
+                       new WikitextContent( $header ), new WikitextContent( 
$body ), new WikitextContent( $footer ),
+                       new PageLevel( $level, PageLevel::getUserFromUserName( 
$proofreader ) )
+               );
        }
 
        public function testGetModel() {
@@ -73,21 +56,18 @@
        }
 
        public function testGetHeader() {
-               $header = new WikitextContent( "testString" );
-               $pageContent = self::newContent( $header );
-               $this->assertEquals( $header, $pageContent->getHeader() );
+               $pageContent = self::newContent( 'testString' );
+               $this->assertEquals( new WikitextContent( 'testString' ), 
$pageContent->getHeader() );
        }
 
        public function testGetFooter() {
-               $footer = new WikitextContent( "testString" );
-               $pageContent = self::newContent( '', '', $footer );
-               $this->assertEquals( $footer, $pageContent->getFooter() );
+               $pageContent = self::newContent( '', '', 'testString' );
+               $this->assertEquals( new WikitextContent( 'testString' ), 
$pageContent->getFooter() );
        }
 
        public function testGetBody() {
-               $body = new WikitextContent( "testString" );
-               $pageContent = self::newContent( '', $body );
-               $this->assertEquals( $body, $pageContent->getBody() );
+               $pageContent = self::newContent( '', 'testString' );
+               $this->assertEquals( new WikitextContent( 'testString' ), 
$pageContent->getBody() );
        }
 
        public function testGetLevel() {
@@ -152,7 +132,7 @@
 
        public function testGetWikitextForTransclusion() {
                $content = self::newContent( 'aa', 'test', 'bb', 2, 'ater' );
-               return $this->assertEquals( 'test', 
$content->getWikitextForTransclusion() );
+               $this->assertEquals( 'test', 
$content->getWikitextForTransclusion() );
        }
 
        public function getTextForSummaryProvider() {
@@ -178,7 +158,7 @@
        /**
         * @dataProvider getTextForSummaryProvider
         */
-       public function testGetTextForSummary( $content, $length, $result ) {
+       public function testGetTextForSummary( PageContent $content, $length, 
$result ) {
                $this->assertEquals( $result, $content->getTextForSummary( 
$length ) );
        }
 
@@ -205,7 +185,7 @@
        /**
         * @dataProvider preSaveTransformProvider
         */
-       public function testPreSaveTransform( $content, $expectedContent ) {
+       public function testPreSaveTransform( PageContent $content, 
$expectedContent ) {
                global $wgContLang;
 
                $options = ParserOptions::newFromUserAndLang(
@@ -235,7 +215,7 @@
        /**
         * @dataProvider preloadTransformProvider
         */
-       public function testPreloadTransform( $content, $expectedContent ) {
+       public function testPreloadTransform( PageContent $content, 
$expectedContent ) {
                global $wgContLang;
 
                $options = ParserOptions::newFromUserAndLang(
@@ -247,6 +227,32 @@
                $this->assertEquals( $expectedContent, $content );
        }
 
+       public function prepareSaveProvider() {
+               return [
+                       [
+                               Status::newGood(),
+                               self::newContent()
+                       ],
+                       [
+                               Status::newFatal( 'invalid-content-data' ),
+                               self::newContent( '', '', '', 5 )
+                       ],
+                       [
+                               Status::newFatal( 
'proofreadpage_notallowedtext' ),
+                               self::newContent( '', '', '', 4 )
+                       ]
+               ];
+       }
+
+       /**
+        * @dataProvider prepareSaveProvider
+        */
+       public function testPrepareSave( Status $expectedResult, PageContent 
$content ) {
+               $this->assertEquals( $expectedResult, $content->prepareSave(
+                       $this->requestContext->getWikiPage(), 0, -1, 
$this->requestContext->getUser()
+               ) );
+       }
+
        public function testRedirectTarget() {
                $title = Title::makeTitle( NS_MAIN, 'Test' );
                $content = self::newContent( '', '#REDIRECT [[Test]]' );

-- 
To view, visit https://gerrit.wikimedia.org/r/372566
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I98f2527209651b6c520db1e3da1453e031b0c712
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/ProofreadPage
Gerrit-Branch: master
Gerrit-Owner: Tpt <thoma...@hotmail.fr>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to