Merge "tiny optimization Title::isValidRedirectTarget()"
[lhc/web/wiklou.git] / tests / phpunit / includes / MediaWikiTest.php
1 <?php
2
3 class MediaWikiTest extends MediaWikiTestCase {
4 protected function setUp() {
5 parent::setUp();
6
7 $this->setMwGlobals( array(
8 'wgServer' => 'http://example.org',
9 'wgScriptPath' => '/w',
10 'wgScript' => '/w/index.php',
11 'wgArticlePath' => '/wiki/$1',
12 'wgActionPaths' => array(),
13 ) );
14 }
15
16 public static function provideTryNormaliseRedirect() {
17 return array(
18 array(
19 // View: Canonical
20 'url' => 'http://example.org/wiki/Foo_Bar',
21 'query' => array(),
22 'title' => 'Foo_Bar',
23 'redirect' => false,
24 ),
25 array(
26 // View: Escaped title
27 'url' => 'http://example.org/wiki/Foo%20Bar',
28 'query' => array(),
29 'title' => 'Foo_Bar',
30 'redirect' => 'http://example.org/wiki/Foo_Bar',
31 ),
32 array(
33 // View: Script path
34 'url' => 'http://example.org/w/index.php?title=Foo_Bar',
35 'query' => array( 'title' => 'Foo_Bar' ),
36 'title' => 'Foo_Bar',
37 'redirect' => 'http://example.org/wiki/Foo_Bar',
38 ),
39 array(
40 // View: Script path with implicit title from page id
41 'url' => 'http://example.org/w/index.php?curid=123',
42 'query' => array( 'curid' => '123' ),
43 'title' => 'Foo_Bar',
44 'redirect' => false,
45 ),
46 array(
47 // View: Script path with implicit title from revision id
48 'url' => 'http://example.org/w/index.php?oldid=123',
49 'query' => array( 'oldid' => '123' ),
50 'title' => 'Foo_Bar',
51 'redirect' => false,
52 ),
53 array(
54 // View: Script path without title
55 'url' => 'http://example.org/w/index.php',
56 'query' => array(),
57 'title' => 'Main_Page',
58 'redirect' => 'http://example.org/wiki/Main_Page',
59 ),
60 array(
61 // View: Script path with empty title
62 'url' => 'http://example.org/w/index.php?title=',
63 'query' => array( 'title' => '' ),
64 'title' => 'Main_Page',
65 'redirect' => 'http://example.org/wiki/Main_Page',
66 ),
67 array(
68 // View: Index with escaped title
69 'url' => 'http://example.org/w/index.php?title=Foo%20Bar',
70 'query' => array( 'title' => 'Foo Bar' ),
71 'title' => 'Foo_Bar',
72 'redirect' => 'http://example.org/wiki/Foo_Bar',
73 ),
74 array(
75 // View: Script path with escaped title
76 'url' => 'http://example.org/w/?title=Foo_Bar',
77 'query' => array( 'title' => 'Foo_Bar' ),
78 'title' => 'Foo_Bar',
79 'redirect' => 'http://example.org/wiki/Foo_Bar',
80 ),
81 array(
82 // View: Root path with escaped title
83 'url' => 'http://example.org/?title=Foo_Bar',
84 'query' => array( 'title' => 'Foo_Bar' ),
85 'title' => 'Foo_Bar',
86 'redirect' => 'http://example.org/wiki/Foo_Bar',
87 ),
88 array(
89 // View: Canonical with redundant query
90 'url' => 'http://example.org/wiki/Foo_Bar?action=view',
91 'query' => array( 'action' => 'view' ),
92 'title' => 'Foo_Bar',
93 'redirect' => 'http://example.org/wiki/Foo_Bar',
94 ),
95 array(
96 // Edit: Canonical view url with action query
97 'url' => 'http://example.org/wiki/Foo_Bar?action=edit',
98 'query' => array( 'action' => 'edit' ),
99 'title' => 'Foo_Bar',
100 'redirect' => false,
101 ),
102 array(
103 // View: Index with action query
104 'url' => 'http://example.org/w/index.php?title=Foo_Bar&action=view',
105 'query' => array( 'title' => 'Foo_Bar', 'action' => 'view' ),
106 'title' => 'Foo_Bar',
107 'redirect' => 'http://example.org/wiki/Foo_Bar',
108 ),
109 array(
110 // Edit: Index with action query
111 'url' => 'http://example.org/w/index.php?title=Foo_Bar&action=edit',
112 'query' => array( 'title' => 'Foo_Bar', 'action' => 'edit' ),
113 'title' => 'Foo_Bar',
114 'redirect' => false,
115 ),
116 );
117 }
118
119 /**
120 * @dataProvider provideTryNormaliseRedirect
121 * @covers MediaWiki::tryNormaliseRedirect
122 */
123 public function testTryNormaliseRedirect( $url, $query, $title, $expectedRedirect = false ) {
124 // Set SERVER because interpolateTitle() doesn't use getRequestURL(),
125 // whereas tryNormaliseRedirect does().
126 $_SERVER['REQUEST_URI'] = $url;
127
128 $req = new FauxRequest( $query );
129 $req->setRequestURL( $url );
130 // This adds a virtual 'title' query parameter. Normally called from Setup.php
131 $req->interpolateTitle();
132
133 $titleObj = Title::newFromText( $title );
134
135 // Set global context since some involved code paths don't yet have context
136 $context = RequestContext::getMain();
137 $context->setRequest( $req );
138 $context->setTitle( $titleObj );
139
140 $mw = new MediaWiki( $context );
141
142 $method = new ReflectionMethod( $mw, 'tryNormaliseRedirect' );
143 $method->setAccessible( true );
144 $ret = $method->invoke( $mw, $titleObj );
145
146 $this->assertEquals(
147 $expectedRedirect !== false,
148 $ret,
149 'Return true only when redirecting'
150 );
151
152 $this->assertEquals(
153 $expectedRedirect ?: '',
154 $context->getOutput()->getRedirect()
155 );
156 }
157 }