'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() ); } } }