getMockBuilder( ApiBase::class ) ->setConstructorArgs( [ $main, $name ] ) ->onlyMethods( [ 'execute' ] ) ->getMock(); $module->method( 'execute' ) ->willReturnCallback( static function () use ( $module, $resultData, $throwException ) { if ( $throwException ) { throw $throwException; } $res = $module->getResult(); foreach ( $resultData as $key => $value ) { $res->addValue( null, $key, $value ); } } ); return $module; } /** * @param bool $csrfSafe * @return ApiMain */ private function getApiMain( $csrfSafe = false ) { $session = $this->getSession( $csrfSafe ); // NOTE: This being a MediaWiki\Request\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|\MediaWiki\Request\FauxRequest $fauxRequest */ $fauxRequest = $this->getMockBuilder( FauxRequest::class ) ->onlyMethods( [ 'getSession', 'getSessionId' ] ) ->getMock(); $fauxRequest->method( 'getSession' )->willReturn( $session ); $fauxRequest->method( 'getSessionId' )->willReturn( $session->getSessionId() ); /** @var Language|MockObject $language */ $language = $this->createNoOpMock( Language::class ); $testContext = RequestContext::getMain(); $fauxContext = new RequestContext(); $fauxContext->setRequest( $fauxRequest ); $fauxContext->setUser( $testContext->getUser() ); $fauxContext->setLanguage( $language ); return new ApiMain( $fauxContext, true ); } }