X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=tests%2Fphpunit%2Fincludes%2FOutputPageTest.php;h=ef8766a966fb6e0d75e64b67e98fa2fbeeba0c7d;hb=8f1d9e171891a5f1613ae4819dbb140261333f83;hp=00a08a719d7a1a45db4f384ae45e3639b28abfc2;hpb=c51b4f607d702c768608f2df059ef5606471e589;p=lhc%2Fweb%2Fwiklou.git diff --git a/tests/phpunit/includes/OutputPageTest.php b/tests/phpunit/includes/OutputPageTest.php index 00a08a719d..ef8766a966 100644 --- a/tests/phpunit/includes/OutputPageTest.php +++ b/tests/phpunit/includes/OutputPageTest.php @@ -12,6 +12,14 @@ class OutputPageTest extends MediaWikiTestCase { const SCREEN_MEDIA_QUERY = 'screen and (min-width: 982px)'; const SCREEN_ONLY_MEDIA_QUERY = 'only screen and (min-width: 982px)'; + // @codingStandardsIgnoreStart Generic.Files.LineLength + const RSS_RC_LINK = ''; + const ATOM_RC_LINK = ''; + + const RSS_TEST_LINK = ''; + const ATOM_TEST_LINK = ''; + // @codingStandardsIgnoreEnd + // Ensure that we don't affect the global ResourceLoader state. protected function setUp() { parent::setUp(); @@ -51,6 +59,64 @@ class OutputPageTest extends MediaWikiTestCase { ]; } + private function setupFeedLinks( $feed, $types ) { + $outputPage = $this->newInstance( [ + 'AdvertisedFeedTypes' => $types, + 'Feed' => $feed, + 'OverrideSiteFeed' => false, + 'Script' => '/w', + 'Sitename' => false, + ] ); + $outputPage->setTitle( Title::makeTitle( NS_MAIN, 'Test' ) ); + $this->setMwGlobals( [ + 'wgScript' => '/w/index.php', + ] ); + return $outputPage; + } + + private function assertFeedLinks( $outputPage, $message, $present, $non_present ) { + $links = $outputPage->getHeadLinksArray(); + foreach ( $present as $link ) { + $this->assertContains( $link, $links, $message ); + } + foreach ( $non_present as $link ) { + $this->assertNotContains( $link, $links, $message ); + } + } + + private function assertFeedUILinks( $outputPage, $ui_links ) { + if ( $ui_links ) { + $this->assertTrue( $outputPage->isSyndicated(), 'Syndication should be offered' ); + $this->assertGreaterThan( 0, count( $outputPage->getSyndicationLinks() ), + 'Some syndication links should be there' ); + } else { + $this->assertFalse( $outputPage->isSyndicated(), 'No syndication should be offered' ); + $this->assertEquals( 0, count( $outputPage->getSyndicationLinks() ), + 'No syndication links should be there' ); + } + } + + public static function provideFeedLinkData() { + return [ + [ + true, [ 'rss' ], 'Only RSS RC link should be offerred', + [ self::RSS_RC_LINK ], [ self::ATOM_RC_LINK ] + ], + [ + true, [ 'atom' ], 'Only Atom RC link should be offerred', + [ self::ATOM_RC_LINK ], [ self::RSS_RC_LINK ] + ], + [ + true, [], 'No RC feed formats should be offerred', + [], [ self::ATOM_RC_LINK, self::RSS_RC_LINK ] + ], + [ + false, [ 'atom' ], 'No RC feeds should be offerred', + [], [ self::ATOM_RC_LINK, self::RSS_RC_LINK ] + ], + ]; + } + /** * @covers OutputPage::setCopyrightUrl * @covers OutputPage::getHeadLinksArray @@ -65,6 +131,67 @@ class OutputPageTest extends MediaWikiTestCase { ); } + /** + * @dataProvider provideFeedLinkData + * @covers OutputPage::getHeadLinksArray + */ + public function testRecentChangesFeed( $feed, $advertised_feed_types, + $message, $present, $non_present ) { + $outputPage = $this->setupFeedLinks( $feed, $advertised_feed_types ); + $this->assertFeedLinks( $outputPage, $message, $present, $non_present ); + } + + public static function provideAdditionalFeedData() { + return [ + [ + true, [ 'atom' ], 'Additional Atom feed should be offered', + 'atom', + [ self::ATOM_TEST_LINK, self::ATOM_RC_LINK ], + [ self::RSS_TEST_LINK, self::RSS_RC_LINK ], + true, + ], + [ + true, [ 'rss' ], 'Additional RSS feed should be offered', + 'rss', + [ self::RSS_TEST_LINK, self::RSS_RC_LINK ], + [ self::ATOM_TEST_LINK, self::ATOM_RC_LINK ], + true, + ], + [ + true, [ 'rss' ], 'Additional Atom feed should NOT be offered with RSS enabled', + 'atom', + [ self::RSS_RC_LINK ], + [ self::RSS_TEST_LINK, self::ATOM_TEST_LINK, self::ATOM_RC_LINK ], + false, + ], + [ + false, [ 'atom' ], 'Additional Atom feed should NOT be offered, all feeds disabled', + 'atom', + [], + [ + self::RSS_TEST_LINK, self::ATOM_TEST_LINK, + self::ATOM_RC_LINK, self::ATOM_RC_LINK, + ], + false, + ], + ]; + } + + /** + * @dataProvider provideAdditionalFeedData + * @covers OutputPage::getHeadLinksArray + * @covers OutputPage::addFeedLink + * @covers OutputPage::getSyndicationLinks + * @covers OutputPage::isSyndicated + */ + public function testAdditionalFeeds( $feed, $advertised_feed_types, $message, + $additional_feed_type, $present, $non_present, $any_ui_links ) { + $outputPage = $this->setupFeedLinks( $feed, $advertised_feed_types ); + $outputPage->addFeedLink( $additional_feed_type, 'fake-link' ); + $this->assertFeedLinks( $outputPage, $message, $present, $non_present ); + $this->assertFeedUILinks( $outputPage, $any_ui_links ); + } + // @todo How to test setStatusCode? /** @@ -797,7 +924,7 @@ class OutputPageTest extends MediaWikiTestCase { * @covers OutputPage::isSyndicated */ public function testSetSyndicated() { - $op = $this->newInstance(); + $op = $this->newInstance( [ 'Feed' => true ] ); $this->assertFalse( $op->isSyndicated() ); $op->setSyndicated(); @@ -805,6 +932,12 @@ class OutputPageTest extends MediaWikiTestCase { $op->setSyndicated( false ); $this->assertFalse( $op->isSyndicated() ); + + $op = $this->newInstance(); // Feed => false by default + $this->assertFalse( $op->isSyndicated() ); + + $op->setSyndicated(); + $this->assertFalse( $op->isSyndicated() ); } /** @@ -814,7 +947,7 @@ class OutputPageTest extends MediaWikiTestCase { * @covers OutputPage::getSyndicationLinks() */ public function testFeedLinks() { - $op = $this->newInstance(); + $op = $this->newInstance( [ 'Feed' => true ] ); $this->assertSame( [], $op->getSyndicationLinks() ); $op->addFeedLink( 'not a supported format', 'abc' ); @@ -839,6 +972,13 @@ class OutputPageTest extends MediaWikiTestCase { $expected[$type] = $op->getTitle()->getLocalURL( "feed=$type&apples=oranges" ); } $this->assertSame( $expected, $op->getSyndicationLinks() ); + + $op = $this->newInstance(); // Feed => false by default + $this->assertSame( [], $op->getSyndicationLinks() ); + + $op->addFeedLink( $feedTypes[0], 'def' ); + $this->assertFalse( $op->isSyndicated() ); + $this->assertSame( [], $op->getSyndicationLinks() ); } /** @@ -912,7 +1052,7 @@ class OutputPageTest extends MediaWikiTestCase { * @param array $args Array of form [ category name => sort key ] * @param array $fakeResults Array of form [ category name => value to return from mocked * LinkBatch ] - * @param callback $variantLinkCallback Callback to replace findVariantLink() call + * @param callable $variantLinkCallback Callback to replace findVariantLink() call * @param array $expectedNormal Expected return value of getCategoryLinks['normal'] * @param array $expectedHidden Expected return value of getCategoryLinks['hidden'] */ @@ -1486,7 +1626,7 @@ class OutputPageTest extends MediaWikiTestCase { "

Bold\n

", ], 'No section edit links' => [ [ '== Title ==' ], - "

Title

\n", + "

Title

", ], ], 'addWikiTextWithTitle' => [ @@ -1515,7 +1655,7 @@ class OutputPageTest extends MediaWikiTestCase { '

* Not a list

', ], 'No section edit links' => [ [ '== Title ==' ], - "

Title

\n", + "

Title

", ], 'With title at start' => [ [ '* {{PAGENAME}}', true, Title::newFromText( 'Talk:Some page' ) ], "\n", @@ -1531,10 +1671,10 @@ class OutputPageTest extends MediaWikiTestCase { // Preferred interface: output is tidied 'SpecialNewimages' => [ [ "

\nMy message" ], - '

' . "\nMy message\n

" + '

' . "\nMy message

" ], 'List at start' => [ [ '* List' ], - "\n", + "", ], 'List not at start' => [ [ '* Not a list', false ], '

* Not a list

', @@ -1546,7 +1686,7 @@ class OutputPageTest extends MediaWikiTestCase { "

* Some page

", ], 'EditPage' => [ [ "
{{PAGENAME}}", true, Title::newFromText( 'Talk:Some page' ) ], - '
' . "Some page\n
" + '
' . "Some page
" ], ], 'wrapWikiTextAsInterface' => [ @@ -1555,7 +1695,7 @@ class OutputPageTest extends MediaWikiTestCase { "

text\n

" ], 'Spurious
' => [ [ 'wrapperClass', 'text
more' ], - "

text

more\n
" + "

text

more
" ], 'Extra newlines would break

wrappers' => [ [ 'two classes', "1\n\n2\n\n3" ], "

1\n

2\n

3\n

" @@ -1744,7 +1884,6 @@ class OutputPageTest extends MediaWikiTestCase { // @todo Make sure to test the following in addParserOutputMetadata() as well when we add tests // for them: // * addModules() - // * addModuleScripts() // * addModuleStyles() // * addJsConfigVars() // * enableOOUI() @@ -1830,12 +1969,12 @@ class OutputPageTest extends MediaWikiTestCase { return [ 'List at start of line (content)' => [ [ '* List', true, false ], - "
  • List
\n
", - "\n", + "
  • List
", + "", ], 'List at start of line (interface)' => [ [ '* List', true, true ], - "\n", + "", ], 'List not at start (content)' => [ [ "* ''Not'' list", false, false ], @@ -1873,9 +2012,8 @@ class OutputPageTest extends MediaWikiTestCase { 'No section edit links' => [ [ '== Header ==' ], '

' . - "Header

\n
", - '

Header

' . - "\n", + "Header
", + '

Header

', ] ]; } @@ -1926,7 +2064,7 @@ class OutputPageTest extends MediaWikiTestCase { return [ 'List at start of line' => [ [ '* List', true ], - "\n", + "", ], 'List not at start' => [ [ "* ''Not'' list", false ], @@ -1945,8 +2083,7 @@ class OutputPageTest extends MediaWikiTestCase { ], 'No section edit links' => [ [ '== Header ==' ], - '

Header

' . - "\n", + '

Header

', ] ]; } @@ -2531,7 +2668,7 @@ class OutputPageTest extends MediaWikiTestCase { $nonce->setAccessible( true ); $nonce->setValue( $out, 'secret' ); $rl = $out->getResourceLoader(); - $rl->setMessageBlobStore( new NullMessageBlobStore() ); + $rl->setMessageBlobStore( $this->createMock( MessageBlobStore::class ) ); $rl->register( [ 'test.foo' => new ResourceLoaderTestModule( [ 'script' => 'mw.test.foo( { a: true } );', @@ -2574,27 +2711,27 @@ class OutputPageTest extends MediaWikiTestCase { // Single only=scripts load [ [ 'test.foo', ResourceLoaderModule::TYPE_SCRIPTS ], - "" ], // Multiple only=styles load [ [ [ 'test.baz', 'test.foo', 'test.bar' ], ResourceLoaderModule::TYPE_STYLES ], - '' + '' ], // Private embed (only=scripts) [ [ 'test.quux', ResourceLoaderModule::TYPE_SCRIPTS ], - "" ], // Load private module (combined) [ [ 'test.quux', ResourceLoaderModule::TYPE_COMBINED ], - "" @@ -2607,14 +2744,14 @@ class OutputPageTest extends MediaWikiTestCase { // noscript group [ [ 'test.noscript', ResourceLoaderModule::TYPE_STYLES ], - '' + '' ], // Load two modules in separate groups [ [ [ 'test.group.foo', 'test.group.bar' ], ResourceLoaderModule::TYPE_COMBINED ], - "" ], ]; @@ -2647,7 +2784,7 @@ class OutputPageTest extends MediaWikiTestCase { ->method( 'buildCssLinksArray' ) ->willReturn( [] ); $rl = $op->getResourceLoader(); - $rl->setMessageBlobStore( new NullMessageBlobStore() ); + $rl->setMessageBlobStore( $this->createMock( MessageBlobStore::class ) ); // Register custom modules $rl->register( [ @@ -2678,13 +2815,13 @@ class OutputPageTest extends MediaWikiTestCase { 'default logged-out' => [ 'exemptStyleModules' => [ 'site' => [ 'site.styles' ] ], '' . "\n" . - '', + '', ], 'default logged-in' => [ 'exemptStyleModules' => [ 'site' => [ 'site.styles' ], 'user' => [ 'user.styles' ] ], '' . "\n" . - '' . "\n" . - '', + '' . "\n" . + '', ], 'custom modules' => [ 'exemptStyleModules' => [ @@ -2692,10 +2829,10 @@ class OutputPageTest extends MediaWikiTestCase { 'user' => [ 'user.styles', 'example.user' ], ], '' . "\n" . - '' . "\n" . - '' . "\n" . - '' . "\n" . - '', + '' . "\n" . + '' . "\n" . + '' . "\n" . + '', ], ]; // phpcs:enable @@ -3051,21 +3188,3 @@ class OutputPageTest extends MediaWikiTestCase { return new OutputPage( $context ); } } - -/** - * MessageBlobStore that doesn't do anything - */ -class NullMessageBlobStore extends MessageBlobStore { - public function get( ResourceLoader $resourceLoader, $modules, $lang ) { - return []; - } - - public function updateModule( $name, ResourceLoaderModule $module, $lang ) { - } - - public function updateMessage( $key ) { - } - - public function clear() { - } -}