mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Nuke
synced 2024-11-13 18:26:55 +00:00
Add more tests
- Add tests to reach 100% coverage - Ignore some methods which are simple enough - Change some tests to fit with the new ones Change-Id: Ic15d4431dc8509ac2732ebce7517522e27d8f5a3
This commit is contained in:
parent
a7bc0add20
commit
19c6fb0125
|
@ -71,6 +71,10 @@ class SpecialNuke extends SpecialPage {
|
||||||
$this->contentLanguage = $contentLanguage;
|
$this->contentLanguage = $contentLanguage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
* @codeCoverageIgnore
|
||||||
|
*/
|
||||||
public function doesWrites() {
|
public function doesWrites() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -565,6 +569,7 @@ class SpecialNuke extends SpecialPage {
|
||||||
/**
|
/**
|
||||||
* Group Special:Nuke with pagetools
|
* Group Special:Nuke with pagetools
|
||||||
*
|
*
|
||||||
|
* @codeCoverageIgnore
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function getGroupName() {
|
protected function getGroupName() {
|
||||||
|
|
BIN
tests/assets/Example.png
Normal file
BIN
tests/assets/Example.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 119 B |
|
@ -5,7 +5,12 @@ namespace MediaWiki\Extension\Nuke\Tests;
|
||||||
use MediaWiki\Extension\Nuke\SpecialNuke;
|
use MediaWiki\Extension\Nuke\SpecialNuke;
|
||||||
use MediaWiki\Permissions\UltimateAuthority;
|
use MediaWiki\Permissions\UltimateAuthority;
|
||||||
use MediaWiki\Request\FauxRequest;
|
use MediaWiki\Request\FauxRequest;
|
||||||
|
use MediaWiki\Specials\SpecialLog;
|
||||||
|
use MediaWiki\Title\Title;
|
||||||
|
use PermissionsError;
|
||||||
use SpecialPageTestBase;
|
use SpecialPageTestBase;
|
||||||
|
use UploadFromFile;
|
||||||
|
use UserBlockedError;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @group Database
|
* @group Database
|
||||||
|
@ -29,20 +34,344 @@ class SpecialNukeTest extends SpecialPageTestBase {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure that the prompt doesn't allow a user blocked from deleting
|
||||||
|
* pages from accessing the form.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testBlocked() {
|
||||||
|
$user = $this->getTestSysop()->getUser();
|
||||||
|
$performer = new UltimateAuthority( $user );
|
||||||
|
|
||||||
|
// Self-blocks should still prevent the form from being shown
|
||||||
|
$this->getServiceContainer()
|
||||||
|
->getBlockUserFactory()
|
||||||
|
->newBlockUser( $user, $performer, 'infinity', 'SpecialNukeTest::testBlocked' )
|
||||||
|
->placeBlockUnsafe();
|
||||||
|
|
||||||
|
$this->expectException( UserBlockedError::class );
|
||||||
|
$this->executeSpecialPage( '', null, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->getServiceContainer()
|
||||||
|
->getUnblockUserFactory()
|
||||||
|
->newUnblockUser( $user, $performer, 'SpecialNukeTest::testBlocked' )
|
||||||
|
->unblockUnsafe();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testProtectedPage() {
|
||||||
|
$pages = [];
|
||||||
|
$pages[] = $this->insertPage( 'Page123', 'Test', NS_MAIN )[ 'title' ];
|
||||||
|
$pages[] = $this->insertPage( 'Page456', 'Test', NS_MAIN )[ 'title' ];
|
||||||
|
$pages[] = $this->insertPage( 'Page789', 'Test', NS_MAIN )[ 'title' ];
|
||||||
|
|
||||||
|
$this->overrideConfigValues( [
|
||||||
|
"GroupPermissions" => [
|
||||||
|
"testgroup" => [
|
||||||
|
"nuke" => true,
|
||||||
|
"delete" => true
|
||||||
|
]
|
||||||
|
]
|
||||||
|
] );
|
||||||
|
|
||||||
|
$services = $this->getServiceContainer();
|
||||||
|
$page = $services->getWikiPageFactory()
|
||||||
|
->newFromTitle( $pages[2] );
|
||||||
|
$restrictions = [];
|
||||||
|
foreach ( $services->getRestrictionStore()->listApplicableRestrictionTypes( $page ) as $type ) {
|
||||||
|
$restrictions[$type] = "sysop";
|
||||||
|
}
|
||||||
|
$cascade = false;
|
||||||
|
$page->doUpdateRestrictions(
|
||||||
|
$restrictions,
|
||||||
|
[],
|
||||||
|
$cascade,
|
||||||
|
"test",
|
||||||
|
$this->getTestSysop()->getUser()
|
||||||
|
);
|
||||||
|
|
||||||
|
$testUser = $this->getTestUser( [ "testgroup" ] );
|
||||||
|
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'delete',
|
||||||
|
'wpDeleteReasonList' => 'other',
|
||||||
|
'wpReason' => 'Reason',
|
||||||
|
'pages' => $pages,
|
||||||
|
'wpFormIdentifier' => 'nukelist',
|
||||||
|
'wpEditToken' => $testUser->getUser()->getEditToken(),
|
||||||
|
], true );
|
||||||
|
|
||||||
|
$this->expectException( PermissionsError::class );
|
||||||
|
$this->executeSpecialPage( '', $request, 'qqx', $testUser->getAuthority() );
|
||||||
|
|
||||||
|
foreach ( $pages as $checkedPage ) {
|
||||||
|
$this->assertTrue( $checkedPage->exists() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPrompt() {
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', null, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->assertStringContainsString( '(nuke-summary)', $html );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPromptTarget() {
|
||||||
|
$testUser = $this->getTestUser();
|
||||||
|
$performer = $testUser->getAuthority();
|
||||||
|
|
||||||
|
$this->editPage( 'Target1', 'test', "", NS_MAIN, $performer );
|
||||||
|
$this->editPage( 'Target2', 'test', "", NS_MAIN, $performer );
|
||||||
|
|
||||||
|
$adminUser = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'target' => $testUser->getUser()->getName()
|
||||||
|
] );
|
||||||
|
$adminPerformer = new UltimateAuthority( $adminUser );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $adminPerformer );
|
||||||
|
|
||||||
|
$this->assertStringContainsString( 'Target1', $html );
|
||||||
|
$this->assertStringContainsString( 'Target2', $html );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testListNoPagesGlobal() {
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'pattern' => 'ThisPageShouldNotExist-' . rand()
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->assertStringContainsString( '(nuke-nopages-global)', $html );
|
||||||
|
$this->assertStringNotContainsString( '(nuke-nopages)', $html );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testListNoPagesUser() {
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'target' => 'ThisPageShouldNotExist-' . rand()
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->assertStringNotContainsString( '(nuke-nopages-global)', $html );
|
||||||
|
$this->assertStringContainsString( 'nuke-nopages', $html );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testListNamespace() {
|
||||||
|
$this->editPage( 'NukeUserPageTarget', 'test', '', NS_USER );
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'pattern' => 'NukeUserPageTarget',
|
||||||
|
'namespace' => NS_USER
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$expectedTitle = Title::makeTitle( NS_USER, 'NukeUserPageTarget' )
|
||||||
|
->getPrefixedText();
|
||||||
|
$this->assertStringContainsString( $expectedTitle, $html );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testListTalk() {
|
||||||
|
$this->editPage( 'NukeTalkPageTarget', 'test', '', NS_TALK );
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'pattern' => 'NukeTalkPageTarget'
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$expectedTitle = Title::makeTitle( NS_TALK, 'NukeTalkPageTarget' )
|
||||||
|
->getPrefixedText();
|
||||||
|
$this->assertStringContainsString( $expectedTitle, $html );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testListCapitalizedNamespace() {
|
||||||
|
$this->overrideConfigValues( [
|
||||||
|
'CapitalLinks' => false,
|
||||||
|
'CapitalLinkOverrides' => []
|
||||||
|
] );
|
||||||
|
$this->editPage( 'uncapsTarget', 'test' );
|
||||||
|
$this->editPage( 'UncapsTarget', 'test' );
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
|
||||||
|
$expectedTitle = Title::makeTitle( NS_MAIN, 'uncapsTarget' )
|
||||||
|
->getPrefixedText();
|
||||||
|
|
||||||
|
$shouldMatch = [
|
||||||
|
"%ncapsTarget",
|
||||||
|
"u%",
|
||||||
|
"uncapsTarget"
|
||||||
|
];
|
||||||
|
$shouldNotMatch = [
|
||||||
|
"UncapsTarget"
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ( $shouldMatch as $match ) {
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'pattern' => 'uncapsTarget'
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->assertStringContainsString( $expectedTitle, $html, "match: $match" );
|
||||||
|
foreach ( $shouldNotMatch as $noMatch ) {
|
||||||
|
$this->assertStringNotContainsString( $noMatch, $html );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testListCapitalizedNamespaceOverrides() {
|
||||||
|
$overriddenNamespaces = [
|
||||||
|
NS_PROJECT => true,
|
||||||
|
NS_MEDIAWIKI => true,
|
||||||
|
NS_USER => true,
|
||||||
|
];
|
||||||
|
$this->overrideConfigValues( [
|
||||||
|
'CapitalLinks' => false,
|
||||||
|
'CapitalLinkOverrides' => $overriddenNamespaces
|
||||||
|
] );
|
||||||
|
$overriddenNamespaces[ NS_MAIN ] = false;
|
||||||
|
foreach ( $overriddenNamespaces as $ns => $override ) {
|
||||||
|
$this->editPage( "UncapsTarget" . $ns, 'test', '', $ns );
|
||||||
|
// If capital links for this ns is `true`, then the existing page should be edited.
|
||||||
|
$this->editPage( "uncapsTarget" . $ns, 'test2', '', $ns );
|
||||||
|
}
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'pattern' => 'u%'
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->assertStringContainsString( "uncapsTarget" . NS_MAIN, $html );
|
||||||
|
// Check that the overridden namespaces are included in the search
|
||||||
|
$this->assertStringContainsString( "UncapsTarget" . NS_PROJECT, $html );
|
||||||
|
$this->assertStringContainsString( "UncapsTarget" . NS_MEDIAWIKI, $html );
|
||||||
|
$this->assertStringContainsString( "UncapsTarget" . NS_USER, $html );
|
||||||
|
|
||||||
|
$this->assertStringNotContainsString( "UncapsTarget" . NS_MAIN, $html );
|
||||||
|
// Check that the non-overridden namespaces are not included in the search
|
||||||
|
$this->assertStringNotContainsString( "uncapsTarget" . NS_PROJECT, $html );
|
||||||
|
$this->assertStringNotContainsString( "uncapsTarget" . NS_MEDIAWIKI, $html );
|
||||||
|
$this->assertStringNotContainsString( "uncapsTarget" . NS_USER, $html );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if Nuke still works with languages with complicated capitalization
|
||||||
|
* or no capitalization.
|
||||||
|
*
|
||||||
|
* Since the first letter of each title should be capitalized, searching for the
|
||||||
|
* lowercase version should still yield the uppercase version, or the same character
|
||||||
|
* if casing does not exist for the language.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testListCapitalized() {
|
||||||
|
/** @noinspection SpellCheckingInspection */
|
||||||
|
$testedLanguages = [
|
||||||
|
"ee" => [
|
||||||
|
"Ülemiste",
|
||||||
|
"ülemiste"
|
||||||
|
],
|
||||||
|
"zh" => "你好",
|
||||||
|
"ja" => "にほんご",
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ( $testedLanguages as $lang => $testData ) {
|
||||||
|
[ $created, $wanted ] = is_array( $testData ) ?
|
||||||
|
$testData : [ $testData, $testData ];
|
||||||
|
|
||||||
|
$this->overrideConfigValue( 'LanguageCode', $lang );
|
||||||
|
$this->editPage( $created, 'test' );
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'pattern' => $wanted
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->assertStringContainsString( $created, $html );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testListLimit() {
|
||||||
|
$this->editPage( 'Page1', 'test' );
|
||||||
|
$this->editPage( 'Page2', 'test' );
|
||||||
|
$this->editPage( 'Page3', 'test' );
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'pattern' => 'Page%',
|
||||||
|
'limit' => 2
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->assertEquals( 2, substr_count( $html, '<li>' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testListLimitWithHooks() {
|
||||||
|
$this->editPage( 'Page1', 'test' );
|
||||||
|
$this->editPage( 'Page2', 'test' );
|
||||||
|
$this->editPage( 'Page3', 'test' );
|
||||||
|
$this->setTemporaryHook( "NukeGetNewPages", static function ( $_1, $_2, $_3, $_4, &$pages ) {
|
||||||
|
$pages[] = "Page3";
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} );
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'pattern' => 'Page%',
|
||||||
|
'limit' => 2
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->assertEquals( 2, substr_count( $html, '<li>' ) );
|
||||||
|
}
|
||||||
|
|
||||||
public function testExecutePattern() {
|
public function testExecutePattern() {
|
||||||
// Test that matching wildcards works, and that escaping wildcards works as documented
|
// Test that matching wildcards works, and that escaping wildcards works as documented
|
||||||
// at https://www.mediawiki.org/wiki/Help:Extension:Nuke
|
// at https://www.mediawiki.org/wiki/Help:Extension:Nuke
|
||||||
$this->editPage( '%PositiveNukeTest123', 'test' );
|
$this->editPage( '%PositiveNukeTest123', 'test' );
|
||||||
$this->editPage( 'NegativeNukeTest123', 'test' );
|
$this->editPage( 'NegativeNukeTest123', 'test' );
|
||||||
|
|
||||||
$user = $this->getTestSysop()->getUser();
|
$admin = $this->getTestSysop()->getUser();
|
||||||
$request = new FauxRequest( [
|
$request = new FauxRequest( [
|
||||||
'action' => 'submit',
|
'action' => 'submit',
|
||||||
'pattern' => '\\%PositiveNukeTest%',
|
'pattern' => '\\%PositiveNukeTest%',
|
||||||
'wpFormIdentifier' => 'massdelete',
|
'wpFormIdentifier' => 'massdelete',
|
||||||
'wpEditToken' => $user->getEditToken(),
|
'wpEditToken' => $admin->getEditToken(),
|
||||||
], true );
|
], true );
|
||||||
$performer = new UltimateAuthority( $user );
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
@ -50,6 +379,26 @@ class SpecialNukeTest extends SpecialPageTestBase {
|
||||||
$this->assertStringNotContainsString( 'NegativeNukeTest123', $html );
|
$this->assertStringNotContainsString( 'NegativeNukeTest123', $html );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testListFiles() {
|
||||||
|
$this->uploadTestFile();
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'submit',
|
||||||
|
'namespace' => NS_FILE
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$expectedTitle = Title::makeTitle( NS_FILE, 'Example.png' );
|
||||||
|
|
||||||
|
// The title should be in the list
|
||||||
|
$this->assertStringContainsString( $expectedTitle->getPrefixedText(), $html );
|
||||||
|
// There should also be an image preview
|
||||||
|
$this->assertStringContainsString( "<img src", $html );
|
||||||
|
}
|
||||||
|
|
||||||
public function testUserPages() {
|
public function testUserPages() {
|
||||||
$user = $this->getTestUser()->getUser();
|
$user = $this->getTestUser()->getUser();
|
||||||
$this->insertPage( 'Page123', 'Test', NS_MAIN, $user );
|
$this->insertPage( 'Page123', 'Test', NS_MAIN, $user );
|
||||||
|
@ -102,10 +451,11 @@ class SpecialNukeTest extends SpecialPageTestBase {
|
||||||
|
|
||||||
$admin = $this->getTestSysop()->getUser();
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
|
||||||
|
$fauxReason = "Reason " . wfRandomString();
|
||||||
$request = new FauxRequest( [
|
$request = new FauxRequest( [
|
||||||
'action' => 'delete',
|
'action' => 'delete',
|
||||||
'wpDeleteReasonList' => 'Reason',
|
'wpDeleteReasonList' => 'Vandalism',
|
||||||
'wpReason' => 'Reason',
|
'wpReason' => $fauxReason,
|
||||||
'pages' => $pages,
|
'pages' => $pages,
|
||||||
'wpFormIdentifier' => 'nukelist',
|
'wpFormIdentifier' => 'nukelist',
|
||||||
'wpEditToken' => $admin->getEditToken(),
|
'wpEditToken' => $admin->getEditToken(),
|
||||||
|
@ -116,6 +466,173 @@ class SpecialNukeTest extends SpecialPageTestBase {
|
||||||
|
|
||||||
$this->assertStringContainsString( '(nuke-deletion-queued: Page123)', $html );
|
$this->assertStringContainsString( '(nuke-deletion-queued: Page123)', $html );
|
||||||
$this->assertStringContainsString( '(nuke-deletion-queued: Paging456)', $html );
|
$this->assertStringContainsString( '(nuke-deletion-queued: Paging456)', $html );
|
||||||
|
|
||||||
|
// Ensure all jobs are run
|
||||||
|
$this->runJobs();
|
||||||
|
|
||||||
|
$this->assertStringContainsString( 'Vandalism', $this->getDeleteLogHtml() );
|
||||||
|
$this->assertStringContainsString( $fauxReason, $this->getDeleteLogHtml() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDeleteDropdownReason() {
|
||||||
|
$pages = [];
|
||||||
|
$pages[] = $this->insertPage( 'Page123', 'Test', NS_MAIN )[ 'title' ];
|
||||||
|
$pages[] = $this->insertPage( 'Paging456', 'Test', NS_MAIN )[ 'title' ];
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'delete',
|
||||||
|
'wpDeleteReasonList' => 'Vandalism',
|
||||||
|
'wpReason' => "",
|
||||||
|
'pages' => $pages,
|
||||||
|
'wpFormIdentifier' => 'nukelist',
|
||||||
|
'wpEditToken' => $admin->getEditToken(),
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
$this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
// Ensure all jobs are run
|
||||||
|
$this->runJobs();
|
||||||
|
|
||||||
|
// Check logs
|
||||||
|
$this->assertStringContainsString( "Vandalism", $this->getDeleteLogHtml() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDeleteCustomReason() {
|
||||||
|
$pages = [];
|
||||||
|
$pages[] = $this->insertPage( 'Page123', 'Test', NS_MAIN )[ 'title' ];
|
||||||
|
$pages[] = $this->insertPage( 'Paging456', 'Test', NS_MAIN )[ 'title' ];
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
|
||||||
|
$fauxReason = "Reason " . wfRandomString();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'delete',
|
||||||
|
'wpDeleteReasonList' => 'other',
|
||||||
|
'wpReason' => $fauxReason,
|
||||||
|
'pages' => $pages,
|
||||||
|
'wpFormIdentifier' => 'nukelist',
|
||||||
|
'wpEditToken' => $admin->getEditToken(),
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
$this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
// Ensure all jobs are run
|
||||||
|
$this->runJobs();
|
||||||
|
|
||||||
|
// Check logs
|
||||||
|
$this->assertStringContainsString( $fauxReason, $this->getDeleteLogHtml() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDeleteFiles() {
|
||||||
|
$this->uploadTestFile();
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'delete',
|
||||||
|
'wpDeleteReasonList' => 'Reason',
|
||||||
|
'wpReason' => 'Reason',
|
||||||
|
'pages' => [ 'File:Example.png' ],
|
||||||
|
'wpFormIdentifier' => 'nukelist',
|
||||||
|
'wpEditToken' => $admin->getEditToken(),
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$expectedTitle = Title::makeTitle( NS_FILE, 'Example.png' );
|
||||||
|
|
||||||
|
// Files are deleted instantly
|
||||||
|
$this->assertStringContainsString( "nuke-deleted", $html );
|
||||||
|
$this->assertStringContainsString( $expectedTitle->getPrefixedText(), $html );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDeleteHook() {
|
||||||
|
$wasCalled = false;
|
||||||
|
$pages = [];
|
||||||
|
$pages[] = $this->insertPage( 'Bad article', 'test', NS_MAIN )['title'];
|
||||||
|
$pages[] = $this->insertPage( 'DO NOT DELETE', 'test', NS_MAIN )['title'];
|
||||||
|
$pages[] = $this->insertPage( 'Bad article 2', 'test', NS_MAIN )['title'];
|
||||||
|
$this->setTemporaryHook(
|
||||||
|
"NukeDeletePage",
|
||||||
|
static function ( Title $title, $reason, &$deletionResult ) use ( &$wasCalled ) {
|
||||||
|
$wasCalled = true;
|
||||||
|
$deletionResult = $title->getPrefixedText() !== "DO NOT DELETE";
|
||||||
|
return $title->getPrefixedText() === "Bad article 2";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
$admin = $this->getTestSysop()->getUser();
|
||||||
|
$request = new FauxRequest( [
|
||||||
|
'action' => 'delete',
|
||||||
|
'wpDeleteReasonList' => 'Reason',
|
||||||
|
'wpReason' => 'Reason',
|
||||||
|
'pages' => $pages,
|
||||||
|
'wpFormIdentifier' => 'nukelist',
|
||||||
|
'wpEditToken' => $admin->getRequest()->getSession()->getToken(),
|
||||||
|
], true );
|
||||||
|
$performer = new UltimateAuthority( $admin );
|
||||||
|
|
||||||
|
[ $html ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
|
||||||
|
|
||||||
|
$this->assertTrue( $wasCalled );
|
||||||
|
$this->assertStringContainsString( '(nuke-deleted: Bad article)', $html );
|
||||||
|
$this->assertStringContainsString( '(nuke-not-deleted: DO NOT DELETE)', $html );
|
||||||
|
$this->assertStringContainsString( '(nuke-deletion-queued: Bad article 2)', $html );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSearchSubpages() {
|
||||||
|
$user = $this->getTestUser()->getUser();
|
||||||
|
$username = $user->getName();
|
||||||
|
$truncatedUsername = substr( $username, 0, 2 );
|
||||||
|
|
||||||
|
$searchResults1 = $this->newSpecialPage()
|
||||||
|
->prefixSearchSubpages( $truncatedUsername, 10, 0 );
|
||||||
|
|
||||||
|
$this->assertArrayContains( [ $username ], $searchResults1 );
|
||||||
|
|
||||||
|
$searchResults2 = $this->newSpecialPage()
|
||||||
|
->prefixSearchSubpages( "", 10, 0 );
|
||||||
|
|
||||||
|
$this->assertCount( 0, $searchResults2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
private function uploadTestFile() {
|
||||||
|
$exampleFilePath = realpath( __DIR__ . "/../assets/Example.png" );
|
||||||
|
$tempFilePath = $this->getNewTempFile();
|
||||||
|
copy( $exampleFilePath, $tempFilePath );
|
||||||
|
|
||||||
|
$request = new FauxRequest( [], true );
|
||||||
|
$request->setUpload( 'wpUploadFile', [
|
||||||
|
'name' => 'Example.png',
|
||||||
|
'type' => 'image/png',
|
||||||
|
'tmp_name' => $tempFilePath,
|
||||||
|
'size' => filesize( $tempFilePath ),
|
||||||
|
'error' => UPLOAD_ERR_OK
|
||||||
|
] );
|
||||||
|
$upload = UploadFromFile::createFromRequest( $request );
|
||||||
|
$upload->performUpload(
|
||||||
|
"test",
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
$this->getTestUser( "user" )->getUser()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getDeleteLogHtml() {
|
||||||
|
$services = $this->getServiceContainer();
|
||||||
|
$specialLog = new SpecialLog(
|
||||||
|
$services->getLinkBatchFactory(),
|
||||||
|
$services->getConnectionProvider(),
|
||||||
|
$services->getActorNormalization(),
|
||||||
|
$services->getUserIdentityLookup(),
|
||||||
|
$services->getUserNameUtils()
|
||||||
|
);
|
||||||
|
$specialLog->execute( "delete" );
|
||||||
|
return $specialLog->getOutput()->getHTML();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue