Merge "Add checkDependencies.php"
[lhc/web/wiklou.git] / tests / phpunit / includes / user / UserGroupMembershipTest.php
1 <?php
2
3 /**
4 * @group Database
5 */
6 class UserGroupMembershipTest extends MediaWikiTestCase {
7
8 protected $tablesUsed = [ 'user', 'user_groups' ];
9
10 /**
11 * @var User Belongs to no groups
12 */
13 protected $userNoGroups;
14 /**
15 * @var User Belongs to the 'unittesters' group indefinitely, and the
16 * 'testwriters' group with expiry
17 */
18 protected $userTester;
19 /**
20 * @var string The timestamp, in TS_MW format, of the expiry of $userTester's
21 * membership in the 'testwriters' group
22 */
23 protected $expiryTime;
24
25 protected function setUp() {
26 parent::setUp();
27
28 $this->setMwGlobals( [
29 'wgGroupPermissions' => [
30 'unittesters' => [
31 'runtest' => true,
32 ],
33 'testwriters' => [
34 'writetest' => true,
35 ]
36 ]
37 ] );
38
39 $this->userNoGroups = new User;
40 $this->userNoGroups->setName( 'NoGroups' );
41 $this->userNoGroups->addToDatabase();
42
43 $this->userTester = new User;
44 $this->userTester->setName( 'Tester' );
45 $this->userTester->addToDatabase();
46 $this->userTester->addGroup( 'unittesters' );
47 $this->expiryTime = wfTimestamp( TS_MW, time() + 100500 );
48 $this->userTester->addGroup( 'testwriters', $this->expiryTime );
49
50 $this->overrideMwServices();
51 }
52
53 /**
54 * @covers UserGroupMembership::insert
55 * @covers UserGroupMembership::delete
56 */
57 public function testAddAndRemoveGroups() {
58 $user = $this->getMutableTestUser()->getUser();
59
60 // basic tests
61 $ugm = new UserGroupMembership( $user->getId(), 'unittesters' );
62 $this->assertTrue( $ugm->insert() );
63 $user->clearInstanceCache();
64 $this->assertContains( 'unittesters', $user->getGroups() );
65 $this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
66 $this->assertTrue( $user->isAllowed( 'runtest' ) );
67
68 // try updating without allowUpdate. Should fail
69 $ugm = new UserGroupMembership( $user->getId(), 'unittesters', $this->expiryTime );
70 $this->assertFalse( $ugm->insert() );
71
72 // now try updating with allowUpdate
73 $this->assertTrue( $ugm->insert( 2 ) );
74 $user->clearInstanceCache();
75 $this->assertContains( 'unittesters', $user->getGroups() );
76 $this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
77 $this->assertTrue( $user->isAllowed( 'runtest' ) );
78
79 // try removing the group
80 $ugm->delete();
81 $user->clearInstanceCache();
82 $this->assertThat( $user->getGroups(),
83 $this->logicalNot( $this->contains( 'unittesters' ) ) );
84 $this->assertThat( $user->getGroupMemberships(),
85 $this->logicalNot( $this->arrayHasKey( 'unittesters' ) ) );
86 $this->assertFalse( $user->isAllowed( 'runtest' ) );
87
88 // check that the user group is now in user_former_groups
89 $this->assertContains( 'unittesters', $user->getFormerGroups() );
90 }
91
92 private function addUserTesterToExpiredGroup() {
93 // put $userTester in a group with expiry in the past
94 $ugm = new UserGroupMembership( $this->userTester->getId(), 'sysop', '20010102030405' );
95 $ugm->insert();
96 }
97
98 /**
99 * @covers UserGroupMembership::getMembershipsForUser
100 */
101 public function testGetMembershipsForUser() {
102 $this->addUserTesterToExpiredGroup();
103
104 // check that the user in no groups has no group memberships
105 $ugms = UserGroupMembership::getMembershipsForUser( $this->userNoGroups->getId() );
106 $this->assertEmpty( $ugms );
107
108 // check that the user in 2 groups has 2 group memberships
109 $testerUserId = $this->userTester->getId();
110 $ugms = UserGroupMembership::getMembershipsForUser( $testerUserId );
111 $this->assertCount( 2, $ugms );
112
113 // check that the required group memberships are present on $userTester,
114 // with the correct user IDs and expiries
115 $expectedGroups = [ 'unittesters', 'testwriters' ];
116
117 foreach ( $expectedGroups as $group ) {
118 $this->assertArrayHasKey( $group, $ugms );
119 $this->assertEquals( $ugms[$group]->getUserId(), $testerUserId );
120 $this->assertEquals( $ugms[$group]->getGroup(), $group );
121
122 if ( $group === 'unittesters' ) {
123 $this->assertNull( $ugms[$group]->getExpiry() );
124 } elseif ( $group === 'testwriters' ) {
125 $this->assertEquals( $ugms[$group]->getExpiry(), $this->expiryTime );
126 }
127 }
128 }
129
130 /**
131 * @covers UserGroupMembership::getMembership
132 */
133 public function testGetMembership() {
134 $this->addUserTesterToExpiredGroup();
135
136 // groups that the user doesn't belong to shouldn't be returned
137 $ugm = UserGroupMembership::getMembership( $this->userNoGroups->getId(), 'sysop' );
138 $this->assertFalse( $ugm );
139
140 // implicit groups shouldn't be returned
141 $ugm = UserGroupMembership::getMembership( $this->userNoGroups->getId(), 'user' );
142 $this->assertFalse( $ugm );
143
144 // expired groups shouldn't be returned
145 $ugm = UserGroupMembership::getMembership( $this->userTester->getId(), 'sysop' );
146 $this->assertFalse( $ugm );
147
148 // groups that the user does belong to should be returned with correct properties
149 $ugm = UserGroupMembership::getMembership( $this->userTester->getId(), 'unittesters' );
150 $this->assertInstanceOf( UserGroupMembership::class, $ugm );
151 $this->assertEquals( $ugm->getUserId(), $this->userTester->getId() );
152 $this->assertEquals( $ugm->getGroup(), 'unittesters' );
153 $this->assertNull( $ugm->getExpiry() );
154 }
155 }