wiki.techinc.nl/tests/phpunit/integration/includes/watchlist/WatchlistManagerTest.php
daniel e239b02a5e Add convenience methods for asserting status.
This ensures that assertions work in a uniform way,
and provides meaningful messages in cause of failure.

Change-Id: Ic01715b9a55444d3df6b5d4097e78cb8ac082b3e
2022-03-16 22:44:25 +01:00

224 lines
9.7 KiB
PHP

<?php
use MediaWiki\Page\PageIdentityValue;
use MediaWiki\Tests\Unit\Permissions\MockAuthorityTrait;
use MediaWiki\User\UserIdentityValue;
/**
* @covers \MediaWiki\Watchlist\WatchlistManager
*
* @author DannyS712
* @group Database
*/
class WatchlistManagerTest extends MediaWikiIntegrationTestCase {
use MockAuthorityTrait;
protected function setUp(): void {
parent::setUp();
$this->tablesUsed[] = 'watchlist';
}
/**
* Can't move to unit tests because we need to test DeferredUpdates handling
*
* @covers \MediaWiki\Watchlist\WatchlistManager::clearTitleUserNotifications
*/
public function testClearTitleUserNotifications() {
$username = 'User Name';
$userIdentity = new UserIdentityValue( 100, $username );
$performer = $this->mockUserAuthorityWithPermissions( $userIdentity, [ 'editmywatchlist' ] );
$title = new PageIdentityValue( 100, NS_USER_TALK, $username, PageIdentityValue::LOCAL );
$watchlistManager = $this->getServiceContainer()->getWatchlistManager();
$this->db->startAtomic( __METHOD__ ); // let deferred updates queue up
$updateCountBefore = DeferredUpdates::pendingUpdatesCount();
$watchlistManager->clearTitleUserNotifications( $performer, $title );
$updateCountAfter = DeferredUpdates::pendingUpdatesCount();
$this->assertGreaterThan( $updateCountBefore, $updateCountAfter, 'An update should have been queued' );
$this->db->endAtomic( __METHOD__ ); // run deferred updates
$this->assertSame( 0, DeferredUpdates::pendingUpdatesCount(), 'No pending updates' );
}
/**
* While this *could* be moved to a unit test, it is specifically kept
* here as an integration test to double check that the actual integration
* between this service and others, and getting this service from the
* service container, works as expected. Please don't move it to
* the unit tests.
*
* @covers \MediaWiki\Watchlist\WatchlistManager::isWatched
* @covers \MediaWiki\Watchlist\WatchlistManager::isTempWatched
* @covers \MediaWiki\Watchlist\WatchlistManager::addWatch
* @covers \MediaWiki\Watchlist\WatchlistManager::addWatchIgnoringRights()
* @covers \MediaWiki\Watchlist\WatchlistManager::removeWatch()
*/
public function testWatchlist() {
$userIdentity = new UserIdentityValue( 100, 'User Name' );
$authority = $this->mockUserAuthorityWithPermissions(
$userIdentity,
[ 'editmywatchlist', 'viewmywatchlist' ]
);
$title = new PageIdentityValue( 100, NS_MAIN, 'Page_db_Key_goesHere', PageIdentityValue::LOCAL );
$services = $this->getServiceContainer();
$watchedItemStore = $services->getWatchedItemStore();
$watchlistManager = $services->getWatchlistManager();
$watchedItemStore->clearUserWatchedItems( $userIdentity );
$this->assertFalse(
$watchlistManager->isWatched( $authority, $title ),
'The article has not been watched yet'
);
$this->assertFalse(
$watchlistManager->isTempWatched( $authority, $title ),
"The article hasn't been temporarily watched"
);
$watchlistManager->addWatch( $authority, $title );
$this->assertTrue( $watchlistManager->isWatched( $authority, $title ), 'The article has been watched' );
$this->assertFalse(
$watchlistManager->isTempWatched( $authority, $title ),
"The article hasn't been temporarily watched"
);
$watchlistManager->removeWatch( $authority, $title );
$this->assertFalse( $watchlistManager->isWatched( $authority, $title ), 'The article has been unwatched' );
$this->assertFalse(
$watchlistManager->isTempWatched( $authority, $title ),
"The article hasn't been temporarily watched"
);
$watchlistManager->addWatch( $authority, $title, '2 weeks' );
$this->assertTrue( $watchlistManager->isWatched( $authority, $title ), 'The article has been watched' );
$this->assertTrue(
$watchlistManager->isTempWatched( $authority, $title ), 'The article has been tempoarily watched'
);
$watchlistManager->removeWatch( $authority, $title );
$this->assertFalse( $watchlistManager->isWatched( $authority, $title ), 'The article has been unwatched' );
$this->assertFalse(
$watchlistManager->isTempWatched( $authority, $title ),
"The article hasn't been temporarily watched"
);
$watchlistManager->addWatchIgnoringRights( $userIdentity, $title );
$this->assertTrue( $watchlistManager->isWatched( $authority, $title ), 'The article has been watched' );
$this->assertFalse(
$watchlistManager->isTempWatched( $authority, $title ),
"The article hasn't been temporarily watched"
);
}
/**
* Can't move to unit tests because if the user is missing rights
* the status is from User::newFatalPermissionDeniedStatus which uses
* MediaWikiServices
*
* @covers \MediaWiki\Watchlist\WatchlistManager::isWatched
* @covers \MediaWiki\Watchlist\WatchlistManager::isWatchedIgnoringRights
* @covers \MediaWiki\Watchlist\WatchlistManager::isTempWatched
* @covers \MediaWiki\Watchlist\WatchlistManager::isTempWatchedIgnoringRights
* @covers \MediaWiki\Watchlist\WatchlistManager::addWatch
* @covers \MediaWiki\Watchlist\WatchlistManager::addWatchIgnoringRights()
* @covers \MediaWiki\Watchlist\WatchlistManager::removeWatch()
*/
public function testWatchlistNoRights() {
$userIdentity = new UserIdentityValue( 100, 'User Name' );
$authority = $this->mockUserAuthorityWithPermissions( $userIdentity, [] );
$title = new PageIdentityValue( 100, NS_MAIN, 'Page_db_Key_goesHere', PageIdentityValue::LOCAL );
$services = $this->getServiceContainer();
$watchedItemStore = $services->getWatchedItemStore();
$watchlistManager = $services->getWatchlistManager();
$watchedItemStore->clearUserWatchedItems( $userIdentity );
$this->assertFalse( $watchlistManager->isWatched( $authority, $title ) );
$this->assertFalse( $watchlistManager->isTempWatched( $authority, $title ) );
$this->assertFalse( $watchlistManager->isWatchedIgnoringRights( $userIdentity, $title ) );
$this->assertFalse( $watchlistManager->isTempWatchedIgnoringRights( $userIdentity, $title ) );
$watchlistManager->addWatch( $authority, $title );
$this->assertFalse( $watchlistManager->isWatched( $authority, $title ) );
$this->assertFalse( $watchlistManager->isTempWatched( $authority, $title ) );
$this->assertFalse( $watchlistManager->isWatchedIgnoringRights( $userIdentity, $title ) );
$this->assertFalse( $watchlistManager->isTempWatchedIgnoringRights( $userIdentity, $title ) );
$watchlistManager->addWatchIgnoringRights( $userIdentity, $title );
$this->assertFalse( $watchlistManager->isWatched( $authority, $title ) );
$this->assertFalse( $watchlistManager->isTempWatched( $authority, $title ) );
$this->assertTrue( $watchlistManager->isWatchedIgnoringRights( $userIdentity, $title ) );
$this->assertFalse( $watchlistManager->isTempWatchedIgnoringRights( $userIdentity, $title ) );
$watchlistManager->addWatchIgnoringRights( $userIdentity, $title, '1 week' );
$this->assertFalse( $watchlistManager->isWatched( $authority, $title ) );
$this->assertFalse( $watchlistManager->isTempWatched( $authority, $title ) );
$this->assertTrue( $watchlistManager->isWatchedIgnoringRights( $userIdentity, $title ) );
$this->assertTrue( $watchlistManager->isTempWatchedIgnoringRights( $userIdentity, $title ) );
$watchlistManager->removeWatch( $authority, $title );
$this->assertFalse( $watchlistManager->isWatched( $authority, $title ) );
$this->assertFalse( $watchlistManager->isTempWatched( $authority, $title ) );
$this->assertTrue( $watchlistManager->isWatchedIgnoringRights( $userIdentity, $title ) );
$this->assertTrue( $watchlistManager->isTempWatchedIgnoringRights( $userIdentity, $title ) );
$watchlistManager->removeWatchIgnoringRights( $userIdentity, $title );
$this->assertFalse( $watchlistManager->isWatched( $authority, $title ) );
$this->assertFalse( $watchlistManager->isTempWatched( $authority, $title ) );
$this->assertFalse( $watchlistManager->isWatchedIgnoringRights( $userIdentity, $title ) );
$this->assertFalse( $watchlistManager->isTempWatchedIgnoringRights( $userIdentity, $title ) );
}
/**
* Can't move to unit tests because if the user is missing rights
* the status is from User::newFatalPermissionDeniedStatus which uses
* MediaWikiServices
*
* @covers \MediaWiki\Watchlist\WatchlistManager::addWatch()
*/
public function testAddWatchUserNotPermittedStatusNotGood() {
$userIdentity = new UserIdentityValue( 100, 'User Name' );
$performer = $this->mockUserAuthorityWithPermissions( $userIdentity, [] );
$title = new PageIdentityValue( 100, NS_MAIN, 'Page_db_Key_goesHere', PageIdentityValue::LOCAL );
$services = $this->getServiceContainer();
$watchedItemStore = $services->getWatchedItemStore();
$watchlistManager = $services->getWatchlistManager();
$watchedItemStore->clearUserWatchedItems( $userIdentity );
$actual = $watchlistManager->addWatch( $performer, $title );
$this->assertStatusNotGood( $actual );
$this->assertFalse( $watchlistManager->isWatchedIgnoringRights( $userIdentity, $title ) );
}
/**
* Can't move to unit tests because if the user is missing rights
* the status is from User::newFatalPermissionDeniedStatus which uses
* MediaWikiServices
*
* @covers \MediaWiki\Watchlist\WatchlistManager::removeWatch()
*/
public function testRemoveWatchWithoutRights() {
$userIdentity = new UserIdentityValue( 100, 'User Name' );
$performer = $this->mockUserAuthorityWithPermissions( $userIdentity, [] );
$title = new PageIdentityValue( 100, NS_MAIN, 'Page_db_Key_goesHere', PageIdentityValue::LOCAL );
$services = $this->getServiceContainer();
$watchlistManager = $services->getWatchlistManager();
$watchlistManager->addWatchIgnoringRights( $userIdentity, $title );
$actual = $watchlistManager->removeWatch( $performer, $title );
$this->assertStatusNotGood( $actual );
$this->assertTrue( $watchlistManager->isWatchedIgnoringRights( $userIdentity, $title ) );
}
}