diff options
author | C. Scott Ananian <cscott@cscott.net> | 2024-04-10 17:10:22 -0400 |
---|---|---|
committer | C. Scott Ananian <cscott@cscott.net> | 2024-04-10 17:36:04 -0400 |
commit | 4cc84cdafaa5eaa80c6e11a5be6cc60ee8ed462b (patch) | |
tree | 10d8d2de58c8bcd9a9f646f6a94a2c5e2057a867 /tests/phpunit/includes/parser/BeforeParserFetchTemplateRevisionRecordTest.php | |
parent | 3abab91259c87d217a7d9680831b1838f8ecad25 (diff) | |
download | mediawikicore-4cc84cdafaa5eaa80c6e11a5be6cc60ee8ed462b.tar.gz mediawikicore-4cc84cdafaa5eaa80c6e11a5be6cc60ee8ed462b.zip |
Parser::statelessFetchTemplate: remove dead code; add test cases
Remove dead code left over from the removal of the
BeforeParserFetchTemplateAndtitle (sic) hook in
20c5632c4e58ea8749099d53c55998330108299c.
While we're at it, add test cases for statelessFetchTemplate and
improve coverage.
Followup-To: Ifecd4108eb02ebccc0c7bc4ec432036da08ffe53
Followup-To: Idf1fd12cc61ca30867dc9f8aeb1701fe035fc5ff
Change-Id: I135f5234e7be015a2781d6cb8d23b3143b618c5a
Diffstat (limited to 'tests/phpunit/includes/parser/BeforeParserFetchTemplateRevisionRecordTest.php')
-rw-r--r-- | tests/phpunit/includes/parser/BeforeParserFetchTemplateRevisionRecordTest.php | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/tests/phpunit/includes/parser/BeforeParserFetchTemplateRevisionRecordTest.php b/tests/phpunit/includes/parser/BeforeParserFetchTemplateRevisionRecordTest.php new file mode 100644 index 000000000000..048209103f40 --- /dev/null +++ b/tests/phpunit/includes/parser/BeforeParserFetchTemplateRevisionRecordTest.php @@ -0,0 +1,178 @@ +<?php + +namespace MediaWiki\Tests\Parser; + +use MediaWiki\Linker\LinkTarget; +use MediaWiki\Parser\Parser; +use MediaWiki\Revision\MutableRevisionRecord; +use MediaWiki\Revision\RevisionRecord; +use MediaWiki\Revision\SlotRecord; +use MediaWikiLangTestCase; +use MockTitleTrait; +use ParserOptions; +use WikitextContent; + +/** + * @group Database + * @covers \MediaWiki\Parser\Parser + */ +class BeforeParserFetchTemplateRevisionRecordTest extends MediaWikiLangTestCase { + use MockTitleTrait; + + private function checkResult( $expected, $actual ) { + if ( ( $expected['revision-record'] ?? true ) === false ) { + $this->assertSame( false, $actual['revision-record'] ); + } else { + $this->assertNotNull( $actual['revision-record'] ); + } + $this->assertSame( $expected['text'], $actual['text'] ); + $this->assertSame( $expected['finalTitle'], $actual['finalTitle']->getPrefixedText() ); + // Simplify 'deps' + $simpleActualDeps = array_map( + fn ( $dep ) => $dep['title']->getPrefixedText(), + $actual['deps'] + ); + $this->assertArrayEquals( $expected['deps'], $simpleActualDeps ); + } + + public static function provideWithParser() { + yield "Without \$parser" => [ false ]; + yield "With \$parser" => [ true ]; + } + + private function commonSetup( $suffix = null ) { + if ( $suffix === null ) { + $suffix = $this->getCallerName(); + } + $parser = $this->getServiceContainer()->getParserFactory()->create(); + $parser->setOptions( ParserOptions::newFromAnon() ); + + $page = $this->getNonexistingTestPage( "Base $suffix" ); + $this->editPage( $page, 'Base page content', 'Make testing content' ); + + $redirectPage = $this->getNonexistingTestPage( "Redirect $suffix" ); + $this->editPage( + $redirectPage, + '#REDIRECT [[' . $page->getTitle()->getPrefixedText() . ']]', + "Make redirect link for testing" + ); + + return [ $parser, $page, $redirectPage ]; + } + + /** + * @covers \MediaWiki\Parser\Parser::statelessFetchTemplate + * @dataProvider provideWithParser + */ + public function testStatelessFetchTemplateBasic( bool $withParser ) { + [ $parser, $page, $redirectPage ] = $this->commonSetup( __FUNCTION__ ); + + // Basic redirect test + $ret = Parser::statelessFetchTemplate( + $redirectPage->getTitle(), $withParser ? $parser : null + ); + $this->checkResult( [ + 'text' => 'Base page content', + 'finalTitle' => 'Base ' . __FUNCTION__, + 'deps' => [ + 'Base ' . __FUNCTION__, + 'Redirect ' . __FUNCTION__, + ], + ], $ret ); + } + + /** + * @covers \MediaWiki\Parser\Parser::statelessFetchTemplate + * @dataProvider provideWithParser + */ + public function testStatelessFetchTemplateSkip( bool $withParser ) { + [ $parser, $page, $redirectPage ] = $this->commonSetup( __FUNCTION__ ); + + // Create a hook to prevent resolution of the redirect + $this->setTemporaryHook( + 'BeforeParserFetchTemplateRevisionRecord', + static function ( ?LinkTarget $contextTitle, LinkTarget $title, bool &$skip, ?RevisionRecord &$revRecord ) { + $skip = true; + } + ); + + $ret = Parser::statelessFetchTemplate( + $redirectPage->getTitle(), $withParser ? $parser : null + ); + $this->checkResult( [ + 'text' => false, + 'finalTitle' => 'Redirect ' . __FUNCTION__, + 'deps' => [ + 'Redirect ' . __FUNCTION__, + ], + ], $ret ); + } + + /** + * @covers \MediaWiki\Parser\Parser::statelessFetchTemplate + * @dataProvider provideWithParser + */ + public function testStatelessFetchTemplateMissing( bool $withParser ) { + [ $parser, $page, $redirectPage ] = $this->commonSetup( __FUNCTION__ ); + + // Create a hook to redirect to a non-existing page + $baseTitle = 'Base ' . __FUNCTION__; + $missing = $this->getNonexistingTestPage( 'Missing ' . __FUNCTION__ ); + $this->setTemporaryHook( + 'BeforeParserFetchTemplateRevisionRecord', + static function ( ?LinkTarget $contextTitle, LinkTarget $title, bool &$skip, ?RevisionRecord &$revRecord ) use ( $baseTitle, $missing ) { + if ( $title->getPrefixedText() === $baseTitle ) { + $revRecord = new MutableRevisionRecord( $missing->getTitle() ); + } + } + ); + $ret = Parser::statelessFetchTemplate( + $redirectPage->getTitle(), $withParser ? $parser : null + ); + $this->checkResult( [ + 'text' => false, + 'finalTitle' => 'Missing ' . __FUNCTION__, + 'deps' => [ + 'Base ' . __FUNCTION__, + # The $missing page is duplicated in the deps here, but that's + # harmless. + 'Missing ' . __FUNCTION__, + 'Missing ' . __FUNCTION__, + 'Redirect ' . __FUNCTION__, + ], + ], $ret ); + } + + /** + * @covers \MediaWiki\Parser\Parser::statelessFetchTemplate + * @dataProvider provideWithParser + */ + public function testStatelessFetchTemplateSubstituted( bool $withParser ) { + [ $parser, $page, $redirectPage ] = $this->commonSetup( __FUNCTION__ ); + + // Create a hook to redirect to a non-existing page + $baseTitle = 'Base ' . __FUNCTION__; + $subst = $this->getNonexistingTestPage( 'Subst ' . __FUNCTION__ ); + $this->setTemporaryHook( + 'BeforeParserFetchTemplateRevisionRecord', + static function ( ?LinkTarget $contextTitle, LinkTarget $title, bool &$skip, ?RevisionRecord &$revRecord ) use ( $baseTitle, $subst ) { + if ( $title->getPrefixedText() === $baseTitle ) { + $revRecord = new MutableRevisionRecord( $subst->getTitle() ); + $revRecord->setContent( SlotRecord::MAIN, new WikitextContent( 'foo' ) ); + } + } + ); + $ret = Parser::statelessFetchTemplate( + $redirectPage->getTitle(), $withParser ? $parser : null + ); + $this->checkResult( [ + 'text' => 'foo', + 'finalTitle' => 'Subst ' . __FUNCTION__, + 'deps' => [ + 'Base ' . __FUNCTION__, + 'Subst ' . __FUNCTION__, + 'Redirect ' . __FUNCTION__, + ], + ], $ret ); + } +} |