Test for WikiPage::newFromRow
[lhc/web/wiklou.git] / tests / phpunit / includes / page / WikiPageDbTestBase.php
index fa48fb4..99749a2 100644 (file)
@@ -1227,12 +1227,166 @@ more stuff
                 * Most of core checks the page table for redirect status, so we have to be ugly and
                 * assert a select from the table here.
                 */
+               $this->assertRedirectTableCountForPageId( $page->getId(), $expectedRowCount );
+       }
+
+       private function assertRedirectTableCountForPageId( $pageId, $expected ) {
                $this->assertSelect(
                        'redirect',
                        'COUNT(*)',
+                       [ 'rd_from' => $pageId ],
+                       [ [ strval( $expected ) ] ]
+               );
+       }
+
+       /**
+        * @covers WikiPage::insertRedirectEntry
+        */
+       public function testInsertRedirectEntry_insertsRedirectEntry() {
+               $page = $this->createPage( Title::newFromText( __METHOD__ ), 'A' );
+               $this->assertRedirectTableCountForPageId( $page->getId(), 0 );
+
+               $targetTitle = Title::newFromText( 'SomeTarget#Frag' );
+               $targetTitle->mInterwiki = 'eninter';
+               $page->insertRedirectEntry( $targetTitle, null );
+
+               $this->assertSelect(
+                       'redirect',
+                       [ 'rd_from', 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ],
+                       [ 'rd_from' => $page->getId() ],
+                       [ [
+                               strval( $page->getId() ),
+                               strval( $targetTitle->getNamespace() ),
+                               strval( $targetTitle->getDBkey() ),
+                               strval( $targetTitle->getFragment() ),
+                               strval( $targetTitle->getInterwiki() ),
+                       ] ]
+               );
+       }
+
+       /**
+        * @covers WikiPage::insertRedirectEntry
+        */
+       public function testInsertRedirectEntry_insertsRedirectEntryWithPageLatest() {
+               $page = $this->createPage( Title::newFromText( __METHOD__ ), 'A' );
+               $this->assertRedirectTableCountForPageId( $page->getId(), 0 );
+
+               $targetTitle = Title::newFromText( 'SomeTarget#Frag' );
+               $targetTitle->mInterwiki = 'eninter';
+               $page->insertRedirectEntry( $targetTitle, $page->getLatest() );
+
+               $this->assertSelect(
+                       'redirect',
+                       [ 'rd_from', 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ],
                        [ 'rd_from' => $page->getId() ],
-                       [ [ strval( $expectedRowCount ) ] ]
+                       [ [
+                               strval( $page->getId() ),
+                               strval( $targetTitle->getNamespace() ),
+                               strval( $targetTitle->getDBkey() ),
+                               strval( $targetTitle->getFragment() ),
+                               strval( $targetTitle->getInterwiki() ),
+                       ] ]
                );
        }
 
+       /**
+        * @covers WikiPage::insertRedirectEntry
+        */
+       public function testInsertRedirectEntry_doesNotInsertIfPageLatestIncorrect() {
+               $page = $this->createPage( Title::newFromText( __METHOD__ ), 'A' );
+               $this->assertRedirectTableCountForPageId( $page->getId(), 0 );
+
+               $targetTitle = Title::newFromText( 'SomeTarget#Frag' );
+               $targetTitle->mInterwiki = 'eninter';
+               $page->insertRedirectEntry( $targetTitle, 215251 );
+
+               $this->assertRedirectTableCountForPageId( $page->getId(), 0 );
+       }
+
+       private function getRow( array $overrides = [] ) {
+               $row = [
+                       'page_id' => '44',
+                       'page_len' => '76',
+                       'page_is_redirect' => '1',
+                       'page_latest' => '99',
+                       'page_namespace' => '3',
+                       'page_title' => 'JaJaTitle',
+                       'page_restrictions' => 'edit=autoconfirmed,sysop:move=sysop',
+                       'page_touched' => '20120101020202',
+                       'page_links_updated' => '20140101020202',
+               ];
+               foreach ( $overrides as $key => $value ) {
+                       $row[$key] = $value;
+               }
+               return (object)$row;
+       }
+
+       public function provideNewFromRowSuccess() {
+               yield 'basic row' => [
+                       $this->getRow(),
+                       function ( WikiPage $wikiPage, self $test ) {
+                               $test->assertSame( 44, $wikiPage->getId() );
+                               $test->assertSame( 76, $wikiPage->getTitle()->getLength() );
+                               $test->assertTrue( $wikiPage->isRedirect() );
+                               $test->assertSame( 99, $wikiPage->getLatest() );
+                               $test->assertSame( 3, $wikiPage->getTitle()->getNamespace() );
+                               $test->assertSame( 'JaJaTitle', $wikiPage->getTitle()->getDBkey() );
+                               $test->assertSame(
+                                       [
+                                               'edit' => [ 'autoconfirmed', 'sysop' ],
+                                               'move' => [ 'sysop' ],
+                                       ],
+                                       $wikiPage->getTitle()->getAllRestrictions()
+                               );
+                               $test->assertSame( '20120101020202', $wikiPage->getTouched() );
+                               $test->assertSame( '20140101020202', $wikiPage->getLinksTimestamp() );
+                       }
+               ];
+               yield 'different timestamp formats' => [
+                       $this->getRow( [
+                               'page_touched' => '2012-01-01 02:02:02',
+                               'page_links_updated' => '2014-01-01 02:02:02',
+                       ] ),
+                       function ( WikiPage $wikiPage, self $test ) {
+                               $test->assertSame( '20120101020202', $wikiPage->getTouched() );
+                               $test->assertSame( '20140101020202', $wikiPage->getLinksTimestamp() );
+                       }
+               ];
+               yield 'no restrictions' => [
+                       $this->getRow( [
+                               'page_restrictions' => '',
+                       ] ),
+                       function ( WikiPage $wikiPage, self $test ) {
+                       $test->assertSame(
+                               [
+                                       'edit' => [],
+                                       'move' => [],
+                               ],
+                               $wikiPage->getTitle()->getAllRestrictions()
+                       );
+                       }
+               ];
+               yield 'not redirect' => [
+                       $this->getRow( [
+                               'page_is_redirect' => '0',
+                       ] ),
+                       function ( WikiPage $wikiPage, self $test ) {
+                               $test->assertFalse( $wikiPage->isRedirect() );
+                       }
+               ];
+       }
+
+       /**
+        * @covers WikiPage::newFromRow
+        * @covers WikiPage::loadFromRow
+        * @dataProvider provideNewFromRowSuccess
+        *
+        * @param object $row
+        * @param callable $assertions
+        */
+       public function testNewFromRow( $row, $assertions ) {
+               $page = WikiPage::newFromRow( $row, 'fromdb' );
+               $assertions( $page, $this );
+       }
+
 }