wiki.techinc.nl/tests/phpunit/includes/logging/RightsLogFormatterTest.php
Daimona Eaytoy db8897dbe7 LogFormatterTestCase: avoid database access
LogFormatter is another place that uses the global state a lot, with
Title, Linker, etc. Some of its dependencies were accessing the
database, but most LogFormatter methods are not in the database group.

This patch tries to work around the DB dependencies by providing
(complex) mocks that do not access the DB. There's a lot of mocking
involved, but that's just because of the current state of LogFormatter,
and hopefully it'll get better some day.

Rights- and ProtectLogFormatter also need a mock DB connection because
they use the database to format expiry.

Bug: T155147
Change-Id: I4fa9ee4fb246e08cb2b4577454029b5af3276b79
2023-08-01 16:35:20 +02:00

231 lines
5.7 KiB
PHP

<?php
use Wikimedia\Rdbms\LBFactory;
/**
* @covers RightsLogFormatter
*/
class RightsLogFormatterTest extends LogFormatterTestCase {
protected function setUp(): void {
parent::setUp();
$db = $this->createNoOpMock( IDatabase::class, [ 'getInfinity' ] );
$db->method( 'getInfinity' )->willReturn( 'infinity' );
$lbFactory = $this->createMock( LBFactory::class );
$lbFactory->method( 'getReplicaDatabase' )->willReturn( $db );
$this->setService( 'DBLoadBalancerFactory', $lbFactory );
}
/**
* Provide different rows from the logging table to test
* for backward compatibility.
* Do not change the existing data, just add a new database row
*/
public static function provideRightsLogDatabaseRows() {
return [
// Current format
[
[
'type' => 'rights',
'action' => 'rights',
'comment' => 'rights comment',
'user' => 0,
'user_text' => 'Sysop',
'namespace' => NS_USER,
'title' => 'User',
'params' => [
'4::oldgroups' => [],
'5::newgroups' => [ 'sysop', 'bureaucrat' ],
'oldmetadata' => [],
'newmetadata' => [
[ 'expiry' => null ],
[ 'expiry' => '20160101123456' ]
],
],
],
[
'text' => 'Sysop changed group membership for User from (none) to '
. 'bureaucrat (temporary, until 12:34, 1 January 2016) and administrator',
'api' => [
'oldgroups' => [],
'newgroups' => [ 'sysop', 'bureaucrat' ],
'oldmetadata' => [],
'newmetadata' => [
[ 'group' => 'sysop', 'expiry' => 'infinity' ],
[ 'group' => 'bureaucrat', 'expiry' => '2016-01-01T12:34:56Z' ],
],
],
],
],
// Previous format (oldgroups and newgroups as arrays, no metadata)
[
[
'type' => 'rights',
'action' => 'rights',
'comment' => 'rights comment',
'user' => 0,
'user_text' => 'Sysop',
'namespace' => NS_USER,
'title' => 'User',
'params' => [
'4::oldgroups' => [],
'5::newgroups' => [ 'sysop', 'bureaucrat' ],
],
],
[
'text' => 'Sysop changed group membership for User from (none) to '
. 'administrator and bureaucrat',
'api' => [
'oldgroups' => [],
'newgroups' => [ 'sysop', 'bureaucrat' ],
'oldmetadata' => [],
'newmetadata' => [
[ 'group' => 'sysop', 'expiry' => 'infinity' ],
[ 'group' => 'bureaucrat', 'expiry' => 'infinity' ],
],
],
],
],
// Legacy format (oldgroups and newgroups as numeric-keyed strings)
[
[
'type' => 'rights',
'action' => 'rights',
'comment' => 'rights comment',
'user' => 0,
'user_text' => 'Sysop',
'namespace' => NS_USER,
'title' => 'User',
'params' => [
'',
'sysop, bureaucrat',
],
],
[
'legacy' => true,
'text' => 'Sysop changed group membership for User from (none) to '
. 'administrator and bureaucrat',
'api' => [
'oldgroups' => [],
'newgroups' => [ 'sysop', 'bureaucrat' ],
'oldmetadata' => [],
'newmetadata' => [
[ 'group' => 'sysop', 'expiry' => 'infinity' ],
[ 'group' => 'bureaucrat', 'expiry' => 'infinity' ],
],
],
],
],
// Really old entry
[
[
'type' => 'rights',
'action' => 'rights',
'comment' => 'rights comment',
'user' => 0,
'user_text' => 'Sysop',
'namespace' => NS_USER,
'title' => 'User',
'params' => [],
],
[
'legacy' => true,
'text' => 'Sysop changed group membership for User',
'api' => [],
],
],
];
}
/**
* @dataProvider provideRightsLogDatabaseRows
*/
public function testRightsLogDatabaseRows( $row, $extra ) {
$this->doTestLogFormatter( $row, $extra );
}
/**
* Provide different rows from the logging table to test
* for backward compatibility.
* Do not change the existing data, just add a new database row
*/
public static function provideAutopromoteLogDatabaseRows() {
return [
// Current format
[
[
'type' => 'rights',
'action' => 'autopromote',
'comment' => 'rights comment',
'user' => 0,
'user_text' => 'Sysop',
'namespace' => NS_USER,
'title' => 'Sysop',
'params' => [
'4::oldgroups' => [ 'sysop' ],
'5::newgroups' => [ 'sysop', 'bureaucrat' ],
],
],
[
'text' => 'Sysop was automatically promoted from administrator to '
. 'administrator and bureaucrat',
'api' => [
'oldgroups' => [ 'sysop' ],
'newgroups' => [ 'sysop', 'bureaucrat' ],
'oldmetadata' => [
[ 'group' => 'sysop', 'expiry' => 'infinity' ],
],
'newmetadata' => [
[ 'group' => 'sysop', 'expiry' => 'infinity' ],
[ 'group' => 'bureaucrat', 'expiry' => 'infinity' ],
],
],
],
],
// Legacy format
[
[
'type' => 'rights',
'action' => 'autopromote',
'comment' => 'rights comment',
'user' => 0,
'user_text' => 'Sysop',
'namespace' => NS_USER,
'title' => 'Sysop',
'params' => [
'sysop',
'sysop, bureaucrat',
],
],
[
'legacy' => true,
'text' => 'Sysop was automatically promoted from administrator to '
. 'administrator and bureaucrat',
'api' => [
'oldgroups' => [ 'sysop' ],
'newgroups' => [ 'sysop', 'bureaucrat' ],
'oldmetadata' => [
[ 'group' => 'sysop', 'expiry' => 'infinity' ],
],
'newmetadata' => [
[ 'group' => 'sysop', 'expiry' => 'infinity' ],
[ 'group' => 'bureaucrat', 'expiry' => 'infinity' ],
],
],
],
],
];
}
/**
* @dataProvider provideAutopromoteLogDatabaseRows
*/
public function testAutopromoteLogDatabaseRows( $row, $extra ) {
$this->doTestLogFormatter( $row, $extra );
}
}