wiki.techinc.nl/tests/phpunit/includes/api/format/ApiFormatPhpTest.php
Timo Tijhof 665e9b7bf2 Convert OutputHandler functions to a class
* Convert OutputHandler.php from global functions to a class.

  - wfOutputHandler → OutputHandler::handle
    (no alias, no usage outside core)
  - wfGzipHandler → OutputHandler::handleGzip
    (private, no usage outside class)
  - wfRequestExtension → OutputHandler::findUriExtension
    (private, no usage outside class)
  - wfMangleFlashPolicy → OutputHandler::mangleFlashPolicy
    (private, no usage outside class)
  - wfDoContentLength → OutputHandler::emitContentLength
    (private, no usage outside class)
  - wfHtmlValidationHandler → OutputHandler::validateAllHtml
    (private, no usage outside class)

* Add the class to autoload.php for exposure outside WebStart.
  Specifically, for use in ApiFormatPhpTest. This also removes the
  need to manually load the class because this code runs after
  Setup.php loads AutoLoader.php.

Bug: T189966
Change-Id: I27a41ec0ae0ee30aeb313a616323b967605c4055
2018-03-20 21:11:32 -07:00

139 lines
4.8 KiB
PHP

<?php
/**
* @group API
* @covers ApiFormatPhp
*/
class ApiFormatPhpTest extends ApiFormatTestBase {
protected $printerName = 'php';
private static function addFormatVersion( $format, $arr ) {
foreach ( $arr as &$p ) {
if ( !isset( $p[2] ) ) {
$p[2] = [ 'formatversion' => $format ];
} else {
$p[2]['formatversion'] = $format;
}
}
return $arr;
}
public static function provideGeneralEncoding() {
// phpcs:disable Generic.Files.LineLength
return array_merge(
self::addFormatVersion( 1, [
// Basic types
[ [ null ], 'a:1:{i:0;N;}' ],
[ [ true ], 'a:1:{i:0;s:0:"";}' ],
[ [ false ], 'a:0:{}' ],
[ [ true, ApiResult::META_BC_BOOLS => [ 0 ] ],
'a:1:{i:0;b:1;}' ],
[ [ false, ApiResult::META_BC_BOOLS => [ 0 ] ],
'a:1:{i:0;b:0;}' ],
[ [ 42 ], 'a:1:{i:0;i:42;}' ],
[ [ 42.5 ], 'a:1:{i:0;d:42.5;}' ],
[ [ 1e42 ], 'a:1:{i:0;d:1.0E+42;}' ],
[ [ 'foo' ], 'a:1:{i:0;s:3:"foo";}' ],
[ [ 'fóo' ], 'a:1:{i:0;s:4:"fóo";}' ],
// Arrays and objects
[ [ [] ], 'a:1:{i:0;a:0:{}}' ],
[ [ [ 1 ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
[ [ [ 'x' => 1 ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
[ [ [ 2 => 1 ] ], 'a:1:{i:0;a:1:{i:2;i:1;}}' ],
[ [ (object)[] ], 'a:1:{i:0;a:0:{}}' ],
[ [ [ 1, ApiResult::META_TYPE => 'assoc' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
[ [ [ 'x' => 1, ApiResult::META_TYPE => 'array' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
[ [ [ 'x' => 1, ApiResult::META_TYPE => 'kvp' ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
[ [ [ 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ] ],
'a:1:{i:0;a:1:{i:0;a:2:{s:3:"key";s:1:"x";s:1:"*";i:1;}}}' ],
[ [ [ 'x' => 1, ApiResult::META_TYPE => 'BCarray' ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
[ [ [ 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ] ], 'a:1:{i:0;a:2:{i:0;s:1:"a";i:1;s:1:"b";}}' ],
// Content
[ [ 'content' => 'foo', ApiResult::META_CONTENT => 'content' ],
'a:1:{s:1:"*";s:3:"foo";}' ],
// BC Subelements
[ [ 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => [ 'foo' ] ],
'a:1:{s:3:"foo";a:1:{s:1:"*";s:3:"foo";}}' ],
] ),
self::addFormatVersion( 2, [
// Basic types
[ [ null ], 'a:1:{i:0;N;}' ],
[ [ true ], 'a:1:{i:0;b:1;}' ],
[ [ false ], 'a:1:{i:0;b:0;}' ],
[ [ true, ApiResult::META_BC_BOOLS => [ 0 ] ],
'a:1:{i:0;b:1;}' ],
[ [ false, ApiResult::META_BC_BOOLS => [ 0 ] ],
'a:1:{i:0;b:0;}' ],
[ [ 42 ], 'a:1:{i:0;i:42;}' ],
[ [ 42.5 ], 'a:1:{i:0;d:42.5;}' ],
[ [ 1e42 ], 'a:1:{i:0;d:1.0E+42;}' ],
[ [ 'foo' ], 'a:1:{i:0;s:3:"foo";}' ],
[ [ 'fóo' ], 'a:1:{i:0;s:4:"fóo";}' ],
// Arrays and objects
[ [ [] ], 'a:1:{i:0;a:0:{}}' ],
[ [ [ 1 ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
[ [ [ 'x' => 1 ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
[ [ [ 2 => 1 ] ], 'a:1:{i:0;a:1:{i:2;i:1;}}' ],
[ [ (object)[] ], 'a:1:{i:0;a:0:{}}' ],
[ [ [ 1, ApiResult::META_TYPE => 'assoc' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
[ [ [ 'x' => 1, ApiResult::META_TYPE => 'array' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
[ [ [ 'x' => 1, ApiResult::META_TYPE => 'kvp' ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
[ [ [ 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ] ],
'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
[ [ [ 'x' => 1, ApiResult::META_TYPE => 'BCarray' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
[ [ [ 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ] ], 'a:1:{i:0;a:2:{i:0;s:1:"a";i:1;s:1:"b";}}' ],
// Content
[ [ 'content' => 'foo', ApiResult::META_CONTENT => 'content' ],
'a:1:{s:7:"content";s:3:"foo";}' ],
// BC Subelements
[ [ 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => [ 'foo' ] ],
'a:1:{s:3:"foo";s:3:"foo";}' ],
] )
);
// phpcs:enable
}
public function testCrossDomainMangling() {
$config = new HashConfig( [ 'MangleFlashPolicy' => false ] );
$context = new RequestContext;
$context->setConfig( new MultiConfig( [
$config,
$context->getConfig(),
] ) );
$main = new ApiMain( $context );
$main->getResult()->addValue( null, null, '< Cross-Domain-Policy >' );
$printer = $main->createPrinterByName( 'php' );
ob_start( 'MediaWiki\\OutputHandler::handle' );
$printer->initPrinter();
$printer->execute();
$printer->closePrinter();
$ret = ob_get_clean();
$this->assertSame( 'a:1:{i:0;s:23:"< Cross-Domain-Policy >";}', $ret );
$config->set( 'MangleFlashPolicy', true );
$printer = $main->createPrinterByName( 'php' );
ob_start( 'MediaWiki\\OutputHandler::handle' );
try {
$printer->initPrinter();
$printer->execute();
$printer->closePrinter();
ob_end_clean();
$this->fail( 'Expected exception not thrown' );
} catch ( ApiUsageException $ex ) {
ob_end_clean();
$this->assertTrue(
$ex->getStatusValue()->hasMessage( 'apierror-formatphp' ),
'Expected exception'
);
}
}
}