aboutsummaryrefslogtreecommitdiffstats
path: root/tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php
diff options
context:
space:
mode:
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>2020-03-26 03:15:58 +0000
committerGerrit Code Review <gerrit@wikimedia.org>2020-03-26 03:15:58 +0000
commitfde16090b698268747e04d32789471d78c35b072 (patch)
tree2c902e1510de0aa712ff990843482bc05c0a4934 /tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php
parent0d2c52919c41e144b08c43885307deb0f1a6c5ca (diff)
parent22561b64a7c2b0c4402a1601824fd2705b847ca5 (diff)
downloadmediawikicore-fde16090b698268747e04d32789471d78c35b072.tar.gz
mediawikicore-fde16090b698268747e04d32789471d78c35b072.zip
Merge "REST endpoints: Add etag and last-modified headers"
Diffstat (limited to 'tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php')
-rw-r--r--tests/phpunit/unit/includes/Rest/Handler/HandlerTestTrait.php96
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;
+ }
+
}