File: SpecialTalkPageTest.php

package info (click to toggle)
mediawiki 1%3A1.43.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 417,464 kB
  • sloc: php: 1,062,949; javascript: 664,290; sql: 9,714; python: 5,458; xml: 3,489; sh: 1,131; makefile: 64
file content (88 lines) | stat: -rw-r--r-- 2,881 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php

namespace MediaWiki\Tests\Integration\Specials\Redirects;

use MediaWiki\Context\RequestContext;
use MediaWiki\Output\OutputPage;
use MediaWiki\Request\FauxRequest;
use MediaWiki\Specials\Redirects\SpecialTalkPage;
use MediaWiki\Title\Title;
use MediaWikiIntegrationTestCase;

/**
 * @covers \MediaWiki\Specials\Redirects\SpecialTalkPage
 *
 * @license GPL-2.0-or-later
 */
class SpecialTalkPageTest extends MediaWikiIntegrationTestCase {

	private function executeSpecialPageAndGetOutput(
		string $subpage = '',
		?string $target = null
	): OutputPage {
		$services = $this->getServiceContainer();
		$context = new RequestContext();
		if ( $target !== null ) {
			$request = new FauxRequest( [ 'target' => $target ], true );
		} else {
			$request = new FauxRequest();
		}
		$context->setRequest( $request );
		$context->setTitle( Title::newFromText( 'Special:TalkPage' ) );
		$context->setLanguage( $services->getLanguageFactory()->getLanguage( 'qqx' ) );
		$page = new SpecialTalkPage( $services->getTitleParser() );
		$page->setContext( $context );

		$page->execute( $subpage );

		return $page->getOutput();
	}

	/** @dataProvider provideRedirects */
	public function testRedirect( $subpage, $target, $expectedUrl, $expectedRedirect ) {
		$output = $this->executeSpecialPageAndGetOutput( $subpage, $target );

		$this->assertSame( $expectedUrl, $output->getRedirect(), 'should redirect to URL' );

		$this->assertHTMLEquals( $expectedRedirect, $output->getHTML(), 'redirect should contain appropriate HTML' );
	}

	public function provideRedirects() {
		$subjectTitleText = 'MediaWiki:ok';
		$subjectTitle = Title::newFromText( $subjectTitleText );
		$talkTitle = $subjectTitle->getTalkPageIfDefined();
		$talkUrl = $talkTitle->getFullUrlForRedirect();

		$standardRedirectHTML = "<div class=\"mw-specialpage-summary\">\n<p>(talkpage-summary)\n</p>\n</div>";

		yield [ $subjectTitleText, null, $talkUrl, $standardRedirectHTML ];
		yield [ '', $subjectTitleText, $talkUrl, $standardRedirectHTML ];
	}

	/** @dataProvider provideNoRedirects */
	public function testNoRedirect( $subpage, $target, ...$expectedHtmls ) {
		$output = $this->executeSpecialPageAndGetOutput( $subpage, $target );

		$this->assertSame( '', $output->getRedirect(), 'should not redirect' );
		foreach ( $expectedHtmls as $expectedHtml ) {
			$this->assertStringContainsString(
				$expectedHtml,
				$output->getHTML(),
				'should contain HTML'
			);
		}
		$this->assertStringContainsString(
			'<form',
			$output->getHTML(),
			'should contain form'
		);
	}

	public function provideNoRedirects() {
		yield [ '', null ];
		yield [ 'Special:TalkPage', null, 'title-invalid-talk-namespace', "value='Special:TalkPage'" ];
		yield [ '', 'Special:TalkPage', 'title-invalid-talk-namespace', "value='Special:TalkPage'" ];
		yield [ '', '<>', 'title-invalid-characters', "value='&lt;&gt;'" ];
	}

}