X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/tests/phpunit/includes/specials/SpecialPageDataTest.php diff --git a/tests/phpunit/includes/specials/SpecialPageDataTest.php b/tests/phpunit/includes/specials/SpecialPageDataTest.php new file mode 100644 index 00000000..3d0d3441 --- /dev/null +++ b/tests/phpunit/includes/specials/SpecialPageDataTest.php @@ -0,0 +1,149 @@ +getContext()->setOutput( new OutputPage( $page->getContext() ) ); + + $page->setRequestHandler( new PageDataRequestHandler() ); + + return $page; + } + + public function provideExecute() { + $cases = []; + + $cases['Empty request'] = [ '', [], [], '!!', 200 ]; + + $cases['Only title specified'] = [ + '', + [ 'target' => 'Helsinki' ], + [], + '!!', + 303, + [ 'Location' => '!.+!' ] + ]; + + $cases['Accept only HTML'] = [ + '', + [ 'target' => 'Helsinki' ], + [ 'Accept' => 'text/HTML' ], + '!!', + 303, + [ 'Location' => '!Helsinki$!' ] + ]; + + $cases['Accept only HTML with revid'] = [ + '', + [ + 'target' => 'Helsinki', + 'revision' => '4242', + ], + [ 'Accept' => 'text/HTML' ], + '!!', + 303, + [ 'Location' => '!Helsinki(\?|&)oldid=4242!' ] + ]; + + $cases['Nothing specified'] = [ + 'main/Helsinki', + [], + [], + '!!', + 303, + [ 'Location' => '!Helsinki&action=raw!' ] + ]; + + $cases['Nothing specified'] = [ + '/Helsinki', + [], + [], + '!!', + 303, + [ 'Location' => '!Helsinki&action=raw!' ] + ]; + + $cases['Invalid Accept header'] = [ + 'main/Helsinki', + [], + [ 'Accept' => 'text/foobar' ], + '!!', + 406, + [], + ]; + + return $cases; + } + + /** + * @dataProvider provideExecute + * + * @param string $subpage The subpage to request (or '') + * @param array $params Request parameters + * @param array $headers Request headers + * @param string $expRegExp Regex to match the output against. + * @param int $expCode Expected HTTP status code + * @param array $expHeaders Expected HTTP response headers + */ + public function testExecute( + $subpage, + array $params, + array $headers, + $expRegExp, + $expCode = 200, + array $expHeaders = [] + ) { + $request = new FauxRequest( $params ); + $request->response()->header( 'Status: 200 OK', true, 200 ); // init/reset + + foreach ( $headers as $name => $value ) { + $request->setHeader( strtoupper( $name ), $value ); + } + + try { + /* @var FauxResponse $response */ + list( $output, $response ) = $this->executeSpecialPage( $subpage, $request ); + + $this->assertEquals( $expCode, $response->getStatusCode(), "status code" ); + $this->assertRegExp( $expRegExp, $output, "output" ); + + foreach ( $expHeaders as $name => $exp ) { + $value = $response->getHeader( $name ); + $this->assertNotNull( $value, "header: $name" ); + $this->assertInternalType( 'string', $value, "header: $name" ); + $this->assertRegExp( $exp, $value, "header: $name" ); + } + } catch ( HttpError $e ) { + $this->assertEquals( $expCode, $e->getStatusCode(), "status code" ); + $this->assertRegExp( $expRegExp, $e->getHTML(), "error output" ); + } + } + + public function testSpecialPageWithoutParameters() { + $this->setContentLang( Language::factory( 'en' ) ); + $request = new FauxRequest(); + $request->response()->header( 'Status: 200 OK', true, 200 ); // init/reset + + list( $output, ) = $this->executeSpecialPage( '', $request ); + + $this->assertContains( + "Content negotiation applies based on your client's Accept header.", + $output, + "output" + ); + } + +}