2020-03-02 12:28:10 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace MediaWiki\Tests\Rest\Handler;
|
|
|
|
|
|
|
|
|
|
use ApiBase;
|
|
|
|
|
use ApiMain;
|
|
|
|
|
use Exception;
|
2020-03-12 12:54:51 +00:00
|
|
|
use FauxRequest;
|
|
|
|
|
use MediaWiki\Session\Session;
|
|
|
|
|
use MediaWiki\Session\SessionId;
|
|
|
|
|
use MediaWiki\Session\SessionProviderInterface;
|
2020-03-02 12:28:10 +00:00
|
|
|
use PHPUnit\Framework\MockObject\MockBuilder;
|
|
|
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
2020-03-12 12:54:51 +00:00
|
|
|
use RequestContext;
|
2020-03-02 12:28:10 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* A trait providing utility functions for testing Handler classes
|
|
|
|
|
* derived from ActionModuleBasedHandler.
|
|
|
|
|
* This trait is intended to be used on subclasses of MediaWikiUnitTestCase
|
|
|
|
|
* or MediaWikiIntegrationTestCase.
|
|
|
|
|
*
|
|
|
|
|
* @package MediaWiki\Tests\Rest\Handler
|
|
|
|
|
*/
|
|
|
|
|
trait ActionModuleBasedHandlerTestTrait {
|
|
|
|
|
|
|
|
|
|
use HandlerTestTrait;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Expected to be provided by the class, probably inherited from TestCase.
|
|
|
|
|
*
|
|
|
|
|
* @param string $className
|
|
|
|
|
*
|
|
|
|
|
* @return MockBuilder
|
|
|
|
|
*/
|
|
|
|
|
abstract protected function getMockBuilder( $className ): MockBuilder;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param ApiMain $main
|
|
|
|
|
* @param string $name
|
|
|
|
|
* @param array $resultData
|
|
|
|
|
* @param Exception|null $throwException
|
|
|
|
|
*
|
|
|
|
|
* @return ApiBase|MockObject
|
|
|
|
|
*/
|
|
|
|
|
private function getDummyApiModule(
|
|
|
|
|
ApiMain $main,
|
|
|
|
|
$name,
|
|
|
|
|
$resultData,
|
|
|
|
|
Exception $throwException = null
|
|
|
|
|
) {
|
|
|
|
|
/** @var ApiBase|MockObject $module */
|
|
|
|
|
$module = $this->getMockBuilder( ApiBase::class )
|
|
|
|
|
->setConstructorArgs( [ $main, $name ] )
|
|
|
|
|
->onlyMethods( [ 'execute' ] )
|
|
|
|
|
->getMock();
|
|
|
|
|
|
|
|
|
|
$module->method( 'execute' )
|
|
|
|
|
->willReturnCallback(
|
2021-02-07 13:10:36 +00:00
|
|
|
static function () use ( $module, $resultData, $throwException ) {
|
2020-03-02 12:28:10 +00:00
|
|
|
if ( $throwException ) {
|
|
|
|
|
throw $throwException;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$res = $module->getResult();
|
|
|
|
|
foreach ( $resultData as $key => $value ) {
|
|
|
|
|
$res->addValue( null, $key, $value );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return $module;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-12 12:54:51 +00:00
|
|
|
/**
|
2021-01-16 19:44:17 +00:00
|
|
|
* @param bool $csrfSafe
|
2020-03-12 12:54:51 +00:00
|
|
|
* @return ApiMain
|
|
|
|
|
*/
|
|
|
|
|
private function getApiMain( $csrfSafe = false ) {
|
|
|
|
|
/** @var SessionProviderInterface|MockObject $session */
|
|
|
|
|
$sessionProvider =
|
|
|
|
|
$this->createNoOpMock( SessionProviderInterface::class, [ 'safeAgainstCsrf' ] );
|
|
|
|
|
$sessionProvider->method( 'safeAgainstCsrf' )->willReturn( $csrfSafe );
|
|
|
|
|
|
|
|
|
|
/** @var Session|MockObject $session */
|
2021-08-05 06:54:11 +00:00
|
|
|
$session = $this->createNoOpMock( Session::class, [ 'getSessionId', 'getProvider' ] );
|
2020-03-12 12:54:51 +00:00
|
|
|
$session->method( 'getSessionId' )->willReturn( new SessionId( 'test' ) );
|
|
|
|
|
$session->method( 'getProvider' )->willReturn( $sessionProvider );
|
|
|
|
|
|
|
|
|
|
// NOTE: This being a FauxRequest instance triggers special case behavior
|
|
|
|
|
// in ApiMain, causing ApiMain::isInternalMode() to return true. Among other things,
|
|
|
|
|
// this causes ApiMain to throw errors rather than encode them in the result data.
|
|
|
|
|
/** @var MockObject|FauxRequest $fauxRequest */
|
|
|
|
|
$fauxRequest = $this->getMockBuilder( FauxRequest::class )
|
|
|
|
|
->onlyMethods( [ 'getSession', 'getSessionId' ] )
|
|
|
|
|
->getMock();
|
|
|
|
|
$fauxRequest->method( 'getSession' )->willReturn( $session );
|
|
|
|
|
$fauxRequest->method( 'getSessionId' )->willReturn( $session->getSessionId() );
|
|
|
|
|
|
2021-08-05 06:54:11 +00:00
|
|
|
$testContext = RequestContext::getMain();
|
|
|
|
|
|
2020-03-12 12:54:51 +00:00
|
|
|
$fauxContext = new RequestContext();
|
|
|
|
|
$fauxContext->setRequest( $fauxRequest );
|
|
|
|
|
$fauxContext->setUser( $testContext->getUser() );
|
|
|
|
|
$fauxContext->setLanguage( $testContext->getLanguage() );
|
|
|
|
|
|
|
|
|
|
$apiMain = new ApiMain( $fauxContext, true );
|
|
|
|
|
return $apiMain;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-02 12:28:10 +00:00
|
|
|
}
|