Merge "Make addIdentifierQuotes part of IDatabase"
[lhc/web/wiklou.git] / tests / phpunit / includes / watcheditem / WatchedItemStoreIntegrationTest.php
1 <?php
2
3 use MediaWiki\MediaWikiServices;
4
5 /**
6 * @author Addshore
7 *
8 * @group Database
9 *
10 * @covers WatchedItemStore
11 */
12 class WatchedItemStoreIntegrationTest extends MediaWikiTestCase {
13
14 public function setUp() {
15 parent::setUp();
16 self::$users['WatchedItemStoreIntegrationTestUser']
17 = new TestUser( 'WatchedItemStoreIntegrationTestUser' );
18 }
19
20 private function getUser() {
21 return self::$users['WatchedItemStoreIntegrationTestUser']->getUser();
22 }
23
24 public function testWatchAndUnWatchItem() {
25 $user = $this->getUser();
26 $title = Title::newFromText( 'WatchedItemStoreIntegrationTestPage' );
27 $store = MediaWikiServices::getInstance()->getWatchedItemStore();
28 // Cleanup after previous tests
29 $store->removeWatch( $user, $title );
30 $initialWatchers = $store->countWatchers( $title );
31 $initialUserWatchedItems = $store->countWatchedItems( $user );
32
33 $this->assertFalse(
34 $store->isWatched( $user, $title ),
35 'Page should not initially be watched'
36 );
37
38 $store->addWatch( $user, $title );
39 $this->assertTrue(
40 $store->isWatched( $user, $title ),
41 'Page should be watched'
42 );
43 $this->assertEquals( $initialUserWatchedItems + 1, $store->countWatchedItems( $user ) );
44 $watchedItemsForUser = $store->getWatchedItemsForUser( $user );
45 $this->assertCount( $initialUserWatchedItems + 1, $watchedItemsForUser );
46 $watchedItemsForUserHasExpectedItem = false;
47 foreach ( $watchedItemsForUser as $watchedItem ) {
48 if (
49 $watchedItem->getUser()->equals( $user ) &&
50 $watchedItem->getLinkTarget() == $title->getTitleValue()
51 ) {
52 $watchedItemsForUserHasExpectedItem = true;
53 }
54 }
55 $this->assertTrue(
56 $watchedItemsForUserHasExpectedItem,
57 'getWatchedItemsForUser should contain the page'
58 );
59 $this->assertEquals( $initialWatchers + 1, $store->countWatchers( $title ) );
60 $this->assertEquals(
61 $initialWatchers + 1,
62 $store->countWatchersMultiple( [ $title ] )[$title->getNamespace()][$title->getDBkey()]
63 );
64 $this->assertEquals(
65 [ 0 => [ 'WatchedItemStoreIntegrationTestPage' => $initialWatchers + 1 ] ],
66 $store->countWatchersMultiple( [ $title ], [ 'minimumWatchers' => $initialWatchers + 1 ] )
67 );
68 $this->assertEquals(
69 [ 0 => [ 'WatchedItemStoreIntegrationTestPage' => 0 ] ],
70 $store->countWatchersMultiple( [ $title ], [ 'minimumWatchers' => $initialWatchers + 2 ] )
71 );
72 $this->assertEquals(
73 [ $title->getNamespace() => [ $title->getDBkey() => null ] ],
74 $store->getNotificationTimestampsBatch( $user, [ $title ] )
75 );
76
77 $store->removeWatch( $user, $title );
78 $this->assertFalse(
79 $store->isWatched( $user, $title ),
80 'Page should be unwatched'
81 );
82 $this->assertEquals( $initialUserWatchedItems, $store->countWatchedItems( $user ) );
83 $watchedItemsForUser = $store->getWatchedItemsForUser( $user );
84 $this->assertCount( $initialUserWatchedItems, $watchedItemsForUser );
85 $watchedItemsForUserHasExpectedItem = false;
86 foreach ( $watchedItemsForUser as $watchedItem ) {
87 if (
88 $watchedItem->getUser()->equals( $user ) &&
89 $watchedItem->getLinkTarget() == $title->getTitleValue()
90 ) {
91 $watchedItemsForUserHasExpectedItem = true;
92 }
93 }
94 $this->assertFalse(
95 $watchedItemsForUserHasExpectedItem,
96 'getWatchedItemsForUser should not contain the page'
97 );
98 $this->assertEquals( $initialWatchers, $store->countWatchers( $title ) );
99 $this->assertEquals(
100 $initialWatchers,
101 $store->countWatchersMultiple( [ $title ] )[$title->getNamespace()][$title->getDBkey()]
102 );
103 $this->assertEquals(
104 [ $title->getNamespace() => [ $title->getDBkey() => false ] ],
105 $store->getNotificationTimestampsBatch( $user, [ $title ] )
106 );
107 }
108
109 public function testWatchBatchAndClearItems() {
110 $user = $this->getUser();
111 $title1 = Title::newFromText( 'WatchedItemStoreIntegrationTestPage1' );
112 $title2 = Title::newFromText( 'WatchedItemStoreIntegrationTestPage2' );
113 $store = MediaWikiServices::getInstance()->getWatchedItemStore();
114
115 $store->addWatchBatchForUser( $user, [ $title1, $title2 ] );
116
117 $this->assertTrue( $store->isWatched( $user, $title1 ) );
118 $this->assertTrue( $store->isWatched( $user, $title2 ) );
119
120 $store->clearUserWatchedItems( $user );
121
122 $this->assertFalse( $store->isWatched( $user, $title1 ) );
123 $this->assertFalse( $store->isWatched( $user, $title2 ) );
124 }
125
126 public function testUpdateResetAndSetNotificationTimestamp() {
127 $user = $this->getUser();
128 $otherUser = ( new TestUser( 'WatchedItemStoreIntegrationTestUser_otherUser' ) )->getUser();
129 $title = Title::newFromText( 'WatchedItemStoreIntegrationTestPage' );
130 $store = MediaWikiServices::getInstance()->getWatchedItemStore();
131 $store->addWatch( $user, $title );
132 $this->assertNull( $store->loadWatchedItem( $user, $title )->getNotificationTimestamp() );
133 $initialVisitingWatchers = $store->countVisitingWatchers( $title, '20150202020202' );
134 $initialUnreadNotifications = $store->countUnreadNotifications( $user );
135
136 $store->updateNotificationTimestamp( $otherUser, $title, '20150202010101' );
137 $this->assertEquals(
138 '20150202010101',
139 $store->loadWatchedItem( $user, $title )->getNotificationTimestamp()
140 );
141 $this->assertEquals(
142 [ $title->getNamespace() => [ $title->getDBkey() => '20150202010101' ] ],
143 $store->getNotificationTimestampsBatch( $user, [ $title ] )
144 );
145 $this->assertEquals(
146 $initialVisitingWatchers - 1,
147 $store->countVisitingWatchers( $title, '20150202020202' )
148 );
149 $this->assertEquals(
150 $initialVisitingWatchers - 1,
151 $store->countVisitingWatchersMultiple(
152 [ [ $title, '20150202020202' ] ]
153 )[$title->getNamespace()][$title->getDBkey()]
154 );
155 $this->assertEquals(
156 $initialUnreadNotifications + 1,
157 $store->countUnreadNotifications( $user )
158 );
159 $this->assertSame(
160 true,
161 $store->countUnreadNotifications( $user, $initialUnreadNotifications + 1 )
162 );
163
164 $this->assertTrue( $store->resetNotificationTimestamp( $user, $title ) );
165 $this->assertNull( $store->getWatchedItem( $user, $title )->getNotificationTimestamp() );
166 $this->assertEquals(
167 [ $title->getNamespace() => [ $title->getDBkey() => null ] ],
168 $store->getNotificationTimestampsBatch( $user, [ $title ] )
169 );
170
171 // Run the job queue
172 JobQueueGroup::destroySingletons();
173 $jobs = new RunJobs;
174 $jobs->loadParamsAndArgs( null, [ 'quiet' => true ], null );
175 $jobs->execute();
176
177 $this->assertEquals(
178 $initialVisitingWatchers,
179 $store->countVisitingWatchers( $title, '20150202020202' )
180 );
181 $this->assertEquals(
182 $initialVisitingWatchers,
183 $store->countVisitingWatchersMultiple(
184 [ [ $title, '20150202020202' ] ]
185 )[$title->getNamespace()][$title->getDBkey()]
186 );
187 $this->assertEquals(
188 [ 0 => [ 'WatchedItemStoreIntegrationTestPage' => $initialVisitingWatchers ] ],
189 $store->countVisitingWatchersMultiple(
190 [ [ $title, '20150202020202' ] ], $initialVisitingWatchers
191 )
192 );
193 $this->assertEquals(
194 [ 0 => [ 'WatchedItemStoreIntegrationTestPage' => 0 ] ],
195 $store->countVisitingWatchersMultiple(
196 [ [ $title, '20150202020202' ] ], $initialVisitingWatchers + 1
197 )
198 );
199
200 // setNotificationTimestampsForUser specifying a title
201 $this->assertTrue(
202 $store->setNotificationTimestampsForUser( $user, '20200202020202', [ $title ] )
203 );
204 $this->assertEquals(
205 '20200202020202',
206 $store->getWatchedItem( $user, $title )->getNotificationTimestamp()
207 );
208
209 // setNotificationTimestampsForUser not specifying a title
210 $this->assertTrue(
211 $store->setNotificationTimestampsForUser( $user, '20210202020202' )
212 );
213 $this->assertEquals(
214 '20210202020202',
215 $store->getWatchedItem( $user, $title )->getNotificationTimestamp()
216 );
217 }
218
219 public function testDuplicateAllAssociatedEntries() {
220 $user = $this->getUser();
221 $titleOld = Title::newFromText( 'WatchedItemStoreIntegrationTestPageOld' );
222 $titleNew = Title::newFromText( 'WatchedItemStoreIntegrationTestPageNew' );
223 $store = MediaWikiServices::getInstance()->getWatchedItemStore();
224 $store->addWatch( $user, $titleOld->getSubjectPage() );
225 $store->addWatch( $user, $titleOld->getTalkPage() );
226 // Cleanup after previous tests
227 $store->removeWatch( $user, $titleNew->getSubjectPage() );
228 $store->removeWatch( $user, $titleNew->getTalkPage() );
229
230 $store->duplicateAllAssociatedEntries( $titleOld, $titleNew );
231
232 $this->assertTrue( $store->isWatched( $user, $titleOld->getSubjectPage() ) );
233 $this->assertTrue( $store->isWatched( $user, $titleOld->getTalkPage() ) );
234 $this->assertTrue( $store->isWatched( $user, $titleNew->getSubjectPage() ) );
235 $this->assertTrue( $store->isWatched( $user, $titleNew->getTalkPage() ) );
236 }
237
238 }