wiki.techinc.nl/tests/phpunit/unit/includes/Settings/DynamicDefaultValuesTest.php
Daimona Eaytoy de9a6a22ad tests: Fix self-referential @covers annotation
Also, extend MediaWikiUnitTestCase instead of TestCase.
MediaWikiCoversValidator would have prevented this bug in the first
place.

Change-Id: I4f230d3da1b0c9b98e92da852c681881ce30bd10
2024-03-22 19:16:19 +01:00

224 lines
4.7 KiB
PHP

<?php
namespace MediaWiki\Tests\Unit\Settings;
use LogicException;
use MediaWiki\Settings\Config\ArrayConfigBuilder;
use MediaWiki\Settings\Config\ConfigSchemaAggregator;
use MediaWiki\Settings\DynamicDefaultValues;
use MediaWikiUnitTestCase;
/**
* @covers \MediaWiki\Settings\DynamicDefaultValues
*/
class DynamicDefaultValuesTest extends MediaWikiUnitTestCase {
private const DEFAULT_VALUE = 'this is the default value';
public static function getDefaultTestValue() {
return self::DEFAULT_VALUE;
}
public static function identity( $v ) {
return $v;
}
public static function provideDynamicDefaults() {
yield 'global function callback' => [
[
'Static' => [ 'default' => 'abcd' ],
'Dynamic' => [
'dynamicDefault' => [
'callback' => 'strtoupper',
'use' => [ 'Static' ]
]
],
],
[
'Static' => 'xyz',
],
[
'Static' => 'xyz',
'Dynamic' => 'XYZ',
]
];
yield 'static method callback (string)' => [
[
'Dynamic' => [
'dynamicDefault' => [ 'callback' => self::class . '::getDefaultTestValue' ]
],
],
[],
[
'Dynamic' => self::DEFAULT_VALUE,
]
];
yield 'static method callback (array)' => [
[
'Dynamic' => [
'dynamicDefault' => [ 'callback' => [ self::class, 'getDefaultTestValue' ] ]
],
],
[],
[
'Dynamic' => self::DEFAULT_VALUE,
]
];
yield 'interrupted chain' => [
[
'A' => [ 'default' => 'a' ],
'B' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'A' ]
]
],
'C' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'B' ]
]
],
'D' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'C' ]
]
],
'E' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'D' ]
]
],
],
[ 'D' => 'x' ],
[
'A' => 'a',
'B' => 'a',
'C' => 'a',
'D' => 'x',
'E' => 'x',
]
];
yield 'do not trigger on null if the default is false' => [
[
'Dynamic' => [
'default' => false,
'dynamicDefault' => [ 'callback' => self::class . '::getDefaultTestValue' ]
],
],
[ 'Dynamic' => null ],
[ 'Dynamic' => null ]
];
yield 'trigger on 1 if that is the default' => [
[
'Dynamic' => [
'default' => 1,
'dynamicDefault' => [ 'callback' => self::class . '::getDefaultTestValue' ]
],
],
[ 'Dynamic' => 1 ],
[ 'Dynamic' => self::DEFAULT_VALUE ]
];
}
/**
* @dataProvider provideDynamicDefaults
*
* @param array $schema
* @param array $config
* @param array $expected
*/
public function testApply( array $schema, array $config, array $expected ) {
$schemaAggregator = new ConfigSchemaAggregator();
$schemaAggregator->addSchemaMulti( $schema );
$configBuilder = new ArrayConfigBuilder();
$configBuilder->setMulti( $schemaAggregator->getDefaults() );
$configBuilder->setMulti( $config );
$dynamicDefaults = new DynamicDefaultValues( $schemaAggregator );
$dynamicDefaults->applyDynamicDefaults( $configBuilder );
$result = $configBuilder->build();
foreach ( $expected as $key => $value ) {
$this->assertSame( $value, $result->get( $key ), $key );
}
}
public static function provideBadDynamicDefaults() {
yield 'loop' => [
[
'X' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'X' ]
]
],
],
];
yield 'cycle' => [
[
'A' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'E' ]
]
],
'B' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'A' ]
]
],
'C' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'B' ]
]
],
'D' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'C' ]
]
],
'E' => [
'dynamicDefault' => [
'callback' => [ self::class, 'identity' ],
'use' => [ 'D' ]
]
],
],
];
}
/**
* @dataProvider provideBadDynamicDefaults
*
* @param array $schema
* @param array $config
*/
public function testApplyFails( array $schema, array $config = [] ) {
$schemaAggregator = new ConfigSchemaAggregator();
$schemaAggregator->addSchemaMulti( $schema );
$configBuilder = new ArrayConfigBuilder();
$configBuilder->setMulti( $schemaAggregator->getDefaults() );
$configBuilder->setMulti( $config );
$dynamicDefaults = new DynamicDefaultValues( $schemaAggregator );
$this->expectException( LogicException::class );
$dynamicDefaults->applyDynamicDefaults( $configBuilder );
}
}