API warnings and error messages are currently hard-coded English strings. This patch changes that. With a few exceptions, this patch should be compatible with non-updated extensions: * The change to ApiBase::$messageMap will blow up anything trying to mess with it. * The changes to the 'ApiCheckCanExecute' hook will cause a wrong (probably unparsed) error message to be emitted for extensions not already using an ApiMessage. Unless they're currently broken like Wikibase. Bug: T37074 Bug: T47843 Depends-On: Ia2b66b57cd4eaddc30b3ffdd7b97d6ca3e02d898 Depends-On: I2e1bb975bb0045476c03ebe6cdec00259bae22ec Depends-On: I53987bf87c48f6c00deec17a8e957d24fcc3eaa6 Depends-On: Ibf93a459eb62d30f7c70d20e91ec9faeb80d10ed Depends-On: I3cf889811f44a15935e454dd42f081164d4a098c Depends-On: Ieae527de86735ddcba34724730e8730fb277b99b Depends-On: I535344c29d51521147c2a26c341dae38cec3e931 Change-Id: Iae0e2ce3bd42dd4776a9779664086119ac188412
198 lines
7.2 KiB
PHP
198 lines
7.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @covers ApiContinuationManager
|
|
* @group API
|
|
*/
|
|
class ApiContinuationManagerTest extends MediaWikiTestCase {
|
|
|
|
private static function getManager( $continue, $allModules, $generatedModules ) {
|
|
$context = new DerivativeContext( RequestContext::getMain() );
|
|
$context->setRequest( new FauxRequest( [ 'continue' => $continue ] ) );
|
|
$main = new ApiMain( $context );
|
|
return new ApiContinuationManager( $main, $allModules, $generatedModules );
|
|
}
|
|
|
|
public function testContinuation() {
|
|
$allModules = [
|
|
new MockApiQueryBase( 'mock1' ),
|
|
new MockApiQueryBase( 'mock2' ),
|
|
new MockApiQueryBase( 'mocklist' ),
|
|
];
|
|
$generator = new MockApiQueryBase( 'generator' );
|
|
|
|
$manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( 'ApiMain', $manager->getSource() );
|
|
$this->assertSame( false, $manager->isGeneratorDone() );
|
|
$this->assertSame( $allModules, $manager->getRunModules() );
|
|
$manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
|
|
$manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
|
|
$manager->addGeneratorContinueParam( $generator, 'gcontinue', 3 );
|
|
$this->assertSame( [ [
|
|
'mlcontinue' => 2,
|
|
'm1continue' => '1|2',
|
|
'continue' => '||mock2',
|
|
], false ], $manager->getContinuation() );
|
|
$this->assertSame( [
|
|
'mock1' => [ 'm1continue' => '1|2' ],
|
|
'mocklist' => [ 'mlcontinue' => 2 ],
|
|
'generator' => [ 'gcontinue' => 3 ],
|
|
], $manager->getRawContinuation() );
|
|
|
|
$result = new ApiResult( 0 );
|
|
$manager->setContinuationIntoResult( $result );
|
|
$this->assertSame( [
|
|
'mlcontinue' => 2,
|
|
'm1continue' => '1|2',
|
|
'continue' => '||mock2',
|
|
], $result->getResultData( 'continue' ) );
|
|
$this->assertSame( null, $result->getResultData( 'batchcomplete' ) );
|
|
|
|
$manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( false, $manager->isGeneratorDone() );
|
|
$this->assertSame( $allModules, $manager->getRunModules() );
|
|
$manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
|
|
$manager->addGeneratorContinueParam( $generator, 'gcontinue', [ 3, 4 ] );
|
|
$this->assertSame( [ [
|
|
'm1continue' => '1|2',
|
|
'continue' => '||mock2|mocklist',
|
|
], false ], $manager->getContinuation() );
|
|
$this->assertSame( [
|
|
'mock1' => [ 'm1continue' => '1|2' ],
|
|
'generator' => [ 'gcontinue' => '3|4' ],
|
|
], $manager->getRawContinuation() );
|
|
|
|
$manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( false, $manager->isGeneratorDone() );
|
|
$this->assertSame( $allModules, $manager->getRunModules() );
|
|
$manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
|
|
$manager->addGeneratorContinueParam( $generator, 'gcontinue', 3 );
|
|
$this->assertSame( [ [
|
|
'mlcontinue' => 2,
|
|
'gcontinue' => 3,
|
|
'continue' => 'gcontinue||',
|
|
], true ], $manager->getContinuation() );
|
|
$this->assertSame( [
|
|
'mocklist' => [ 'mlcontinue' => 2 ],
|
|
'generator' => [ 'gcontinue' => 3 ],
|
|
], $manager->getRawContinuation() );
|
|
|
|
$result = new ApiResult( 0 );
|
|
$manager->setContinuationIntoResult( $result );
|
|
$this->assertSame( [
|
|
'mlcontinue' => 2,
|
|
'gcontinue' => 3,
|
|
'continue' => 'gcontinue||',
|
|
], $result->getResultData( 'continue' ) );
|
|
$this->assertSame( true, $result->getResultData( 'batchcomplete' ) );
|
|
|
|
$manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( false, $manager->isGeneratorDone() );
|
|
$this->assertSame( $allModules, $manager->getRunModules() );
|
|
$manager->addGeneratorContinueParam( $generator, 'gcontinue', 3 );
|
|
$this->assertSame( [ [
|
|
'gcontinue' => 3,
|
|
'continue' => 'gcontinue||mocklist',
|
|
], true ], $manager->getContinuation() );
|
|
$this->assertSame( [
|
|
'generator' => [ 'gcontinue' => 3 ],
|
|
], $manager->getRawContinuation() );
|
|
|
|
$manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( false, $manager->isGeneratorDone() );
|
|
$this->assertSame( $allModules, $manager->getRunModules() );
|
|
$manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
|
|
$manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
|
|
$this->assertSame( [ [
|
|
'mlcontinue' => 2,
|
|
'm1continue' => '1|2',
|
|
'continue' => '||mock2',
|
|
], false ], $manager->getContinuation() );
|
|
$this->assertSame( [
|
|
'mock1' => [ 'm1continue' => '1|2' ],
|
|
'mocklist' => [ 'mlcontinue' => 2 ],
|
|
], $manager->getRawContinuation() );
|
|
|
|
$manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( false, $manager->isGeneratorDone() );
|
|
$this->assertSame( $allModules, $manager->getRunModules() );
|
|
$manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
|
|
$this->assertSame( [ [
|
|
'm1continue' => '1|2',
|
|
'continue' => '||mock2|mocklist',
|
|
], false ], $manager->getContinuation() );
|
|
$this->assertSame( [
|
|
'mock1' => [ 'm1continue' => '1|2' ],
|
|
], $manager->getRawContinuation() );
|
|
|
|
$manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( false, $manager->isGeneratorDone() );
|
|
$this->assertSame( $allModules, $manager->getRunModules() );
|
|
$manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
|
|
$this->assertSame( [ [
|
|
'mlcontinue' => 2,
|
|
'continue' => '-||mock1|mock2',
|
|
], true ], $manager->getContinuation() );
|
|
$this->assertSame( [
|
|
'mocklist' => [ 'mlcontinue' => 2 ],
|
|
], $manager->getRawContinuation() );
|
|
|
|
$manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( false, $manager->isGeneratorDone() );
|
|
$this->assertSame( $allModules, $manager->getRunModules() );
|
|
$this->assertSame( [ [], true ], $manager->getContinuation() );
|
|
$this->assertSame( [], $manager->getRawContinuation() );
|
|
|
|
$manager = self::getManager( '||mock2', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( false, $manager->isGeneratorDone() );
|
|
$this->assertSame(
|
|
array_values( array_diff_key( $allModules, [ 1 => 1 ] ) ),
|
|
$manager->getRunModules()
|
|
);
|
|
|
|
$manager = self::getManager( '-||', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->assertSame( true, $manager->isGeneratorDone() );
|
|
$this->assertSame(
|
|
array_values( array_diff_key( $allModules, [ 0 => 0, 1 => 1 ] ) ),
|
|
$manager->getRunModules()
|
|
);
|
|
|
|
try {
|
|
self::getManager( 'foo', $allModules, [ 'mock1', 'mock2' ] );
|
|
$this->fail( 'Expected exception not thrown' );
|
|
} catch ( ApiUsageException $ex ) {
|
|
$this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'badcontinue' ),
|
|
'Expected exception'
|
|
);
|
|
}
|
|
|
|
$manager = self::getManager(
|
|
'||mock2',
|
|
array_slice( $allModules, 0, 2 ),
|
|
[ 'mock1', 'mock2' ]
|
|
);
|
|
try {
|
|
$manager->addContinueParam( $allModules[1], 'm2continue', 1 );
|
|
$this->fail( 'Expected exception not thrown' );
|
|
} catch ( UnexpectedValueException $ex ) {
|
|
$this->assertSame(
|
|
'Module \'mock2\' was not supposed to have been executed, ' .
|
|
'but it was executed anyway',
|
|
$ex->getMessage(),
|
|
'Expected exception'
|
|
);
|
|
}
|
|
try {
|
|
$manager->addContinueParam( $allModules[2], 'mlcontinue', 1 );
|
|
$this->fail( 'Expected exception not thrown' );
|
|
} catch ( UnexpectedValueException $ex ) {
|
|
$this->assertSame(
|
|
'Module \'mocklist\' called ApiContinuationManager::addContinueParam ' .
|
|
'but was not passed to ApiContinuationManager::__construct',
|
|
$ex->getMessage(),
|
|
'Expected exception'
|
|
);
|
|
}
|
|
}
|
|
|
|
}
|