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; } }