1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
<?php
use MediaWiki\MainConfigNames;
use MediaWiki\Title\TitleValue;
use MediaWiki\User\UserIdentity;
use MediaWiki\User\UserIdentityValue;
use MediaWiki\Watchlist\ClearUserWatchlistJob;
/**
* @covers \MediaWiki\Watchlist\ClearUserWatchlistJob
*
* @group JobQueue
* @group Database
*
* @license GPL-2.0-or-later
* @author Addshore
*/
class ClearUserWatchlistJobTest extends MediaWikiIntegrationTestCase {
private function getUser(): UserIdentity {
return new UserIdentityValue( 42, 'ClearUserWatchlistJobTestUser' );
}
private function getWatchedItemStore() {
return $this->getServiceContainer()->getWatchedItemStore();
}
public function testRun() {
$user = $this->getUser();
$watchedItemStore = $this->getWatchedItemStore();
$watchedItemStore->addWatch( $user, new TitleValue( 0, 'A' ) );
$watchedItemStore->addWatch( $user, new TitleValue( 1, 'A' ) );
$watchedItemStore->addWatch( $user, new TitleValue( 0, 'B' ) );
$watchedItemStore->addWatch( $user, new TitleValue( 1, 'B' ) );
$maxId = $watchedItemStore->getMaxId();
$watchedItemStore->addWatch( $user, new TitleValue( 0, 'C' ) );
$watchedItemStore->addWatch( $user, new TitleValue( 1, 'C' ) );
$this->overrideConfigValue( MainConfigNames::UpdateRowsPerQuery, 2 );
$jobQueueGroup = $this->getServiceContainer()->getJobQueueGroup();
$jobQueueGroup->push(
new ClearUserWatchlistJob( [
'userId' => $user->getId(), 'maxWatchlistId' => $maxId,
] )
);
$this->assertSame( 1, $jobQueueGroup->getQueueSizes()['clearUserWatchlist'] );
$this->assertEquals( 6, $watchedItemStore->countWatchedItems( $user ) );
$this->runJobs( [ 'complete' => false ], [ 'maxJobs' => 1 ] );
$this->assertSame( 1, $jobQueueGroup->getQueueSizes()['clearUserWatchlist'] );
$this->assertEquals( 4, $watchedItemStore->countWatchedItems( $user ) );
$this->runJobs( [ 'complete' => false ], [ 'maxJobs' => 1 ] );
$this->assertSame( 1, $jobQueueGroup->getQueueSizes()['clearUserWatchlist'] );
$this->assertEquals( 2, $watchedItemStore->countWatchedItems( $user ) );
$this->runJobs( [ 'complete' => false ], [ 'maxJobs' => 1 ] );
$this->assertSame( 0, $jobQueueGroup->getQueueSizes()['clearUserWatchlist'] );
$this->assertEquals( 2, $watchedItemStore->countWatchedItems( $user ) );
$this->assertTrue( $watchedItemStore->isWatched( $user, new TitleValue( 0, 'C' ) ) );
$this->assertTrue( $watchedItemStore->isWatched( $user, new TitleValue( 1, 'C' ) ) );
}
public function testRunWithWatchlistExpiry() {
// Set up.
$this->overrideConfigValue( MainConfigNames::WatchlistExpiry, true );
$user = $this->getUser();
$watchedItemStore = $this->getWatchedItemStore();
// Add two watched items, one with an expiry.
$watchedItemStore->addWatch( $user, new TitleValue( 0, __METHOD__ . 'no expiry' ) );
$watchedItemStore->addWatch( $user, new TitleValue( 0, __METHOD__ . 'has expiry' ), '1 week' );
// Get the IDs of these items.
$itemIds = $this->getDb()->newSelectQueryBuilder()
->select( 'wl_id' )
->from( 'watchlist' )
->where( [ 'wl_user' => $user->getId() ] )
->caller( __METHOD__ )->fetchFieldValues();
// Clear the watchlist by running the job.
$job = new ClearUserWatchlistJob( [
'userId' => $user->getId(),
'maxWatchlistId' => max( $itemIds ),
] );
$this->getServiceContainer()->getJobQueueGroup()->push( $job );
$this->runJobs( [ 'complete' => false ], [ 'maxJobs' => 1 ] );
// Confirm that there are now no expiry records.
$watchedCount = $this->getDb()->newSelectQueryBuilder()
->select( '*' )
->from( 'watchlist_expiry' )
->where( [ 'we_item' => $itemIds ] )
->caller( __METHOD__ )->fetchRowCount();
$this->assertSame( 0, $watchedCount );
}
}
|