Initally used a new sniff with autofix (T333745), but some provide are defined non-static in TestBase class and need more work to make them static in a compatible way Bug: T332865 Change-Id: I889d33424f0c01fb26f2d86f8d4fc3de3e568843
195 lines
6.5 KiB
PHP
195 lines
6.5 KiB
PHP
<?php
|
|
|
|
use MediaWiki\MainConfigNames;
|
|
use MediaWiki\User\UserOptionsLookup;
|
|
|
|
/**
|
|
* @group Database
|
|
*
|
|
* @covers WatchedItemQueryService
|
|
*/
|
|
class WatchedItemQueryServiceIntegrationTest extends MediaWikiIntegrationTestCase {
|
|
|
|
protected function setUp(): void {
|
|
parent::setUp();
|
|
|
|
$this->tablesUsed[] = 'watchlist';
|
|
$this->tablesUsed[] = 'watchlist_expiry';
|
|
|
|
$this->overrideConfigValue( MainConfigNames::WatchlistExpiry, true );
|
|
}
|
|
|
|
public function testGetWatchedItemsForUser(): void {
|
|
$store = $this->getServiceContainer()->getWatchedItemStore();
|
|
$queryService = $this->getServiceContainer()->getWatchedItemQueryService();
|
|
$user = self::getTestUser()->getUser();
|
|
$initialCount = count( $store->getWatchedItemsForUser( $user ) );
|
|
|
|
// Add two watched items, one of which is already expired, and check that only 1 is returned.
|
|
$store->addWatch(
|
|
$user,
|
|
new TitleValue( 0, __METHOD__ . ' no expiry 1' )
|
|
);
|
|
$store->addWatch(
|
|
$user,
|
|
new TitleValue( 0, __METHOD__ . ' expired a week ago or in a week' ),
|
|
'1 week ago'
|
|
);
|
|
$result1 = $queryService->getWatchedItemsForUser( $user );
|
|
$this->assertCount( $initialCount + 1, $result1, "User ID: " . $user->getId() );
|
|
|
|
// Add another of each type of item, and make sure the new results are as expected.
|
|
$store->addWatch(
|
|
$user,
|
|
new TitleValue( 0, __METHOD__ . ' no expiry 2' )
|
|
);
|
|
$store->addWatch(
|
|
$user,
|
|
new TitleValue( 0, __METHOD__ . ' expired a week ago 2' ),
|
|
'1 week ago'
|
|
);
|
|
$result2 = $queryService->getWatchedItemsForUser( $user );
|
|
$this->assertCount( $initialCount + 2, $result2 );
|
|
|
|
// Make one of the expired items permanent, and check again.
|
|
$store->addWatch(
|
|
$user,
|
|
new TitleValue( 0, __METHOD__ . ' expired a week ago 2' ),
|
|
'infinity'
|
|
);
|
|
$result3 = $queryService->getWatchedItemsForUser( $user );
|
|
$this->assertCount( $initialCount + 3, $result3 );
|
|
|
|
// Make the other expired item expire in a week's time, and make sure it appears in the list.
|
|
$store->addWatch(
|
|
$user,
|
|
new TitleValue( 0, __METHOD__ . ' expired a week ago or in a week' ),
|
|
'1 week'
|
|
);
|
|
$result4 = $queryService->getWatchedItemsForUser( $user );
|
|
$this->assertCount( $initialCount + 4, $result4 );
|
|
}
|
|
|
|
public function testGetWatchedItemsForUserWithExpiriesDisabled() {
|
|
$this->overrideConfigValue( MainConfigNames::WatchlistExpiry, false );
|
|
$store = $this->getServiceContainer()->getWatchedItemStore();
|
|
$queryService = $this->getServiceContainer()->getWatchedItemQueryService();
|
|
$user = self::getTestUser()->getUser();
|
|
$initialCount = count( $store->getWatchedItemsForUser( $user ) );
|
|
$store->addWatch( $user, new TitleValue( 0, __METHOD__ ), '1 week ago' );
|
|
$result = $queryService->getWatchedItemsForUser( $user );
|
|
$this->assertCount( $initialCount + 1, $result );
|
|
}
|
|
|
|
public function testGetWatchedItemsWithRecentChangeInfo_watchlistExpiry(): void {
|
|
$store = $this->getServiceContainer()->getWatchedItemStore();
|
|
$queryService = $this->getServiceContainer()->getWatchedItemQueryService();
|
|
$user = self::getTestUser()->getUser();
|
|
$options = [];
|
|
$startFrom = null;
|
|
$initialCount = count( $queryService->getWatchedItemsWithRecentChangeInfo( $user,
|
|
$options, $startFrom ) );
|
|
|
|
// Add two watched items, one of which is already expired, and check that only 1 is returned.
|
|
$userEditTarget1 = new TitleValue( 0, __METHOD__ . ' no expiry 1' );
|
|
$this->editPage( $userEditTarget1->getDBkey(), 'First revision' );
|
|
$store->addWatch(
|
|
$user,
|
|
$userEditTarget1
|
|
);
|
|
|
|
$userEditTarget2 = new TitleValue( 0, __METHOD__ . ' expired a week ago or in a week' );
|
|
$this->editPage( $userEditTarget2->getDBkey(), 'First revision' );
|
|
$store->addWatch(
|
|
$user,
|
|
$userEditTarget2,
|
|
'1 week ago'
|
|
);
|
|
|
|
$result1 = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options, $startFrom );
|
|
$this->assertCount( $initialCount + 1, $result1 );
|
|
|
|
// Add another of each type of item, and make sure the new results are as expected.
|
|
$userEditTarget3 = new TitleValue( 0, __METHOD__ . ' no expiry 2' );
|
|
$this->editPage( $userEditTarget3->getDBkey(), 'First revision' );
|
|
$store->addWatch(
|
|
$user,
|
|
$userEditTarget3
|
|
);
|
|
|
|
$userEditTarget4 = new TitleValue( 0, __METHOD__ . ' expired a week ago 2' );
|
|
$this->editPage( $userEditTarget4->getDBkey(), 'First revision' );
|
|
$store->addWatch(
|
|
$user,
|
|
$userEditTarget4,
|
|
'1 week ago'
|
|
);
|
|
$result2 = $queryService->getWatchedItemsWithRecentChangeInfo( $user );
|
|
$this->assertCount( $initialCount + 2, $result2 );
|
|
|
|
// Make one of the expired items permanent, and check again.
|
|
$store->addWatch(
|
|
$user,
|
|
$userEditTarget4,
|
|
'infinity'
|
|
);
|
|
$result3 = $queryService->getWatchedItemsWithRecentChangeInfo( $user );
|
|
$this->assertCount( $initialCount + 3, $result3 );
|
|
|
|
// Make the other expired item expire in a week's time, and make sure it appears in the list.
|
|
$store->addWatch(
|
|
$user,
|
|
$userEditTarget2,
|
|
'1 week'
|
|
);
|
|
$result4 = $queryService->getWatchedItemsWithRecentChangeInfo( $user );
|
|
$this->assertCount( $initialCount + 4, $result4 );
|
|
}
|
|
|
|
public static function invalidWatchlistTokenProvider() {
|
|
return [
|
|
[ 'wrongToken' ],
|
|
[ '' ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider invalidWatchlistTokenProvider
|
|
*/
|
|
public function testGetWatchedItemsWithRecentChangeInfo_watchlistOwnerAndInvalidToken( $token ) {
|
|
// Moved from the Unit test because the ApiUsageException call creates a Message object
|
|
// and down the line needs MediaWikiServices
|
|
$user = $this->createNoOpMock(
|
|
User::class,
|
|
[ 'isRegistered', 'getId', 'useRCPatrol' ]
|
|
);
|
|
$user->method( 'isRegistered' )->willReturn( true );
|
|
$user->method( 'getId' )->willReturn( 1 );
|
|
$user->method( 'useRCPatrol' )->willReturn( true );
|
|
|
|
$otherUser = $this->createNoOpMock(
|
|
User::class,
|
|
[ 'isRegistered', 'getId', 'useRCPatrol' ]
|
|
);
|
|
$otherUser->method( 'isRegistered' )->willReturn( true );
|
|
$otherUser->method( 'getId' )->willReturn( 2 );
|
|
$otherUser->method( 'useRCPatrol' )->willReturn( true );
|
|
|
|
$userOptionsLookup = $this->createMock( UserOptionsLookup::class );
|
|
$userOptionsLookup->expects( $this->once() )
|
|
->method( 'getOption' )
|
|
->with( $otherUser, 'watchlisttoken' )
|
|
->willReturn( '0123456789abcdef' );
|
|
|
|
$this->setService( 'UserOptionsLookup', $userOptionsLookup );
|
|
|
|
$queryService = $this->getServiceContainer()->getWatchedItemQueryService();
|
|
|
|
$this->expectException( ApiUsageException::class );
|
|
$this->expectExceptionMessage( 'Incorrect watchlist token provided' );
|
|
$queryService->getWatchedItemsWithRecentChangeInfo(
|
|
$user,
|
|
[ 'watchlistOwner' => $otherUser, 'watchlistOwnerToken' => $token ]
|
|
);
|
|
}
|
|
}
|