1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
<?php
namespace MediaWiki\Tests\Rest\Handler;
use ApiBase;
use ApiMain;
use Exception;
use FauxRequest;
use MediaWiki\Session\Session;
use MediaWiki\Session\SessionId;
use MediaWiki\Session\SessionProviderInterface;
use PHPUnit\Framework\MockObject\MockBuilder;
use PHPUnit\Framework\MockObject\MockObject;
use RequestContext;
/**
* 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(
function () use ( $module, $resultData, $throwException ) {
if ( $throwException ) {
throw $throwException;
}
$res = $module->getResult();
foreach ( $resultData as $key => $value ) {
$res->addValue( null, $key, $value );
}
}
);
return $module;
}
/**
* @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 */
$session = $this->createNoOpMock( Session::class, [ 'getSessionId', 'getProvider' ] );
$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() );
$testContext = RequestContext::getMain();
$fauxContext = new RequestContext();
$fauxContext->setRequest( $fauxRequest );
$fauxContext->setUser( $testContext->getUser() );
$fauxContext->setLanguage( $testContext->getLanguage() );
$apiMain = new ApiMain( $fauxContext, true );
return $apiMain;
}
}
|