aboutsummaryrefslogtreecommitdiffstats
path: root/tests/phpunit
diff options
context:
space:
mode:
authorPetr Pchelko <ppchelko@wikimedia.org>2021-04-15 21:16:55 -0700
committerPetr Pchelko <ppchelko@wikimedia.org>2021-04-26 14:02:00 -0700
commitf50c097b9a04a5260d03c70ff8eb58a0f1ccdf6c (patch)
tree891dcc7d37e8e4d5b6d30484287b58dd748659d7 /tests/phpunit
parentc32e539bcd78820b0bcdecb727cebb718950e15e (diff)
downloadmediawikicore-f50c097b9a04a5260d03c70ff8eb58a0f1ccdf6c.tar.gz
mediawikicore-f50c097b9a04a5260d03c70ff8eb58a0f1ccdf6c.zip
Keep ActorStore caches consistent on user rename
Multi-key in-memory keys for the actors is complicated enough to have it's own small abstraction. Change-Id: Id0e091504b71a44ce52d418c5737d64ac70495e9
Diffstat (limited to 'tests/phpunit')
-rw-r--r--tests/phpunit/integration/includes/user/ActorStoreTest.php17
-rw-r--r--tests/phpunit/unit/includes/user/ActorCacheTest.php116
2 files changed, 133 insertions, 0 deletions
diff --git a/tests/phpunit/integration/includes/user/ActorStoreTest.php b/tests/phpunit/integration/includes/user/ActorStoreTest.php
index 79bd4d040f38..c0524353b366 100644
--- a/tests/phpunit/integration/includes/user/ActorStoreTest.php
+++ b/tests/phpunit/integration/includes/user/ActorStoreTest.php
@@ -750,6 +750,23 @@ class ActorStoreTest extends ActorStoreTestBase {
$this->assertSameActors( $anotherActor, $store->getActorById( $anotherActorId, $this->db ) );
}
+ public function testUserRenameUpdatesActor() {
+ $user = $this->getMutableTestUser()->getUser();
+ $oldName = $user->getName();
+
+ $store = $this->getStore();
+ $actorId = $store->findActorId( $user, $this->db );
+ $this->assertTrue( $actorId > 0 );
+
+ $user->setName( 'NewName' );
+ $user->saveSettings();
+
+ $this->assertSameActors( $user, $store->getActorById( $actorId, $this->db ) );
+ $this->assertSameActors( $user, $store->getUserIdentityByName( 'NewName' ) );
+ $this->assertSameActors( $user, $store->getUserIdentityByUserId( $user->getId() ) );
+ $this->assertNull( $store->getUserIdentityByName( $oldName ) );
+ }
+
/**
* @covers ::acquireSystemActorId
*/
diff --git a/tests/phpunit/unit/includes/user/ActorCacheTest.php b/tests/phpunit/unit/includes/user/ActorCacheTest.php
new file mode 100644
index 000000000000..a165de52e960
--- /dev/null
+++ b/tests/phpunit/unit/includes/user/ActorCacheTest.php
@@ -0,0 +1,116 @@
+<?php
+
+namespace MediaWiki\Tests\Unit\User;
+
+use MediaWiki\User\ActorCache;
+use MediaWiki\User\UserIdentity;
+use MediaWiki\User\UserIdentityValue;
+use MediaWikiUnitTestCase;
+
+/**
+ * @covers \MediaWiki\User\ActorCache
+ * @package MediaWiki\Tests\Unit\User
+ */
+class ActorCacheTest extends MediaWikiUnitTestCase {
+
+ /**
+ * @param ActorCache $cache
+ * @param int $actorId
+ * @param UserIdentity $actor
+ */
+ private function assertCacheContains( ActorCache $cache, int $actorId, UserIdentity $actor ) {
+ $this->assertSame( $actor,
+ $cache->getActor( ActorCache::KEY_ACTOR_ID, $actorId ) );
+ $this->assertSame( $actor,
+ $cache->getActor( ActorCache::KEY_USER_NAME, $actor->getName() ) );
+ $this->assertSame( $actor,
+ $cache->getActor( ActorCache::KEY_USER_ID, $actor->getId( $actor->getWikiId() ) ) );
+ $this->assertSame( $actorId,
+ $cache->getActorId( ActorCache::KEY_ACTOR_ID, 1 ) );
+ $this->assertSame( $actorId,
+ $cache->getActorId( ActorCache::KEY_USER_NAME, $actor->getName() ) );
+ $this->assertSame( $actorId,
+ $cache->getActorId( ActorCache::KEY_USER_ID, $actor->getId( $actor->getWikiId() ) ) );
+ }
+
+ /**
+ * @param ActorCache $cache
+ * @param int $actorId
+ * @param string $actorName
+ * @param int $userId
+ */
+ private function assertCacheNotContains( ActorCache $cache, int $actorId, string $actorName, int $userId ) {
+ $this->assertNull( $cache->getActor( ActorCache::KEY_ACTOR_ID, $actorId ) );
+ $this->assertNull( $cache->getActor( ActorCache::KEY_USER_NAME, $actorName ) );
+ $this->assertNull( $cache->getActor( ActorCache::KEY_USER_ID, $userId ) );
+ $this->assertNull( $cache->getActorId( ActorCache::KEY_ACTOR_ID, $actorId ) );
+ $this->assertNull( $cache->getActorId( ActorCache::KEY_USER_NAME, $actorName ) );
+ $this->assertNull( $cache->getActorId( ActorCache::KEY_USER_ID, $userId ) );
+ }
+
+ public function provideGetActor() {
+ yield 'local' => [
+ 'actor' => new UserIdentityValue( 10, 'Hello' ),
+ ];
+ yield 'foreign' => [
+ 'actor' => new UserIdentityValue( 10, 'Hello', 'acmewiki' ),
+ ];
+ }
+
+ /**
+ * @dataProvider provideGetActor
+ */
+ public function testGetActor( UserIdentity $actor ) {
+ $cache = new ActorCache( 5 );
+ $cache->add( 1, $actor );
+ $this->assertCacheContains( $cache, 1, $actor );
+ }
+
+ public function provideRemove() {
+ yield 'Same actor' => [
+ 'addedActor' => new UserIdentityValue( 10, 'Hello' ),
+ 'removedActor' => new UserIdentityValue( 10, 'Hello' )
+ ];
+ yield 'Different name' => [
+ 'addedActor' => new UserIdentityValue( 10, 'Hello' ),
+ 'removedActor' => new UserIdentityValue( 10, 'Goodbye' )
+ ];
+ yield 'Different user ID' => [
+ 'addedActor' => new UserIdentityValue( 10, 'Hello' ),
+ 'removedActor' => new UserIdentityValue( 11, 'Hello' )
+ ];
+ }
+
+ /**
+ * @dataProvider provideRemove
+ */
+ public function testRemove( UserIdentity $added, UserIdentity $removed ) {
+ $cache = new ActorCache( 5 );
+ $cache->add( 1, $added );
+ $this->assertCacheContains( $cache, 1, $added );
+ $cache->remove( $removed );
+ $this->assertCacheNotContains( $cache, 1, $added->getName(), $added->getId() );
+ $this->assertCacheNotContains( $cache, 1, $removed->getName(), $removed->getId() );
+ }
+
+ public function testEvict() {
+ $cache = new ActorCache( 1 );
+ $actor1 = new UserIdentityValue( 10, 'Hello' );
+ $cache->add( 2, new UserIdentityValue( 12, 'Goodbye' ) );
+ $cache->add( 1, $actor1 );
+ $this->assertCacheContains( $cache, 1, $actor1 );
+ $this->assertCacheNotContains( $cache, 2, 'Goodbye', 12 );
+ }
+
+ public function testDoesNotCacheAnonUserId() {
+ $cache = new ActorCache( 5 );
+ $actor = new UserIdentityValue( 0, '127.0.0.1' );
+ $cache->add( 1, $actor );
+ $this->assertNull( $cache->getActor( ActorCache::KEY_USER_ID, 0 ) );
+ $this->assertNull( $cache->getActorId( ActorCache::KEY_USER_ID, 0 ) );
+ $this->assertSame( $actor, $cache->getActor( ActorCache::KEY_USER_NAME, '127.0.0.1' ) );
+ $this->assertSame( 1, $cache->getActorId( ActorCache::KEY_USER_NAME, '127.0.0.1' ) );
+ $this->assertSame( $actor, $cache->getActor( ActorCache::KEY_ACTOR_ID, 1 ) );
+ $this->assertSame( 1, $cache->getActorId( ActorCache::KEY_ACTOR_ID, 1 ) );
+ }
+}