aboutsummaryrefslogtreecommitdiffstats
path: root/tests/phpunit/includes/parser/BeforeParserFetchTemplateRevisionRecordTest.php
diff options
context:
space:
mode:
authorC. Scott Ananian <cscott@cscott.net>2024-04-10 17:10:22 -0400
committerC. Scott Ananian <cscott@cscott.net>2024-04-10 17:36:04 -0400
commit4cc84cdafaa5eaa80c6e11a5be6cc60ee8ed462b (patch)
tree10d8d2de58c8bcd9a9f646f6a94a2c5e2057a867 /tests/phpunit/includes/parser/BeforeParserFetchTemplateRevisionRecordTest.php
parent3abab91259c87d217a7d9680831b1838f8ecad25 (diff)
downloadmediawikicore-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.php178
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 );
+ }
+}