wiki.techinc.nl/tests/phpunit/includes/logging/ProtectLogFormatterTest.php
Ammar 1d59041fc8 Fix permission check on protection log
*I2341e6f inverted the permission check, such that now the link is only shown to unprivileged users

Bug: T234017
Change-Id: I0977f1ab1a72840303aeca2367a30546d83117d4
2019-09-27 09:58:41 -07:00

473 lines
11 KiB
PHP

<?php
/**
* @covers ProtectLogFormatter
*/
class ProtectLogFormatterTest extends LogFormatterTestCase {
/**
* 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 provideProtectLogDatabaseRows() {
return [
// Current format
[
[
'type' => 'protect',
'action' => 'protect',
'comment' => 'protect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [
'4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'5:bool:cascade' => false,
'details' => [
[
'type' => 'edit',
'level' => 'sysop',
'expiry' => 'infinity',
'cascade' => false,
],
[
'type' => 'move',
'level' => 'sysop',
'expiry' => 'infinity',
'cascade' => false,
],
],
],
],
[
'text' => 'User protected ProtectPage [Edit=Allow only administrators] ' .
'(indefinite) [Move=Allow only administrators] (indefinite)',
'api' => [
'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade' => false,
'details' => [
[
'type' => 'edit',
'level' => 'sysop',
'expiry' => 'infinite',
'cascade' => false,
],
[
'type' => 'move',
'level' => 'sysop',
'expiry' => 'infinite',
'cascade' => false,
],
],
],
],
],
// Current format with cascade
[
[
'type' => 'protect',
'action' => 'protect',
'comment' => 'protect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [
'4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'5:bool:cascade' => true,
'details' => [
[
'type' => 'edit',
'level' => 'sysop',
'expiry' => 'infinity',
'cascade' => true,
],
[
'type' => 'move',
'level' => 'sysop',
'expiry' => 'infinity',
'cascade' => false,
],
],
],
],
[
'text' => 'User protected ProtectPage [Edit=Allow only administrators] ' .
'(indefinite) [Move=Allow only administrators] (indefinite) [cascading]',
'api' => [
'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade' => true,
'details' => [
[
'type' => 'edit',
'level' => 'sysop',
'expiry' => 'infinite',
'cascade' => true,
],
[
'type' => 'move',
'level' => 'sysop',
'expiry' => 'infinite',
'cascade' => false,
],
],
],
],
],
// Legacy format
[
[
'type' => 'protect',
'action' => 'protect',
'comment' => 'protect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [
'[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'',
],
],
[
'legacy' => true,
'text' => 'User protected ProtectPage [edit=sysop] (indefinite)[move=sysop] (indefinite)',
'api' => [
'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade' => false,
],
],
],
// Legacy format with cascade
[
[
'type' => 'protect',
'action' => 'protect',
'comment' => 'protect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [
'[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade',
],
],
[
'legacy' => true,
'text' => 'User protected ProtectPage [edit=sysop] ' .
'(indefinite)[move=sysop] (indefinite) [cascading]',
'api' => [
'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade' => true,
],
],
],
];
}
/**
* @dataProvider provideProtectLogDatabaseRows
*/
public function testProtectLogDatabaseRows( $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 provideModifyLogDatabaseRows() {
return [
// Current format
[
[
'type' => 'protect',
'action' => 'modify',
'comment' => 'protect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [
'4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'5:bool:cascade' => false,
'details' => [
[
'type' => 'edit',
'level' => 'sysop',
'expiry' => 'infinity',
'cascade' => false,
],
[
'type' => 'move',
'level' => 'sysop',
'expiry' => 'infinity',
'cascade' => false,
],
],
],
],
[
'text' => 'User changed protection level for ProtectPage ' .
'[Edit=Allow only administrators] ' .
'(indefinite) [Move=Allow only administrators] (indefinite)',
'api' => [
'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade' => false,
'details' => [
[
'type' => 'edit',
'level' => 'sysop',
'expiry' => 'infinite',
'cascade' => false,
],
[
'type' => 'move',
'level' => 'sysop',
'expiry' => 'infinite',
'cascade' => false,
],
],
],
],
],
// Current format with cascade
[
[
'type' => 'protect',
'action' => 'modify',
'comment' => 'protect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [
'4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'5:bool:cascade' => true,
'details' => [
[
'type' => 'edit',
'level' => 'sysop',
'expiry' => 'infinity',
'cascade' => true,
],
[
'type' => 'move',
'level' => 'sysop',
'expiry' => 'infinity',
'cascade' => false,
],
],
],
],
[
'text' => 'User changed protection level for ProtectPage ' .
'[Edit=Allow only administrators] (indefinite) ' .
'[Move=Allow only administrators] (indefinite) [cascading]',
'api' => [
'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade' => true,
'details' => [
[
'type' => 'edit',
'level' => 'sysop',
'expiry' => 'infinite',
'cascade' => true,
],
[
'type' => 'move',
'level' => 'sysop',
'expiry' => 'infinite',
'cascade' => false,
],
],
],
],
],
// Legacy format
[
[
'type' => 'protect',
'action' => 'modify',
'comment' => 'protect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [
'[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'',
],
],
[
'legacy' => true,
'text' => 'User changed protection level for ProtectPage ' .
'[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'api' => [
'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade' => false,
],
],
],
// Legacy format with cascade
[
[
'type' => 'protect',
'action' => 'modify',
'comment' => 'protect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [
'[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade',
],
],
[
'legacy' => true,
'text' => 'User changed protection level for ProtectPage ' .
'[edit=sysop] (indefinite)[move=sysop] (indefinite) [cascading]',
'api' => [
'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
'cascade' => true,
],
],
],
];
}
/**
* @dataProvider provideModifyLogDatabaseRows
*/
public function testModifyLogDatabaseRows( $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 provideUnprotectLogDatabaseRows() {
return [
// Current format
[
[
'type' => 'protect',
'action' => 'unprotect',
'comment' => 'unprotect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [],
],
[
'text' => 'User removed protection from ProtectPage',
'api' => [],
],
],
];
}
/**
* @dataProvider provideUnprotectLogDatabaseRows
*/
public function testUnprotectLogDatabaseRows( $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 provideMoveProtLogDatabaseRows() {
return [
// Current format
[
[
'type' => 'protect',
'action' => 'move_prot',
'comment' => 'Move comment',
'namespace' => NS_MAIN,
'title' => 'NewPage',
'params' => [
'4::oldtitle' => 'OldPage',
],
],
[
'text' => 'User moved protection settings from OldPage to NewPage',
'api' => [
'oldtitle_ns' => 0,
'oldtitle_title' => 'OldPage',
],
],
],
// Legacy format
[
[
'type' => 'protect',
'action' => 'move_prot',
'comment' => 'Move comment',
'namespace' => NS_MAIN,
'title' => 'NewPage',
'params' => [
'OldPage',
],
],
[
'legacy' => true,
'text' => 'User moved protection settings from OldPage to NewPage',
'api' => [
'oldtitle_ns' => 0,
'oldtitle_title' => 'OldPage',
],
],
],
];
}
/**
* @dataProvider provideMoveProtLogDatabaseRows
*/
public function testMoveProtLogDatabaseRows( $row, $extra ) {
$this->doTestLogFormatter( $row, $extra );
}
public function provideGetActionLinks() {
yield [
[ 'protect' ],
true
];
yield [
[],
false
];
}
/**
* @param string[] $permissions
* @param bool $shouldMatch
* @dataProvider provideGetActionLinks
* @covers ProtectLogFormatter::getActionLinks
*/
public function testGetActionLinks( array $permissions, $shouldMatch ) {
RequestContext::resetMain();
$user = $this->getTestUser()->getUser();
$this->overrideUserPermissions( $user, $permissions );
$row = $this->expandDatabaseRow( [
'type' => 'protect',
'action' => 'unprotect',
'comment' => 'unprotect comment',
'namespace' => NS_MAIN,
'title' => 'ProtectPage',
'params' => [],
], false );
$context = new RequestContext();
$context->setUser( $user );
$formatter = LogFormatter::newFromRow( $row );
$formatter->setContext( $context );
if ( $shouldMatch ) {
$this->assertStringMatchesFormat(
'%Aaction=protect%A', $formatter->getActionLinks() );
} else {
$this->assertStringNotMatchesFormat(
'%Aaction=protect%A', $formatter->getActionLinks() );
}
}
}