Redoing I5ea70120d74 but without moving WebRequest that caused issues with phan-taint-plugin. Moving: - DerivativeRequest - FauxRequest - FauxRequestUpload - PathRouter - WebRequestUpload Bug: T321882 Change-Id: I832b133aaf61ee9f6190b0227d2f3de99bd1717b
136 lines
4.5 KiB
PHP
136 lines
4.5 KiB
PHP
<?php
|
|
|
|
use MediaWiki\Actions\ActionFactory;
|
|
use MediaWiki\Permissions\Authority;
|
|
use MediaWiki\Request\FauxRequest;
|
|
|
|
/**
|
|
* @covers DerivativeContext
|
|
*/
|
|
class DerivativeContextTest extends MediaWikiIntegrationTestCase {
|
|
|
|
public function provideGetterSetter() {
|
|
$initialContext = new RequestContext();
|
|
yield 'get/set Context' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => $initialContext,
|
|
'newValue' => new RequestContext(),
|
|
'getter' => 'getContext',
|
|
'setter' => 'setContext'
|
|
];
|
|
yield 'get/set Config' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => new HashConfig(),
|
|
'newValue' => new HashConfig(),
|
|
'getter' => 'getConfig',
|
|
'setter' => 'setConfig'
|
|
];
|
|
yield 'get/set OutputPage' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => $this->createNoOpMock( OutputPage::class ),
|
|
'newValue' => $this->createNoOpMock( OutputPage::class ),
|
|
'getter' => 'getOutput',
|
|
'setter' => 'setOutput'
|
|
];
|
|
yield 'get/set User' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => $this->createNoOpMock( User::class ),
|
|
'newValue' => $this->createNoOpMock( User::class ),
|
|
'getter' => 'getUser',
|
|
'setter' => 'setUser'
|
|
];
|
|
yield 'get/set Authority' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => $this->createNoOpMock( Authority::class ),
|
|
'newValue' => $this->createNoOpMock( Authority::class ),
|
|
'getter' => 'getAuthority',
|
|
'setter' => 'setAuthority'
|
|
];
|
|
yield 'get/set Language' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => $this->createNoOpMock( Language::class ),
|
|
'newValue' => $this->createNoOpMock( Language::class ),
|
|
'getter' => 'getLanguage',
|
|
'setter' => 'setLanguage'
|
|
];
|
|
yield 'get/set WebRequest' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => new FauxRequest(),
|
|
'newValue' => new FauxRequest(),
|
|
'getter' => 'getRequest',
|
|
'setter' => 'setRequest'
|
|
];
|
|
$initialTitle = $this->createMock( Title::class );
|
|
$initialTitle->expects( $this->any() )->method( 'equals' );
|
|
yield 'get/set Title' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => $initialTitle,
|
|
'newValue' => $this->createNoOpMock( Title::class ),
|
|
'getter' => 'getTitle',
|
|
'setter' => 'setTitle',
|
|
];
|
|
$initialWikiPage = $this->createMock( WikiPage::class );
|
|
$initialWikiPage->expects( $this->any() )->method( 'getTitle' )->willReturn( $initialTitle );
|
|
$newWikiPage = $this->createMock( WikiPage::class );
|
|
$newWikiPage->expects( $this->any() )->method( 'getTitle' );
|
|
yield 'get/set WikiPage' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => $initialWikiPage,
|
|
'newValue' => $newWikiPage,
|
|
'getter' => 'getWikiPage',
|
|
'setter' => 'setWikiPage',
|
|
];
|
|
yield 'get/set ActionName' => [
|
|
'initialContext' => $initialContext,
|
|
'initialValue' => 'initActionName',
|
|
'newValue' => 'newActionName',
|
|
'getter' => 'getActionName',
|
|
'setter' => 'setActionName',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideGetterSetter
|
|
*/
|
|
public function testGetterSetter(
|
|
IContextSource $initialContext,
|
|
$initialValue,
|
|
$newValue,
|
|
string $getter,
|
|
string $setter
|
|
) {
|
|
if ( $setter !== 'setContext' ) {
|
|
$initialContext->$setter( $initialValue );
|
|
}
|
|
|
|
$derivativeContext = new DerivativeContext( $initialContext );
|
|
$this->assertSame( $initialValue, $derivativeContext->$getter(), 'Get inital value' );
|
|
$derivativeContext->$setter( $newValue );
|
|
$this->assertSame( $newValue, $derivativeContext->$getter(), 'Get new value' );
|
|
}
|
|
|
|
public function testOverideActionName() {
|
|
$parent = new RequestContext();
|
|
$parent->setActionName( 'view' );
|
|
|
|
$factory = $this->createMock( ActionFactory::class );
|
|
$factory
|
|
->method( 'getActionName' )
|
|
->willReturnOnConsecutiveCalls( 'foo', 'bar', 'baz' );
|
|
$this->setService( 'ActionFactory', $factory );
|
|
|
|
$derivative = new DerivativeContext( $parent );
|
|
$this->assertSame( 'view', $derivative->getActionName(), 'default to parent cache' );
|
|
|
|
$derivative->setTitle( $this->createMock( Title::class ) );
|
|
$this->assertSame( 'foo', $derivative->getActionName(), 'recompute after change' );
|
|
$this->assertSame( 'foo', $derivative->getActionName(), 'local cache' );
|
|
|
|
$derivative->setWikiPage( $this->createMock( WikiPage::class ) );
|
|
$this->assertSame( 'bar', $derivative->getActionName(), 'recompute after change' );
|
|
$this->assertSame( 'bar', $derivative->getActionName(), 'local cache' );
|
|
|
|
$derivative->setActionName( 'custom' );
|
|
$this->assertSame( 'custom', $derivative->getActionName(), 'override' );
|
|
}
|
|
}
|