X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=tests%2Fphpunit%2FMediaWikiTestCase.php;h=8aacdee51ee20ca1347a46fac8efc5065d3a9425;hb=63d7f2ad1345453dc16f16493fc7e5524219cfb8;hp=82739a70d2993f206577ace579a1b79679679066;hpb=722f51c7e809e13d85ea7735715f9d8548082120;p=lhc%2Fweb%2Fwiklou.git diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php index 82739a70d2..8aacdee51e 100644 --- a/tests/phpunit/MediaWikiTestCase.php +++ b/tests/phpunit/MediaWikiTestCase.php @@ -97,6 +97,12 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { */ private $mwGlobalsToUnset = []; + /** + * Holds original contents of interwiki table + * @var IResultWrapper + */ + private $interwikiTable = null; + /** * Holds original loggers which have been replaced by setLogger() * @var LoggerInterface[] @@ -563,6 +569,12 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { } } + // Store contents of interwiki table in case it changes. Unfortunately, we seem to have no + // way to do this only when needed, because tablesUsed can be changed mid-test. + if ( $this->db ) { + $this->interwikiTable = $this->db->select( 'interwiki', '*', '', __METHOD__ ); + } + // Reset all caches between tests. $this->doLightweightServiceReset(); @@ -616,6 +628,12 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { foreach ( $this->mwGlobalsToUnset as $value ) { unset( $GLOBALS[$value] ); } + if ( + array_key_exists( 'wgExtraNamespaces', $this->mwGlobals ) || + in_array( 'wgExtraNamespaces', $this->mwGlobalsToUnset ) + ) { + $this->resetNamespaces(); + } $this->mwGlobals = []; $this->mwGlobalsToUnset = []; $this->restoreLoggers(); @@ -733,6 +751,26 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { foreach ( $pairs as $key => $value ) { $GLOBALS[$key] = $value; } + + if ( array_key_exists( 'wgExtraNamespaces', $pairs ) ) { + $this->resetNamespaces(); + } + } + + /** + * Must be called whenever namespaces are changed, e.g., $wgExtraNamespaces is altered. + * Otherwise old namespace data will lurk and cause bugs. + */ + private function resetNamespaces() { + MWNamespace::clearCaches(); + Language::clearCaches(); + + // We can't have the TitleFormatter holding on to an old Language object either + // @todo We shouldn't need to reset all the aliases here. + $services = MediaWikiServices::getInstance(); + $services->resetServiceForTesting( 'TitleFormatter' ); + $services->resetServiceForTesting( 'TitleParser' ); + $services->resetServiceForTesting( '_MediaWikiTitleCodec' ); } /** @@ -1707,11 +1745,6 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { $truncate = in_array( $db->getType(), [ 'oracle', 'mysql' ] ); foreach ( $tablesUsed as $tbl ) { - // TODO: reset interwiki table to its original content. - if ( $tbl == 'interwiki' ) { - continue; - } - if ( !$db->tableExists( $tbl ) ) { continue; } @@ -1727,6 +1760,19 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { $db->resetSequenceForTable( $tbl, __METHOD__ ); } + if ( $tbl === 'interwiki' ) { + if ( !$this->interwikiTable ) { + // @todo We should probably throw here, but this causes test failures that I + // can't figure out, so for now we silently continue. + continue; + } + $db->insert( + 'interwiki', + array_map( 'get_object_vars', iterator_to_array( $this->interwikiTable ) ), + __METHOD__ + ); + } + if ( $tbl === 'page' ) { // Forget about the pages since they don't // exist in the DB. @@ -2215,4 +2261,41 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { } self::assertEquals( file_get_contents( $fileName ), $actualData, $msg ); } + + /** + * Edits or creates a page/revision + * @param string $pageName Page title + * @param string $text Content of the page + * @param string $summary Optional summary string for the revision + * @param int $defaultNs Optional namespace id + * @return array Array as returned by WikiPage::doEditContent() + */ + protected function editPage( $pageName, $text, $summary = '', $defaultNs = NS_MAIN ) { + $title = Title::newFromText( $pageName, $defaultNs ); + $page = WikiPage::factory( $title ); + + return $page->doEditContent( ContentHandler::makeContent( $text, $title ), $summary ); + } + + /** + * Revision-deletes a revision. + * + * @param Revision|int $rev Revision to delete + * @param array $value Keys are Revision::DELETED_* flags. Values are 1 to set the bit, 0 to + * clear, -1 to leave alone. (All other values also clear the bit.) + * @param string $comment Deletion comment + */ + protected function revisionDelete( + $rev, array $value = [ Revision::DELETED_TEXT => 1 ], $comment = '' + ) { + if ( is_int( $rev ) ) { + $rev = Revision::newFromId( $rev ); + } + RevisionDeleter::createList( + 'revision', RequestContext::getMain(), $rev->getTitle(), [ $rev->getId() ] + )->setVisibility( [ + 'value' => $value, + 'comment' => $comment, + ] ); + } }