c93fe479c9dc890910e6d600924ef6d5e24855ac
[lhc/web/wiklou.git] / tests / phpunit / includes / specials / SpecialPageDataTest.php
1 <?php
2
3 /**
4 * @covers SpecialPageData
5 *
6 * @group Database
7 *
8 * @group SpecialPage
9 *
10 * @license GPL-2.0+
11 * @author Daniel Kinzler
12 */
13 class SpecialPageDataTest extends SpecialPageTestBase {
14
15 protected function newSpecialPage() {
16 $page = new SpecialPageData();
17
18 // why is this needed?
19 $page->getContext()->setOutput( new OutputPage( $page->getContext() ) );
20
21 $page->setRequestHandler( new PageDataRequestHandler() );
22
23 return $page;
24 }
25
26 public function provideExecute() {
27 $cases = [];
28
29 $cases['Empty request'] = [ '', [], [], '!!', 200 ];
30
31 $cases['Only title specified'] = [
32 '',
33 [ 'target' => 'Helsinki' ],
34 [],
35 '!!',
36 303,
37 [ 'Location' => '!.+!' ]
38 ];
39
40 $cases['Accept only HTML'] = [
41 '',
42 [ 'target' => 'Helsinki' ],
43 [ 'Accept' => 'text/HTML' ],
44 '!!',
45 303,
46 [ 'Location' => '!Helsinki$!' ]
47 ];
48
49 $cases['Accept only HTML with revid'] = [
50 '',
51 [
52 'target' => 'Helsinki',
53 'revision' => '4242',
54 ],
55 [ 'Accept' => 'text/HTML' ],
56 '!!',
57 303,
58 [ 'Location' => '!Helsinki(\?|&)oldid=4242!' ]
59 ];
60
61 $cases['Nothing specified'] = [
62 'main/Helsinki',
63 [],
64 [],
65 '!!',
66 303,
67 [ 'Location' => '!Helsinki&action=raw!' ]
68 ];
69
70 $cases['Nothing specified'] = [
71 '/Helsinki',
72 [],
73 [],
74 '!!',
75 303,
76 [ 'Location' => '!Helsinki&action=raw!' ]
77 ];
78
79 $cases['Invalid Accept header'] = [
80 'main/Helsinki',
81 [],
82 [ 'Accept' => 'text/foobar' ],
83 '!!',
84 406,
85 [],
86 ];
87
88 return $cases;
89 }
90
91 /**
92 * @dataProvider provideExecute
93 *
94 * @param string $subpage The subpage to request (or '')
95 * @param array $params Request parameters
96 * @param array $headers Request headers
97 * @param string $expRegExp Regex to match the output against.
98 * @param int $expCode Expected HTTP status code
99 * @param array $expHeaders Expected HTTP response headers
100 */
101 public function testExecute(
102 $subpage,
103 array $params,
104 array $headers,
105 $expRegExp,
106 $expCode = 200,
107 array $expHeaders = []
108 ) {
109 $request = new FauxRequest( $params );
110 $request->response()->header( 'Status: 200 OK', true, 200 ); // init/reset
111
112 foreach ( $headers as $name => $value ) {
113 $request->setHeader( strtoupper( $name ), $value );
114 }
115
116 try {
117 /* @var FauxResponse $response */
118 list( $output, $response ) = $this->executeSpecialPage( $subpage, $request );
119
120 $this->assertEquals( $expCode, $response->getStatusCode(), "status code" );
121 $this->assertRegExp( $expRegExp, $output, "output" );
122
123 foreach ( $expHeaders as $name => $exp ) {
124 $value = $response->getHeader( $name );
125 $this->assertNotNull( $value, "header: $name" );
126 $this->assertInternalType( 'string', $value, "header: $name" );
127 $this->assertRegExp( $exp, $value, "header: $name" );
128 }
129 } catch ( HttpError $e ) {
130 $this->assertEquals( $expCode, $e->getStatusCode(), "status code" );
131 $this->assertRegExp( $expRegExp, $e->getHTML(), "error output" );
132 }
133 }
134
135 public function testSpecialPageWithoutParameters() {
136 $this->setContentLang( Language::factory( 'en' ) );
137 $request = new FauxRequest();
138 $request->response()->header( 'Status: 200 OK', true, 200 ); // init/reset
139
140 list( $output, ) = $this->executeSpecialPage( '', $request );
141
142 $this->assertContains(
143 "Content negotiation applies based on you client's Accept header.",
144 $output,
145 "output"
146 );
147 }
148
149 }