wiki.techinc.nl/tests/phpunit/includes/api/format/ApiFormatTestBase.php
jdlrobson 7f0412e644 Expose portlet data in SkinMustache
This data structure is sufficient to generate menus in
all Wikimedia deployed skins.

This new method will be used immediately in Example skin:
 Ifb30a2c1314692c2869bd99c523e19c821be1f08

and Vector skin:
I5f7adc1840441b508ffee40139b85b64021789e6

Bug: T262098
Bug: T255924
Change-Id: I1a163cac0bff7620dcac50350cb6b93445a0cfbc
2020-09-22 14:06:29 -07:00

103 lines
3.1 KiB
PHP

<?php
abstract class ApiFormatTestBase extends MediaWikiIntegrationTestCase {
/**
* Name of the formatter being tested
* @var string
*/
protected $printerName;
/**
* Return general data to be encoded for testing
* @return array See self::testGeneralEncoding
* @throws BadMethodCallException
*/
public static function provideGeneralEncoding() {
throw new BadMethodCallException( static::class . ' must implement ' . __METHOD__ );
}
/**
* Get the formatter output for the given input data
* @param array $params Query parameters
* @param array $data Data to encode
* @param array $options Options. If passed a string, the string is treated
* as the 'class' option.
* - name: Format name, rather than $this->printerName
* - class: If set, register 'name' with this class (and 'factory', if that's set)
* - factory: Used with 'class' to register at runtime
* - returnPrinter: Return the printer object
* @return string|array The string if $options['returnPrinter'] isn't set, or an array if it is:
* - text: Output text string
* - printer: ApiFormatBase
* @throws Exception
*/
protected function encodeData( array $params, array $data, $options = [] ) {
if ( is_string( $options ) ) {
$options = [ 'class' => $options ];
}
$printerName = $options['name'] ?? $this->printerName;
$flags = $options['flags'] ?? 0;
$context = new RequestContext;
$fauxRequest = new FauxRequest( $params, true );
$fauxRequest->setRequestURL( 'https://' );
$context->setRequest( $fauxRequest );
$main = new ApiMain( $context );
if ( isset( $options['class'] ) ) {
$spec = [
'class' => $options['class']
];
if ( isset( $options['factory'] ) ) {
$spec['factory'] = $options['factory'];
}
$main->getModuleManager()->addModule( $printerName, 'format', $spec );
}
$result = $main->getResult();
$result->addArrayType( null, 'default' );
foreach ( $data as $k => $v ) {
$result->addValue( null, $k, $v, $flags );
}
$ret = [];
$printer = $main->createPrinterByName( $printerName );
$printer->initPrinter();
$printer->execute();
ob_start();
try {
$printer->closePrinter();
$ret['text'] = ob_get_clean();
} catch ( Exception $ex ) {
ob_end_clean();
throw $ex;
}
if ( !empty( $options['returnPrinter'] ) ) {
$ret['printer'] = $printer;
}
return count( $ret ) === 1 ? $ret['text'] : $ret;
}
/**
* @dataProvider provideGeneralEncoding
* @param array $data Data to be encoded
* @param string|Exception $expect String to expect, or exception expected to be thrown
* @param array $params Query parameters to set in the FauxRequest
* @param array $options Options to pass to self::encodeData()
*/
public function testGeneralEncoding(
array $data, $expect, array $params = [], array $options = []
) {
if ( $expect instanceof Exception ) {
$this->expectException( get_class( $expect ) );
$this->expectExceptionMessage( $expect->getMessage() );
$this->encodeData( $params, $data, $options ); // Should throw
} else {
$this->assertSame( $expect, $this->encodeData( $params, $data, $options ) );
}
}
}