diff options
Diffstat (limited to 'tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php')
-rw-r--r-- | tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php | 96 |
1 files changed, 89 insertions, 7 deletions
diff --git a/tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php b/tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php index 1f6a876e8fc1..16ad9411cd82 100644 --- a/tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php +++ b/tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php @@ -2,19 +2,27 @@ namespace MediaWiki\Tests\Rest\Handler; +use GenderCache; +use Language; +use MediaWiki\Interwiki\InterwikiLookup; +use MediaWiki\Linker\LinkTarget; use MediaWiki\Permissions\PermissionManager; use MediaWiki\Rest\Handler; use MediaWiki\Rest\HttpException; use MediaWiki\Rest\RequestInterface; use MediaWiki\Rest\Response; use MediaWiki\Rest\ResponseFactory; +use MediaWiki\Rest\ResponseInterface; use MediaWiki\Rest\Router; use MediaWiki\Rest\Validator\Validator; use MediaWiki\User\UserIdentityValue; use MediaWikiTestCaseTrait; +use MediaWikiTitleCodec; +use NamespaceInfo; use PHPUnit\Framework\Assert; use PHPUnit\Framework\MockObject\MockObject; use Title; +use User; use Wikimedia\Message\ITextFormatter; use Wikimedia\Message\MessageValue; use Wikimedia\ObjectFactory; @@ -50,7 +58,7 @@ trait HandlerTestTrait { * @param RequestInterface $request * @param array $config * - * @return Response + * @return ResponseInterface */ private function executeHandler( Handler $handler, RequestInterface $request, $config = [] ) { $formatter = $this->createMock( ITextFormatter::class ); @@ -83,11 +91,21 @@ trait HandlerTestTrait { $handler->init( $router, $request, $config, $responseFactory ); $handler->validate( $validator ); + + // Check conditional request headers + $earlyResponse = $handler->checkPreconditions(); + if ( $earlyResponse ) { + return $earlyResponse; + } + $ret = $handler->execute(); $response = $ret instanceof Response ? $ret : $responseFactory->createFromReturnValue( $ret ); + // Set Last-Modified and ETag headers in the response if available + $handler->applyConditionalResponseHeaders( $response ); + return $response; } @@ -141,22 +159,86 @@ trait HandlerTestTrait { } /** - * @return Title + * @param string $text + * @param array $props Additional properties to set. Supported keys: + * - id: int + * - namespace: int + * + * @return Title|MockObject */ - private function makeMockTitle( $text, $id = null, $model = 'UNKNOWN' ) { - $id = $id ?? ++$this->pageIdCounter; + private function makeMockTitle( $text, array $props = [] ) { + $id = $props['id'] ?? ++$this->pageIdCounter; + $ns = $props['namespace'] ?? 0; + $nsName = $ns ? "ns$ns:" : ''; + + $preText = $text; + $text = preg_replace( '/^[\w ]*?:/', '', $text ); + + // If no namespace prefix was given, add one if needed. + if ( $preText == $text && $ns ) { + $preText = $nsName . $text; + } /** @var Title|MockObject $title */ $title = $this->createMock( Title::class ); + $title->method( 'getText' )->willReturn( str_replace( '_', ' ', $text ) ); $title->method( 'getDBkey' )->willReturn( str_replace( ' ', '_', $text ) ); - $title->method( 'getPrefixedText' )->willReturn( str_replace( '_', ' ', $text ) ); - $title->method( 'getPrefixedDBkey' )->willReturn( str_replace( ' ', '_', $text ) ); + + $title->method( 'getPrefixedText' )->willReturn( str_replace( '_', ' ', $preText ) ); + $title->method( 'getPrefixedDBkey' )->willReturn( str_replace( ' ', '_', $preText ) ); + $title->method( 'getArticleID' )->willReturn( $id ); + $title->method( 'getNamespace' )->willReturn( $props['namespace'] ?? 0 ); $title->method( 'exists' )->willReturn( $id > 0 ); - $title->method( 'getContentModel' )->willReturn( $model ); + $title->method( 'getTouched' )->willReturn( $id ? '20200101223344' : false ); return $title; } + /** + * @return PermissionManager|MockObject + */ + private function makeMockPermissionManager() { + /** @var PermissionManager|MockObject $permissionManager */ + $permissionManager = $this->createNoOpMock( + PermissionManager::class, [ 'userCan' ] + ); + $permissionManager->method( 'userCan' ) + ->willReturnCallback( function ( $action, User $user, LinkTarget $page ) { + return !preg_match( '/Forbidden/', $page->getText() ); + } ); + + return $permissionManager; + } + + /** + * @return MediaWikiTitleCodec + */ + private function makeMockTitleCodec() { + /** @var Language|MockObject $language */ + $language = $this->createNoOpMock( Language::class, [ 'ucfirst' ] ); + $language->method( 'ucfirst' )->willReturnCallback( 'ucfirst' ); + + /** @var GenderCache|MockObject $genderCache */ + $genderCache = $this->createNoOpMock( GenderCache::class ); + + /** @var InterwikiLookup|MockObject $interwikiLookup */ + $interwikiLookup = $this->createNoOpMock( InterwikiLookup::class ); + + /** @var NamespaceInfo|MockObject $namespaceInfo */ + $namespaceInfo = $this->createNoOpMock( NamespaceInfo::class, [ 'isCapitalized' ] ); + $namespaceInfo->method( 'isCapitalized' )->willReturn( true ); + + $titleCodec = new MediaWikiTitleCodec( + $language, + $genderCache, + [ 'en' ], + $interwikiLookup, + $namespaceInfo + ); + + return $titleCodec; + } + } |