wiki.techinc.nl/tests/phpunit/includes/user/UserEditTrackerTest.php
Tim Starling 02ae9aa0ba Rewrite UserEditTrackerTest as an integration test
As previously discussed, the database should usually not be mocked. I'm
changing many of these queries for the next stage of the actor
migration, and just copying my own query from the code to the test file
does not give me any confidence that the query I'm writing is correct.
The unit test was simply ensuring that the implementation of the class
doesn't change, it wasn't verifying correct operation.

Change-Id: Id3ee02fd547d0a7b5b7f35866ee317e8b09e6c18
2021-05-11 13:03:45 +10:00

128 lines
4.3 KiB
PHP

<?php
use MediaWiki\Revision\MutableRevisionRecord;
use MediaWiki\Revision\SlotRecord;
use MediaWiki\User\UserFactory;
use MediaWiki\User\UserIdentity;
use MediaWiki\User\UserIdentityValue;
/**
* @covers \MediaWiki\User\UserEditTracker
* @group Database
*/
class UserEditTrackerTest extends MediaWikiIntegrationTestCase {
/**
* Do an edit
*
* @param UserIdentity $user
* @param string $timestamp
* @param bool $create
*/
private function editTrackerDoEdit( $user, $timestamp, $create ) {
$title = Title::newFromText( __FUNCTION__ );
$page = $this->getServiceContainer()->getWikiPageFactory()->newFromTitle( $title );
if ( $create ) {
$page->insertOn( $this->db );
}
$rev = new MutableRevisionRecord( $title );
$rev->setContent( SlotRecord::MAIN, new WikitextContent( $timestamp ) );
$rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
$rev->setTimestamp( $timestamp );
$rev->setUser( $user );
$rev->setPageId( $page->getId() );
$this->getServiceContainer()->getRevisionStore()->insertRevisionOn( $rev, $this->db );
}
/**
* Change the user_editcount field in the DB
*
* @param UserIdentity $user
* @param int|null $count
*/
private function setDbEditCount( $user, $count ) {
$this->db->update(
'user',
[ 'user_editcount' => $count ],
[ 'user_id' => $user->getId() ],
__METHOD__ );
}
public function testGetUserEditCount() {
// Set user_editcount to 5
$user = $this->getMutableTestUser()->getUser();
$update = new UserEditCountUpdate( $user, 5 );
$update->doUpdate();
$tracker = $this->getServiceContainer()->getUserEditTracker();
$this->assertSame( 5, $tracker->getUserEditCount( $user ) );
// Now fetch from cache
$this->assertSame( 5, $tracker->getUserEditCount( $user ) );
}
public function testGetUserEditCount_exception() {
// getUserEditCount throws if the user id is falsy
$userId = 0;
$user = new UserIdentityValue( $userId, __CLASS__ );
$tracker = $this->getServiceContainer()->getUserEditTracker();
$this->expectException( InvalidArgumentException::class );
$this->expectExceptionMessage( 'requires a user ID' );
$tracker->getUserEditCount( $user );
}
public function testGetUserEditCount_null() {
// getUserEditCount doesn't find a value in user_editcount and calls
// initializeUserEditCount
$user = $this->getMutableTestUser()->getUserIdentity();
$this->setDbEditCount( $user, null );
$tracker = $this->getServiceContainer()->getUserEditTracker();
$this->assertSame( 0, $tracker->getUserEditCount( $user ) );
}
public function testInitializeUserEditCount() {
$user = $this->getMutableTestUser()->getUser();
$this->editTrackerDoEdit( $user, '20200101000000', true );
$tracker = $this->getServiceContainer()->getUserEditTracker();
$tracker->initializeUserEditCount( $user );
$this->runJobs();
$this->assertSame( 1, $tracker->getUserEditCount( $user ) );
}
public function testGetEditTimestamp() {
$user = $this->getMutableTestUser()->getUser();
$tracker = $this->getServiceContainer()->getUserEditTracker();
$this->assertFalse( $tracker->getFirstEditTimestamp( $user ) );
$this->assertFalse( $tracker->getLatestEditTimestamp( $user ) );
$ts1 = '20010101000000';
$ts2 = '20020101000000';
$ts3 = '20030101000000';
$this->editTrackerDoEdit( $user, $ts3, false );
$this->editTrackerDoEdit( $user, $ts2, false );
$this->editTrackerDoEdit( $user, $ts1, true );
$this->assertSame( $ts1, $tracker->getFirstEditTimestamp( $user ) );
$this->assertSame( $ts3, $tracker->getLatestEditTimestamp( $user ) );
}
public function testGetEditTimestamp_anon() {
$user = $this->getServiceContainer()->getUserFactory()
->newFromName( '127.0.0.1', UserFactory::RIGOR_NONE );
$tracker = $this->getServiceContainer()->getUserEditTracker();
$this->editTrackerDoEdit( $user, '20200101000000', true );
$this->assertFalse( $tracker->getFirstEditTimestamp( $user ) );
$this->assertFalse( $tracker->getLatestEditTimestamp( $user ) );
}
public function testClearUserEditCache() {
$user = $this->getMutableTestUser()->getUser();
$tracker = $this->getServiceContainer()->getUserEditTracker();
$this->assertSame( 0, $tracker->getUserEditCount( $user ) );
$this->setDbEditCount( $user, 1 );
$this->assertSame( 0, $tracker->getUserEditCount( $user ) );
$tracker->clearUserEditCache( $user );
$this->assertSame( 1, $tracker->getUserEditCount( $user ) );
}
}