wiki.techinc.nl/tests/phpunit/unit/includes/user/Options/ConditionalDefaultsLookupTest.php
xtex a668a1bbea Add support for user-groups-based conditional options filter
Bug: T363059
Change-Id: I728cacf6acfc02ecb0ef9b3695e7770c2d3f8d83
2024-06-29 07:07:06 +00:00

289 lines
8.1 KiB
PHP

<?php
namespace MediaWiki\Tests\User\Options;
use MediaWiki\Config\HashConfig;
use MediaWiki\Config\ServiceOptions;
use MediaWiki\MainConfigNames;
use MediaWiki\User\Options\ConditionalDefaultsLookup;
use MediaWiki\User\Registration\UserRegistrationLookup;
use MediaWiki\User\UserGroupManager;
use MediaWiki\User\UserIdentityUtils;
use MediaWiki\User\UserIdentityValue;
use MediaWikiUnitTestCase;
/**
* @coversDefaultClass \MediaWiki\User\Options\ConditionalDefaultsLookup
*/
class ConditionalDefaultsLookupTest extends MediaWikiUnitTestCase {
private const CONDITIONAL_USER_DEFAULTS = [
[
'new accounts',
[ CUDCOND_AFTER, '20231215000000' ],
],
[
'anonymous users',
[ CUDCOND_ANON ],
],
[
'named users',
[ CUDCOND_NAMED ],
],
[
'sysop users',
[ CUDCOND_USERGROUP, 'sysop' ],
],
];
private const CONDITIONAL_USER_DEFAULTS_AFTER = [
[
'new accounts',
[ CUDCOND_AFTER, '20231215000000' ],
]
];
private const CONDITIONAL_USER_DEFAULTS_ANON = [
[
'anonymous users',
[ CUDCOND_ANON ],
]
];
private const CONDITIONAL_USER_DEFAULTS_NAMED = [
[
'named users',
[ CUDCOND_NAMED ],
]
];
private const CONDITIONAL_USER_DEFAULTS_USERGROUP = [
[
'sysop users',
[ CUDCOND_USERGROUP, 'sysop' ],
]
];
/**
* Construct ServiceOptions using a HashConfig
*
* @param array $configOverrides
* @return ServiceOptions
*/
private function getServiceOptions( array $configOverrides = [] ) {
return new ServiceOptions(
ConditionalDefaultsLookup::CONSTRUCTOR_OPTIONS,
new HashConfig( $configOverrides + [
MainConfigNames::ConditionalUserOptions => [],
] )
);
}
/**
* @covers ::hasConditionalDefault
* @dataProvider provideIsConditionallyDefault
* @param bool $expected
* @param string $option
* @return void
*/
public function testIsConditionallyDefault( bool $expected, string $option ) {
$lookup = new ConditionalDefaultsLookup(
$this->getServiceOptions( [
MainConfigNames::ConditionalUserOptions => [
'foo-option' => self::CONDITIONAL_USER_DEFAULTS,
'bar-option' => [
[ 'all accounts' ]
],
]
] ),
$this->createNoOpMock( UserRegistrationLookup::class ),
$this->createNoOpMock( UserIdentityUtils::class ),
static function () {
}
);
$this->assertSame(
$expected,
$lookup->hasConditionalDefault( $option )
);
}
public static function provideIsConditionallyDefault() {
return [
'foo-option' => [ true, 'foo-option' ],
'bar-option' => [ true, 'bar-option' ],
'some-option' => [ false, 'some-option' ],
];
}
/**
* @covers ::getOptionDefaultForUser
*/
public function testGetOptionDefaultForUser__notConditionallyDefault() {
$lookup = new ConditionalDefaultsLookup(
$this->getServiceOptions(),
$this->createNoOpMock( UserRegistrationLookup::class ),
$this->createNoOpMock( UserIdentityUtils::class ),
static function () {
}
);
$this->assertNull( $lookup->getOptionDefaultForUser(
'foo-option',
new UserIdentityValue( 1, 'Admin' )
) );
}
/**
* @covers ::getOptionDefaultForUser
* @covers ::checkConditionsForUser
* @covers ::checkConditionForUser
* @dataProvider provideGetOptionDefaultForUser__registration
* @param string|null $expected
* @param string|null $registrationTS
* @param array $conditions
*/
public function testGetOptionDefaultForUser__registration(
?string $expected,
?string $registrationTS,
array $conditions
) {
$userIdentity = new UserIdentityValue( 1, 'User' );
$registrationLookup = $this->createMock( UserRegistrationLookup::class );
$registrationLookup->expects( $this->once() )
->method( 'getRegistration' )
->with( $userIdentity )
->willReturn( $registrationTS );
$lookup = new ConditionalDefaultsLookup(
$this->getServiceOptions( [
MainConfigNames::ConditionalUserOptions => [
'foo-option' => $conditions,
]
] ),
$registrationLookup,
$this->createNoOpMock( UserIdentityUtils::class ),
static function () {
}
);
$this->assertSame(
$expected,
$lookup->getOptionDefaultForUser( 'foo-option', $userIdentity )
);
}
public static function provideGetOptionDefaultForUser__registration(): array {
return [
[ null, '20231101000000', self::CONDITIONAL_USER_DEFAULTS_AFTER ],
[ 'new accounts', '20241101000000', self::CONDITIONAL_USER_DEFAULTS_AFTER ],
[ null, null, self::CONDITIONAL_USER_DEFAULTS_AFTER ],
];
}
/**
* @covers ::getOptionDefaultForUser
* @covers ::checkConditionsForUser
* @covers ::checkConditionForUser
* @dataProvider provideGetOptionDefaultForUser__anon
* @param int $id the user ID
* @param string|null $expected the default option or null if none apply
*/
public function testGetOptionDefaultForUser__anon( int $id, ?string $expected ) {
$userIdentity = new UserIdentityValue( $id, 'test user' );
$options = $this->getServiceOptions( [
MainConfigNames::ConditionalUserOptions => [
'test-option' => self::CONDITIONAL_USER_DEFAULTS_ANON,
]
] );
$registrationLookup = $this->createNoOpMock( UserRegistrationLookup::class );
$userIdentityUtils = $this->createNoOpMock( UserIdentityUtils::class );
$lookup = new ConditionalDefaultsLookup( $options, $registrationLookup, $userIdentityUtils,
static function () {
} );
$this->assertSame( $expected, $lookup->getOptionDefaultForUser( 'test-option', $userIdentity ) );
}
public static function provideGetOptionDefaultForUser__anon(): array {
return [
[ 0, 'anonymous users' ],
[ 1, null ],
];
}
/**
* @covers ::getOptionDefaultForUser
* @covers ::checkConditionsForUser
* @covers ::checkConditionForUser
* @dataProvider provideGetOptionDefaultForUser__named
* @param bool $isNamed whether the user is named or not (logged in and not temporary)
* @param string|null $expected the default option or null if none apply
*/
public function testGetOptionDefaultForUser__named( bool $isNamed, ?string $expected ) {
$userIdentity = new UserIdentityValue( 1, 'test user' );
$options = $this->getServiceOptions( [
MainConfigNames::ConditionalUserOptions => [
'test-option' => self::CONDITIONAL_USER_DEFAULTS_NAMED,
]
] );
$registrationLookup = $this->createNoOpMock( UserRegistrationLookup::class );
$userIdentityUtils = $this->createMock( UserIdentityUtils::class );
$userIdentityUtils->expects( $this->once() )
->method( 'isNamed' )
->with( $userIdentity )
->willReturn( $isNamed );
$lookup = new ConditionalDefaultsLookup( $options, $registrationLookup, $userIdentityUtils,
static function () {
} );
$this->assertSame( $expected, $lookup->getOptionDefaultForUser( 'test-option', $userIdentity ) );
}
public static function provideGetOptionDefaultForUser__named(): array {
return [
[ true, 'named users' ],
[ false, null ],
];
}
/**
* @covers ::getOptionDefaultForUser
* @covers ::checkConditionsForUser
* @covers ::checkConditionForUser
* @dataProvider provideGetOptionDefaultForUser__usergroup
* @param array[string] $usergroups the user groups the user has
* @param string|null $expected the default option or null if none apply
*/
public function testGetOptionDefaultForUser__usergroup( array $usergroups, ?string $expected ) {
$userIdentity = new UserIdentityValue( 1, 'test user' );
$options = $this->getServiceOptions( [
MainConfigNames::ConditionalUserOptions => [
'test-option' => self::CONDITIONAL_USER_DEFAULTS_USERGROUP,
]
] );
$registrationLookup = $this->createNoOpMock( UserRegistrationLookup::class );
$userIdentityUtils = $this->createMock( UserIdentityUtils::class );
$userGroupManager = $this->createMock( UserGroupManager::class );
$userGroupManager->expects( $this->once() )
->method( 'getUserEffectiveGroups' )
->with( $userIdentity )
->willReturn( $usergroups );
$lookup = new ConditionalDefaultsLookup( $options, $registrationLookup, $userIdentityUtils,
static function () use ( $userGroupManager ) {
return $userGroupManager;
} );
$this->assertSame( $expected, $lookup->getOptionDefaultForUser( 'test-option', $userIdentity ) );
}
public static function provideGetOptionDefaultForUser__usergroup(): array {
return [
[ [ '*', 'user', 'sysop' ], 'sysop users' ],
[ [ 'user' ], null ],
];
}
}