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