wiki.techinc.nl/tests/phpunit/unit/includes/Settings/WikiFarmSettingsLoaderTest.php
daniel 90ccce647d WikiFarm: remove site detection based on domain name.
While detecting the site name based on the request domain is common,
the exact mappings used in practice differ a lot. If we implemented one,
we could never change it. It seems beter to require the requested site
to be identified explicitly.

Bug: T221535
Change-Id: I31c20e87bb7d5fc4565714e86f547b42bacea82f
2022-05-04 22:09:06 +02:00

157 lines
3.9 KiB
PHP

<?php
namespace phpunit\unit\includes\Settings;
use ExtensionRegistry;
use HashConfig;
use MediaWiki\MainConfigNames;
use MediaWiki\Settings\Config\ArrayConfigBuilder;
use MediaWiki\Settings\Config\PhpIniSink;
use MediaWiki\Settings\SettingsBuilder;
use MediaWiki\Settings\WikiFarmSettingsLoader;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
/**
* @covers \MediaWiki\Settings\WikiFarmSettingsLoader
*/
class WikiFarmSettingsLoaderTest extends TestCase {
private $originalServerVars = null;
/**
* @before
*/
public function serverVarsSetUp() {
$this->originalServerVars = $_SERVER;
}
/**
* @after
*/
public function serverVarsTearDown() {
$_SERVER = $this->originalServerVars;
}
/**
* @param array $params
* @return SettingsBuilder
*/
private function newSettingsBuilder( $params = [] ): SettingsBuilder {
return new SettingsBuilder(
__DIR__,
$params['extensionRegistry'] ?? $this->createMock( ExtensionRegistry::class ),
$params['configBuilder'] ?? new ArrayConfigBuilder(),
$params['phpIniSink'] ?? $this->createMock( PhpIniSink::class ),
$params['cache'] ?? null
);
}
/**
* @return SettingsBuilder|MockObject
*/
private function fakeSettingsBuilder(): SettingsBuilder {
$config = [
MainConfigNames::WikiFarmSettingsDirectory => 'test',
MainConfigNames::WikiFarmSettingsExtension => 'yaml',
];
$mock = $this->createMock( SettingsBuilder::class );
$mock->method( 'getConfig' )->willReturn( new HashConfig( $config ) );
$mock->method( 'fileExists' )->willReturn( true );
return $mock;
}
public function provideWikiFarmSettings() {
yield [
[
'WikiFarmSettingsDirectory' => __DIR__ . '/fixtures/sites',
'WikiFarmSettingsExtension' => 'yaml',
],
'alpha',
[ 'SiteName' => 'Alpha Wiki' ]
];
yield [
[
'WikiFarmSettingsDirectory' => __DIR__ . '/fixtures/sites',
'WikiFarmSettingsExtension' => 'json',
],
'beta',
[ 'SiteName' => 'Beta Wiki' ]
];
}
/**
* @param array $config
* @param string $detect
* @param array $expected
*
* @dataProvider provideWikiFarmSettings
*/
public function testLoadWikiFarmSettings( $config, $detect, $expected ) {
$settings = $this->newSettingsBuilder();
$settings->putConfigValues( $config );
$_SERVER['MW_WIKI_NAME'] = $detect;
$loader = $this->newLoader( $settings );
$loader->loadWikiFarmSettings();
$config = $settings->getConfig();
foreach ( $expected as $name => $value ) {
$this->assertSame( $value, $config->get( $name ) );
}
}
public function testDetectSettingsFileFromConstant() {
$settings = $this->fakeSettingsBuilder();
$settings->expects( $this->once() )
->method( 'loadFile' )
->with( 'test/AcmeWiki123.yaml' );
$loader = $this->newLoader( $settings, 'AcmeWiki123' );
$loader->loadWikiFarmSettings();
}
public function testDetectSettingsFileFromLegacyVar() {
$settings = $this->fakeSettingsBuilder();
$_SERVER['WIKI_NAME'] = 'test/FooBarWiki.yaml';
$this->expectNotice();
$this->expectNoticeMessage( 'The WIKI_NAME server variable has been deprecated' );
// NOTE: Would be nice if we could assert that the file is actually loaded after
// the notice is triggered, but there doesn't seem to be a way.
$loader = $this->newLoader( $settings );
$loader->loadWikiFarmSettings();
}
/**
* @param SettingsBuilder $settings
* @param ?string $wikiNameConstantValue
*
* @return WikiFarmSettingsLoader
*/
private function newLoader( SettingsBuilder $settings, ?string $wikiNameConstantValue = null ) {
$loader = new class( $settings, $wikiNameConstantValue ) extends WikiFarmSettingsLoader {
private $wikiNameConstantValue;
public function __construct( $settings, $wikiNameConstantValue ) {
parent::__construct( $settings );
$this->wikiNameConstantValue = $wikiNameConstantValue;
}
protected function getWikiNameConstant() {
return $this->wikiNameConstantValue;
}
};
return $loader;
}
}