From d16d8bdf0747ee35965fd921f6adb38ca65fd5e2 Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Thu, 4 Apr 2019 15:23:41 -0400 Subject: [PATCH] Default $wgActorTableSchemaMigrationStage to SCHEMA_COMPAT_NEW Probably good to start testing this in CI sometime soon. This also updates a bunch of tests that were forcing an older stage to force SCHEMA_COMPAT_NEW instead, or to test both ways (until a future patch removes the _OLD version). Bug: T188327 Change-Id: Icb9b55cb9d754f2d30d6883005658b9670834756 --- includes/DefaultSettings.php | 2 +- tests/phpunit/includes/ActorMigrationTest.php | 34 +++-- .../Revision/RevisionStoreDbTestBase.php | 21 ++- tests/phpunit/includes/RevisionDbTestBase.php | 2 +- tests/phpunit/includes/RevisionTest.php | 3 +- .../api/query/ApiQueryUserContribsTest.php | 3 +- .../includes/page/PageArchiveMcrTest.php | 6 +- .../includes/page/PageArchivePreMcrTest.php | 6 +- .../includes/page/PageArchiveTestBase.php | 2 +- .../ChangesListSpecialPageTest.php | 140 ++++++++++++++++++ tests/phpunit/includes/user/UserTest.php | 73 ++++++++- 11 files changed, 266 insertions(+), 26 deletions(-) diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 1c76121561..b40d33b17e 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -8984,7 +8984,7 @@ $wgXmlDumpSchemaVersion = XML_DUMP_SCHEMA_VERSION_10; * @since 1.32 changed allowed flags * @var int An appropriate combination of SCHEMA_COMPAT_XXX flags. */ -$wgActorTableSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW; +$wgActorTableSchemaMigrationStage = SCHEMA_COMPAT_NEW; /** * Flag to enable Partial Blocks. This allows an admin to prevent a user from editing specific pages diff --git a/tests/phpunit/includes/ActorMigrationTest.php b/tests/phpunit/includes/ActorMigrationTest.php index 1f2b13cfa8..de70f261e4 100644 --- a/tests/phpunit/includes/ActorMigrationTest.php +++ b/tests/phpunit/includes/ActorMigrationTest.php @@ -658,14 +658,18 @@ class ActorMigrationTest extends MediaWikiLangTestCase { $callback( 1, [] ); } - public function testInsertUserIdentity() { + /** + * @dataProvider provideStages + * @param int $stage + */ + public function testInsertUserIdentity( $stage ) { $this->setMwGlobals( [ // for User::getActorId() - 'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD + 'wgActorTableSchemaMigrationStage' => $stage ] ); $this->overrideMwServices(); - $user = $this->getTestUser()->getUser(); + $user = $this->getMutableTestUser()->getUser(); $userIdentity = $this->getMock( UserIdentity::class ); $userIdentity->method( 'getId' )->willReturn( $user->getId() ); $userIdentity->method( 'getName' )->willReturn( $user->getName() ); @@ -673,7 +677,7 @@ class ActorMigrationTest extends MediaWikiLangTestCase { list( $cFields, $cCallback ) = MediaWikiServices::getInstance()->getCommentStore() ->insertWithTempTable( $this->db, 'rev_comment', '' ); - $m = $this->makeMigration( SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW ); + $m = $this->makeMigration( $stage ); list( $fields, $callback ) = $m->getInsertValuesWithTempTable( $this->db, 'rev_user', $userIdentity ); $extraFields = [ @@ -692,13 +696,25 @@ class ActorMigrationTest extends MediaWikiLangTestCase { ); $this->assertSame( $user->getId(), (int)$row->rev_user ); $this->assertSame( $user->getName(), $row->rev_user_text ); - $this->assertSame( $user->getActorId(), (int)$row->rev_actor ); + $this->assertSame( + ( $stage & SCHEMA_COMPAT_READ_NEW ) ? $user->getActorId() : 0, + (int)$row->rev_actor + ); - $m = $this->makeMigration( SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW ); + $m = $this->makeMigration( $stage ); $fields = $m->getInsertValues( $this->db, 'dummy_user', $userIdentity ); - $this->assertSame( $user->getId(), $fields['dummy_user'] ); - $this->assertSame( $user->getName(), $fields['dummy_user_text'] ); - $this->assertSame( $user->getActorId(), $fields['dummy_actor'] ); + if ( $stage & SCHEMA_COMPAT_WRITE_OLD ) { + $this->assertSame( $user->getId(), $fields['dummy_user'] ); + $this->assertSame( $user->getName(), $fields['dummy_user_text'] ); + } else { + $this->assertArrayNotHasKey( 'dummy_user', $fields ); + $this->assertArrayNotHasKey( 'dummy_user_text', $fields ); + } + if ( $stage & SCHEMA_COMPAT_WRITE_NEW ) { + $this->assertSame( $user->getActorId(), $fields['dummy_actor'] ); + } else { + $this->assertArrayNotHasKey( 'dummy_actor', $fields ); + } } public function testNewMigration() { diff --git a/tests/phpunit/includes/Revision/RevisionStoreDbTestBase.php b/tests/phpunit/includes/Revision/RevisionStoreDbTestBase.php index 51c483d55d..b183fcab47 100644 --- a/tests/phpunit/includes/Revision/RevisionStoreDbTestBase.php +++ b/tests/phpunit/includes/Revision/RevisionStoreDbTestBase.php @@ -81,7 +81,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase { $this->setMwGlobals( [ 'wgMultiContentRevisionSchemaMigrationStage' => $this->getMcrMigrationStage(), 'wgContentHandlerUseDB' => $this->getContentHandlerUseDB(), - 'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_OLD, + 'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_NEW, ] ); $this->overrideMwServices(); @@ -438,9 +438,19 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase { $queryInfo = $store->getQueryInfo( [ 'user' ] ); $row = get_object_vars( $row ); + + // Use aliased fields from $queryInfo, e.g. rev_user + $keys = array_keys( $row ); + $keys = array_combine( $keys, $keys ); + $fields = array_intersect_key( $queryInfo['fields'], $keys ) + $keys; + + // assertSelect() fails unless the orders match. + ksort( $fields ); + ksort( $row ); + $this->assertSelect( $queryInfo['tables'], - array_keys( $row ), + $fields, [ 'rev_id' => $rev->getId() ], [ array_values( $row ) ], [], @@ -800,7 +810,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase { 'rev_page' => (string)$rev->getPage(), 'rev_timestamp' => $this->db->timestamp( $rev->getTimestamp() ), 'rev_user_text' => (string)$rev->getUserText(), - 'rev_user' => (string)$rev->getUser(), + 'rev_user' => (string)$rev->getUser() ?: null, 'rev_minor_edit' => $rev->isMinor() ? '1' : '0', 'rev_deleted' => (string)$rev->getVisibility(), 'rev_len' => (string)$rev->getSize(), @@ -1808,7 +1818,10 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase { /** @var Revision $rev */ $rev = $page->doEditContent( new WikitextContent( $text ), - __METHOD__ + __METHOD__, + 0, + false, + $this->getMutableTestUser()->getUser() )->value['revision']; $store = MediaWikiServices::getInstance()->getRevisionStore(); diff --git a/tests/phpunit/includes/RevisionDbTestBase.php b/tests/phpunit/includes/RevisionDbTestBase.php index 983b701923..13ddffac14 100644 --- a/tests/phpunit/includes/RevisionDbTestBase.php +++ b/tests/phpunit/includes/RevisionDbTestBase.php @@ -91,7 +91,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase { $this->setMwGlobals( [ 'wgMultiContentRevisionSchemaMigrationStage' => $this->getMcrMigrationStage(), 'wgContentHandlerUseDB' => $this->getContentHandlerUseDB(), - 'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_OLD, + 'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_NEW, ] ); $this->overrideMwServices(); diff --git a/tests/phpunit/includes/RevisionTest.php b/tests/phpunit/includes/RevisionTest.php index 02a6c19d1f..98f2980f93 100644 --- a/tests/phpunit/includes/RevisionTest.php +++ b/tests/phpunit/includes/RevisionTest.php @@ -601,7 +601,7 @@ class RevisionTest extends MediaWikiTestCase { * @covers Revision::loadFromTitle */ public function testLoadFromTitle() { - $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_OLD ); + $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_NEW ); $this->overrideMwServices(); $title = $this->getMockTitle(); @@ -640,6 +640,7 @@ class RevisionTest extends MediaWikiTestCase { $this->equalTo( [ 'revision', 'page', 'user', 'temp_rev_comment' => 'revision_comment_temp', 'comment_rev_comment' => 'comment', + 'temp_rev_user' => 'revision_actor_temp', 'actor_rev_user' => 'actor', ] ), // We don't really care about the fields are they come from the selectField methods $this->isType( 'array' ), diff --git a/tests/phpunit/includes/api/query/ApiQueryUserContribsTest.php b/tests/phpunit/includes/api/query/ApiQueryUserContribsTest.php index 924a1a5cd2..92c71bd59d 100644 --- a/tests/phpunit/includes/api/query/ApiQueryUserContribsTest.php +++ b/tests/phpunit/includes/api/query/ApiQueryUserContribsTest.php @@ -15,7 +15,8 @@ class ApiQueryUserContribsTest extends ApiTestCase { $wgActorTableSchemaMigrationStage = $v; $this->overrideMwServices(); }, [ $wgActorTableSchemaMigrationStage ] ); - $wgActorTableSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD; + // Needs to WRITE_BOTH so READ_OLD tests below work. READ mode here doesn't really matter. + $wgActorTableSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW; $this->overrideMwServices(); $users = [ diff --git a/tests/phpunit/includes/page/PageArchiveMcrTest.php b/tests/phpunit/includes/page/PageArchiveMcrTest.php index ba4b2e22f8..3ff677e717 100644 --- a/tests/phpunit/includes/page/PageArchiveMcrTest.php +++ b/tests/phpunit/includes/page/PageArchiveMcrTest.php @@ -41,9 +41,9 @@ class PageArchiveMcrTest extends PageArchiveTestBase { return [ [ 'ar_minor_edit' => '0', - 'ar_user' => '0', + 'ar_user' => null, 'ar_user_text' => $this->ipEditor, - 'ar_actor' => null, + 'ar_actor' => (string)User::newFromName( $this->ipEditor, false )->getActorId( $this->db ), 'ar_len' => '11', 'ar_deleted' => '0', 'ar_rev_id' => strval( $this->ipRev->getId() ), @@ -63,7 +63,7 @@ class PageArchiveMcrTest extends PageArchiveTestBase { 'ar_minor_edit' => '0', 'ar_user' => (string)$this->getTestUser()->getUser()->getId(), 'ar_user_text' => $this->getTestUser()->getUser()->getName(), - 'ar_actor' => null, + 'ar_actor' => (string)$this->getTestUser()->getUser()->getActorId(), 'ar_len' => '7', 'ar_deleted' => '0', 'ar_rev_id' => strval( $this->firstRev->getId() ), diff --git a/tests/phpunit/includes/page/PageArchivePreMcrTest.php b/tests/phpunit/includes/page/PageArchivePreMcrTest.php index f8d4ef9bf1..8d7ed61217 100644 --- a/tests/phpunit/includes/page/PageArchivePreMcrTest.php +++ b/tests/phpunit/includes/page/PageArchivePreMcrTest.php @@ -43,9 +43,9 @@ class PageArchivePreMcrTest extends PageArchiveTestBase { return [ [ 'ar_minor_edit' => '0', - 'ar_user' => '0', + 'ar_user' => null, 'ar_user_text' => $this->ipEditor, - 'ar_actor' => null, + 'ar_actor' => (string)User::newFromName( $this->ipEditor, false )->getActorId( $this->db ), 'ar_len' => '11', 'ar_deleted' => '0', 'ar_rev_id' => strval( $this->ipRev->getId() ), @@ -70,7 +70,7 @@ class PageArchivePreMcrTest extends PageArchiveTestBase { 'ar_minor_edit' => '0', 'ar_user' => (string)$this->getTestUser()->getUser()->getId(), 'ar_user_text' => $this->getTestUser()->getUser()->getName(), - 'ar_actor' => null, + 'ar_actor' => (string)$this->getTestUser()->getUser()->getActorId(), 'ar_len' => '7', 'ar_deleted' => '0', 'ar_rev_id' => strval( $this->firstRev->getId() ), diff --git a/tests/phpunit/includes/page/PageArchiveTestBase.php b/tests/phpunit/includes/page/PageArchiveTestBase.php index 06c0456ac7..218d4ce2a4 100644 --- a/tests/phpunit/includes/page/PageArchiveTestBase.php +++ b/tests/phpunit/includes/page/PageArchiveTestBase.php @@ -82,7 +82,7 @@ abstract class PageArchiveTestBase extends MediaWikiTestCase { $this->tablesUsed += $this->getMcrTablesToReset(); - $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_OLD ); + $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_NEW ); $this->setMwGlobals( 'wgContentHandlerUseDB', $this->getContentHandlerUseDB() ); $this->setMwGlobals( 'wgMultiContentRevisionSchemaMigrationStage', diff --git a/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php b/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php index 2ce097b5be..f54594857e 100644 --- a/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php +++ b/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php @@ -197,6 +197,37 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase } public function testRcHidemyselfFilter() { + $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_NEW ); + $this->overrideMwServices(); + + $user = $this->getTestUser()->getUser(); + $user->getActorId( wfGetDB( DB_MASTER ) ); + $this->assertConditions( + [ # expected + "NOT((rc_actor = '{$user->getActorId()}'))", + ], + [ + 'hidemyself' => 1, + ], + "rc conditions: hidemyself=1 (logged in)", + $user + ); + + $user = User::newFromName( '10.11.12.13', false ); + $id = $user->getActorId( wfGetDB( DB_MASTER ) ); + $this->assertConditions( + [ # expected + "NOT((rc_actor = '{$user->getActorId()}'))", + ], + [ + 'hidemyself' => 1, + ], + "rc conditions: hidemyself=1 (anon)", + $user + ); + } + + public function testRcHidemyselfFilter_old() { $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD ); @@ -230,6 +261,37 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase } public function testRcHidebyothersFilter() { + $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_NEW ); + $this->overrideMwServices(); + + $user = $this->getTestUser()->getUser(); + $user->getActorId( wfGetDB( DB_MASTER ) ); + $this->assertConditions( + [ # expected + "(rc_actor = '{$user->getActorId()}')", + ], + [ + 'hidebyothers' => 1, + ], + "rc conditions: hidebyothers=1 (logged in)", + $user + ); + + $user = User::newFromName( '10.11.12.13', false ); + $id = $user->getActorId( wfGetDB( DB_MASTER ) ); + $this->assertConditions( + [ # expected + "(rc_actor = '{$user->getActorId()}')", + ], + [ + 'hidebyothers' => 1, + ], + "rc conditions: hidebyothers=1 (anon)", + $user + ); + } + + public function testRcHidebyothersFilter_old() { $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD ); @@ -464,6 +526,22 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase } public function testFilterUserExpLevelAllExperienceLevels() { + $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_NEW ); + $this->overrideMwServices(); + + $this->assertConditions( + [ + # expected + 'actor_rc_user.actor_user IS NOT NULL', + ], + [ + 'userExpLevel' => 'newcomer;learner;experienced', + ], + "rc conditions: userExpLevel=newcomer;learner;experienced" + ); + } + + public function testFilterUserExpLevelAllExperienceLevels_old() { $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD ); @@ -482,6 +560,22 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase } public function testFilterUserExpLevelRegistrered() { + $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_NEW ); + $this->overrideMwServices(); + + $this->assertConditions( + [ + # expected + 'actor_rc_user.actor_user IS NOT NULL', + ], + [ + 'userExpLevel' => 'registered', + ], + "rc conditions: userExpLevel=registered" + ); + } + + public function testFilterUserExpLevelRegistrered_old() { $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD ); @@ -500,6 +594,22 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase } public function testFilterUserExpLevelUnregistrered() { + $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_NEW ); + $this->overrideMwServices(); + + $this->assertConditions( + [ + # expected + 'actor_rc_user.actor_user IS NULL', + ], + [ + 'userExpLevel' => 'unregistered', + ], + "rc conditions: userExpLevel=unregistered" + ); + } + + public function testFilterUserExpLevelUnregistrered_old() { $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD ); @@ -518,6 +628,22 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase } public function testFilterUserExpLevelRegistreredOrLearner() { + $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_NEW ); + $this->overrideMwServices(); + + $this->assertConditions( + [ + # expected + 'actor_rc_user.actor_user IS NOT NULL', + ], + [ + 'userExpLevel' => 'registered;learner', + ], + "rc conditions: userExpLevel=registered;learner" + ); + } + + public function testFilterUserExpLevelRegistreredOrLearner_old() { $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD ); @@ -536,6 +662,20 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase } public function testFilterUserExpLevelUnregistreredOrExperienced() { + $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_NEW ); + $this->overrideMwServices(); + + $conds = $this->buildQuery( [ 'userExpLevel' => 'unregistered;experienced' ] ); + + $this->assertRegExp( + '/\(actor_rc_user\.actor_user IS NULL\) OR ' + . '\(\(user_editcount >= 500\) AND \(user_registration <= \'[^\']+\'\)\)/', + reset( $conds ), + "rc conditions: userExpLevel=unregistered;experienced" + ); + } + + public function testFilterUserExpLevelUnregistreredOrExperienced_old() { $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD ); diff --git a/tests/phpunit/includes/user/UserTest.php b/tests/phpunit/includes/user/UserTest.php index e7bedc2d73..3a9d2108a8 100644 --- a/tests/phpunit/includes/user/UserTest.php +++ b/tests/phpunit/includes/user/UserTest.php @@ -28,7 +28,7 @@ class UserTest extends MediaWikiTestCase { $this->setMwGlobals( [ 'wgGroupPermissions' => [], 'wgRevokePermissions' => [], - 'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, + 'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_NEW, ] ); $this->overrideMwServices(); @@ -1048,6 +1048,75 @@ class UserTest extends MediaWikiTestCase { $user = User::newFromId( $id ); $this->assertTrue( $user->getActorId() > 0, 'Actor ID can be retrieved for user loaded by ID' ); + $user2 = User::newFromActorId( $user->getActorId() ); + $this->assertEquals( $user->getId(), $user2->getId(), + 'User::newFromActorId works for an existing user' ); + + $row = $this->db->selectRow( 'user', User::selectFields(), [ 'user_id' => $id ], __METHOD__ ); + $user = User::newFromRow( $row ); + $this->assertTrue( $user->getActorId() > 0, + 'Actor ID can be retrieved for user loaded with User::selectFields()' ); + + $user = User::newFromId( $id ); + $user->setName( 'UserTestActorId4-renamed' ); + $user->saveSettings(); + $this->assertEquals( + $user->getName(), + $this->db->selectField( + 'actor', 'actor_name', [ 'actor_id' => $user->getActorId() ], __METHOD__ + ), + 'User::saveSettings updates actor table for name change' + ); + + // For sanity + $ip = '192.168.12.34'; + $this->db->delete( 'actor', [ 'actor_name' => $ip ], __METHOD__ ); + + $user = User::newFromName( $ip, false ); + $this->assertFalse( $user->getActorId() > 0, 'Anonymous user has no actor ID by default' ); + $this->assertTrue( $user->getActorId( $this->db ) > 0, + 'Actor ID can be created for an anonymous user' ); + + $user = User::newFromName( $ip, false ); + $this->assertTrue( $user->getActorId() > 0, 'Actor ID can be loaded for an anonymous user' ); + $user2 = User::newFromActorId( $user->getActorId() ); + $this->assertEquals( $user->getName(), $user2->getName(), + 'User::newFromActorId works for an anonymous user' ); + } + + /** + * Actor tests with SCHEMA_COMPAT_READ_OLD + * + * The only thing different from testActorId() is the behavior if the actor + * row doesn't exist in the DB, since with SCHEMA_COMPAT_READ_NEW that + * situation can't happen. But we copy all the other tests too just for good measure. + * + * @covers User::newFromActorId + */ + public function testActorId_old() { + $this->setMwGlobals( [ + 'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, + ] ); + $this->overrideMwServices(); + + $domain = MediaWikiServices::getInstance()->getDBLoadBalancer()->getLocalDomainID(); + $this->hideDeprecated( 'User::selectFields' ); + + // Newly-created user has an actor ID + $user = User::createNew( 'UserTestActorIdOld1' ); + $id = $user->getId(); + $this->assertTrue( $user->getActorId() > 0, 'User::createNew sets an actor ID' ); + + $user = User::newFromName( 'UserTestActorIdOld2' ); + $user->addToDatabase(); + $this->assertTrue( $user->getActorId() > 0, 'User::addToDatabase sets an actor ID' ); + + $user = User::newFromName( 'UserTestActorIdOld1' ); + $this->assertTrue( $user->getActorId() > 0, 'Actor ID can be retrieved for user loaded by name' ); + + $user = User::newFromId( $id ); + $this->assertTrue( $user->getActorId() > 0, 'Actor ID can be retrieved for user loaded by ID' ); + $user2 = User::newFromActorId( $user->getActorId() ); $this->assertEquals( $user->getId(), $user2->getId(), 'User::newFromActorId works for an existing user' ); @@ -1066,7 +1135,7 @@ class UserTest extends MediaWikiTestCase { $this->assertFalse( $user->getActorId() > 0, 'No Actor ID by default if none in database' ); $this->assertTrue( $user->getActorId( $this->db ) > 0, 'Actor ID can be created if none in db' ); - $user->setName( 'UserTestActorId4-renamed' ); + $user->setName( 'UserTestActorIdOld4-renamed' ); $user->saveSettings(); $this->assertEquals( $user->getName(), -- 2.20.1