$this->tablesUsed,
[ 'page',
'revision',
+ 'redirect',
'archive',
'category',
'ip_changes',
$this->assertEquals( 1, Category::newFromName( 'C' )->getPageCount() );
}
+ public function provideUpdateRedirectOn() {
+ yield [ '#REDIRECT [[Foo]]', true, null, true, true, 0 ];
+ yield [ '#REDIRECT [[Foo]]', true, 'Foo', true, false, 1 ];
+ yield [ 'SomeText', false, null, false, true, 0 ];
+ yield [ 'SomeText', false, 'Foo', false, false, 1 ];
+ }
+
+ /**
+ * @dataProvider provideUpdateRedirectOn
+ * @covers WikiPage::updateRedirectOn
+ *
+ * @param string $initialText
+ * @param bool $initialRedirectState
+ * @param string|null $redirectTitle
+ * @param bool|null $lastRevIsRedirect
+ * @param bool $expectedSuccess
+ * @param int $expectedRowCount
+ */
+ public function testUpdateRedirectOn(
+ $initialText,
+ $initialRedirectState,
+ $redirectTitle,
+ $lastRevIsRedirect,
+ $expectedSuccess,
+ $expectedRowCount
+ ) {
+ static $pageCounter = 0;
+ $pageCounter++;
+
+ $page = $this->createPage( Title::newFromText( __METHOD__ . $pageCounter ), $initialText );
+ $this->assertSame( $initialRedirectState, $page->isRedirect() );
+
+ $redirectTitle = is_string( $redirectTitle )
+ ? Title::newFromText( $redirectTitle )
+ : $redirectTitle;
+
+ $success = $page->updateRedirectOn( $this->db, $redirectTitle, $lastRevIsRedirect );
+ $this->assertSame( $expectedSuccess, $success, 'Success assertion' );
+ /**
+ * updateRedirectOn explicitly updates the redirect table (and not the page table).
+ * 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( $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 );
+ }
+
}