16 parent::__construct(
$name, $data, $dataName );
17 $this->tablesUsed = array_unique(
18 array_merge( $this->tablesUsed, [
'watchlist',
'recentchanges',
'page' ] )
26 $this->
doLogin(
'ApiQueryWatchlistIntegrationTestUser' );
30 return self::$users[
'ApiQueryWatchlistIntegrationTestUser']->getUser();
34 return self::$users[
'ApiQueryWatchlistIntegrationTestUser2']->getUser();
103 $rc =
$rev->getRecentChange();
104 $rc->doMarkPatrolled( $patrollingUser,
false, [] );
110 $page->doDeleteArticleReal( $reason );
124 foreach ( $editData
as $singleEditData ) {
125 if ( array_key_exists(
'minorEdit', $singleEditData ) && $singleEditData[
'minorEdit'] ) {
128 $singleEditData[
'target'],
129 $singleEditData[
'content'],
130 $singleEditData[
'summary']
134 if ( array_key_exists(
'botEdit', $singleEditData ) && $singleEditData[
'botEdit'] ) {
137 $singleEditData[
'target'],
138 $singleEditData[
'content'],
139 $singleEditData[
'summary']
145 $singleEditData[
'target'],
146 $singleEditData[
'content'],
147 $singleEditData[
'summary']
153 return MediaWikiServices::getInstance()->getWatchedItemStore();
162 $store->addWatchBatchForUser(
$user, $targets );
168 [
'action' =>
'query',
'list' =>
'watchlist' ],
170 ),
null,
false,
$user
177 [
'action' =>
'query',
'generator' =>
'watchlist' ],
184 return $response[0][
'query'][
'watchlist'];
205 array $expectedItems,
206 array $keysUsedInValueComparison,
207 array $requiredKeys = []
209 $this->assertCount(
count( $expectedItems ), $actualItems );
212 $actualItemsOnlyComparedValues = array_map(
213 function(
array $item )
use ( $keysUsedInValueComparison ) {
214 return array_intersect_key( $item, array_flip( $keysUsedInValueComparison ) );
221 $actualItemsOnlyComparedValues
225 $actualItemsKeysOnly = array_map(
'array_keys', $actualItems );
226 foreach ( $actualItemsKeysOnly
as $keysOfTheItem ) {
227 $this->assertEmpty( array_diff( $requiredKeys, $keysOfTheItem ) );
234 MediaWikiServices::getInstance()->getGenderCache()
240 return $formatter->getPrefixedText( $target );
246 $items = $store->getWatchedItemsForUser(
$user );
247 foreach ( $items
as $item ) {
248 $store->removeWatch(
$user, $item->getLinkTarget() );
258 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
269 $this->assertArrayHasKey(
'query',
$result[0] );
270 $this->assertArrayHasKey(
'watchlist',
$result[0][
'query'] );
277 'ns' => $target->getNamespace(),
284 [
'type',
'ns',
'title',
'bot',
'new',
'minor' ],
285 [
'pageid',
'revid',
'old_revid' ]
291 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
303 $this->assertCount( 1, $items );
304 $this->assertArrayHasKey(
'pageid', $items[0] );
305 $this->assertArrayHasKey(
'revid', $items[0] );
306 $this->assertArrayHasKey(
'old_revid', $items[0] );
307 $this->assertEquals(
'new', $items[0][
'type'] );
312 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
313 $talkTarget =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
318 'target' => $subjectTarget,
319 'content' =>
'Some Content',
320 'summary' =>
'Create the page',
323 'target' => $talkTarget,
324 'content' =>
'Some Talk Page Content',
325 'summary' =>
'Create Talk page',
337 'ns' => $talkTarget->getNamespace(),
342 'ns' => $subjectTarget->getNamespace(),
352 $normalEditTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
353 $minorEditTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPageM' );
354 $botEditTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPageB' );
359 'target' => $normalEditTarget,
360 'content' =>
'Some Content',
361 'summary' =>
'Create the page',
364 'target' => $minorEditTarget,
365 'content' =>
'Some Content',
366 'summary' =>
'Create the page',
369 'target' => $minorEditTarget,
370 'content' =>
'Slightly Better Content',
371 'summary' =>
'Change content',
375 'target' => $botEditTarget,
376 'content' =>
'Some Content',
377 'summary' =>
'Create the page with a bot',
382 $this->
watchPages(
$user, [ $normalEditTarget, $minorEditTarget, $botEditTarget ] );
413 $userEditTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
414 $anonEditTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPageA' );
439 'user' =>
$user->getName(),
448 $userEditTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
449 $anonEditTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPageA' );
475 'user' =>
$user->getId(),
476 'userid' =>
$user->getId(),
485 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
490 'Create the <b>page</b>'
500 'comment' =>
'Create the <b>page</b>',
509 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
514 'Create the <b>page</b>'
524 'parsedcomment' =>
'Create the <b>page</b>',
533 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
545 $this->assertCount( 1, $items );
546 $this->assertArrayHasKey(
'timestamp', $items[0] );
547 $this->assertInternalType(
'string', $items[0][
'timestamp'] );
552 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
577 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
586 $store->updateNotificationTimestamp(
598 'notificationtimestamp' =>
'2015-12-12T01:01:01Z',
606 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
612 'Create the page (this gets patrolled)',
620 $testUser = static::getTestSysop();
621 $user = $testUser->getUser();
631 'unpatrolled' =>
false,
643 'Create the page that will be deleted'
645 $this->
deletePage( $target,
'Important Reason' );
649 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
661 'logtype' =>
'delete',
662 'logaction' =>
'delete',
666 [
'type',
'logtype',
'logaction',
'logparams' ],
673 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
696 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
697 $talkTarget =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
702 'target' => $subjectTarget,
703 'content' =>
'Some Content',
704 'summary' =>
'Create the page',
707 'target' => $talkTarget,
708 'content' =>
'Some Content',
709 'summary' =>
'Create the talk page',
732 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
733 $talkTarget =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
743 'What is this page about?',
744 'Create the talk page'
749 'wlprop' =>
'user|title',
750 'wluser' => $otherUser->getName(),
757 'ns' => $talkTarget->getNamespace(),
759 'user' => $otherUser->getName(),
769 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
770 $talkTarget =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
780 'What is this page about?',
781 'Create the talk page'
786 'wlprop' =>
'user|title',
787 'wlexcludeuser' => $otherUser->getName(),
794 'ns' => $subjectTarget->getNamespace(),
796 'user' =>
$user->getName(),
805 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
811 'content' =>
'Some Content',
812 'summary' =>
'Create the page',
816 'content' =>
'Slightly Better Content',
817 'summary' =>
'Change content',
844 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
872 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
902 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
903 $talkTarget =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
914 'Create the talk page'
917 $store->addWatchBatchForUser(
$user, [ $subjectTarget, $talkTarget ] );
918 $store->updateNotificationTimestamp(
925 'wlprop' =>
'notificationtimestamp|title',
929 'wlprop' =>
'notificationtimestamp|title',
937 'notificationtimestamp' =>
'2015-12-12T01:01:01Z',
938 'ns' => $talkTarget->getNamespace(),
948 'notificationtimestamp' =>
'',
949 'ns' => $subjectTarget->getNamespace(),
958 $user = static::getTestSysop()->getUser();
962 'wlprop' =>
'patrol',
966 'wlprop' =>
'patrol',
975 'unpatrolled' =>
false,
985 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
986 $talkTarget =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
991 'target' => $subjectTarget,
992 'content' =>
'Some Content',
993 'summary' =>
'Create the page',
996 'target' => $subjectTarget,
997 'content' =>
'Some Other Content',
998 'summary' =>
'Change the content',
1001 'target' => $talkTarget,
1002 'content' =>
'Some Talk Page Content',
1003 'summary' =>
'Create Talk page',
1012 $this->assertEquals(
1016 'ns' => $talkTarget->getNamespace(),
1022 $this->assertEquals(
1026 'ns' => $subjectTarget->getNamespace(),
1036 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1037 $talkTarget =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
1042 'Some Talk Page Content',
1049 $this->assertEquals(
1053 'ns' => $subjectTarget->getNamespace(),
1068 'rc_namespace' =>
$title->getNamespace(),
1069 'rc_title' =>
$title->getDBkey(),
1071 'rc_source' =>
'foo',
1073 'rc_cur_id' =>
$title->getArticleID(),
1075 'rc_user_text' =>
'External User',
1077 'rc_this_oldid' =>
$title->getLatestRevID(),
1078 'rc_last_oldid' =>
$title->getLatestRevID(),
1081 'rc_patrolled' => 0,
1083 'rc_old_len' =>
$title->getLength(),
1084 'rc_new_len' =>
$title->getLength(),
1087 'rc_log_type' =>
null,
1088 'rc_log_action' =>
'',
1092 'prefixedDBkey' =>
$title->getPrefixedDBkey(),
1093 'lastTimestamp' => 0,
1094 'oldSize' =>
$title->getLength(),
1095 'newSize' =>
$title->getLength(),
1096 'pageStatus' =>
'changed'
1104 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1105 $talkTarget =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
1115 'Some Talk Page Content',
1126 $this->assertEquals(
1129 'type' =>
'external',
1130 'ns' => $subjectTarget->getNamespace(),
1140 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1146 'target' => $categoryTarget,
1147 'content' =>
'Some Content',
1148 'summary' =>
'Create the category',
1151 'target' => $subjectTarget,
1152 'content' =>
'Some Content [[Category:ApiQueryWatchlistIntegrationTestCategory]]t',
1153 'summary' =>
'Create the page and add it to the category',
1161 $revision->getTimestamp(),
1164 $revision->getComment(),
1177 $this->assertEquals(
1180 'type' =>
'categorize',
1181 'ns' => $categoryTarget->getNamespace(),
1191 $target1 =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1192 $target2 =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
1193 $target3 =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage2' );
1198 'target' => $target1,
1199 'content' =>
'Some Content',
1200 'summary' =>
'Create the page',
1203 'target' => $target2,
1204 'content' =>
'Some Talk Page Content',
1205 'summary' =>
'Create Talk page',
1208 'target' => $target3,
1209 'content' =>
'Some Other Content',
1210 'summary' =>
'Create the page',
1219 $this->assertEquals(
1223 'ns' => $target3->getNamespace(),
1228 'ns' => $target2->getNamespace(),
1233 'ns' => $target1->getNamespace(),
1239 $this->assertEquals(
1243 'ns' => $target3->getNamespace(),
1248 'ns' => $target2->getNamespace(),
1254 $this->assertArrayHasKey(
'continue', $resultWithLimit[0] );
1255 $this->assertArrayHasKey(
'wlcontinue', $resultWithLimit[0][
'continue'] );
1260 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1265 'target' => $target,
1266 'content' =>
'Some Content',
1267 'summary' =>
'Create the page',
1270 'target' => $target,
1271 'content' =>
'Some Other Content',
1272 'summary' =>
'Change the content',
1281 $this->assertEquals(
1285 'ns' => $target->getNamespace(),
1291 $this->assertEquals(
1295 'ns' => $target->getNamespace(),
1300 'ns' => $target->getNamespace(),
1310 $subjectTarget =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1311 $talkTarget =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
1316 'target' => $subjectTarget,
1317 'content' =>
'Some Content',
1318 'summary' =>
'Create the page',
1321 'target' => $talkTarget,
1322 'content' =>
'Some Talk Page Content',
1323 'summary' =>
'Create Talk page',
1332 $this->assertEquals(
1336 'ns' => $talkTarget->getNamespace(),
1341 'ns' => $subjectTarget->getNamespace(),
1347 $this->assertEquals(
1351 'ns' => $subjectTarget->getNamespace(),
1356 'ns' => $talkTarget->getNamespace(),
1366 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1376 'wlstart' =>
'20010115000000',
1378 'wlprop' =>
'title',
1381 'wlend' =>
'20010115000000',
1383 'wlprop' =>
'title',
1386 $this->assertEquals(
1390 'ns' => $target->getNamespace(),
1401 $target1 =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1402 $target2 =
new TitleValue( 1,
'ApiQueryWatchlistIntegrationTestPage' );
1403 $target3 =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage2' );
1408 'target' => $target1,
1409 'content' =>
'Some Content',
1410 'summary' =>
'Create the page',
1413 'target' => $target2,
1414 'content' =>
'Some Talk Page Content',
1415 'summary' =>
'Create Talk page',
1418 'target' => $target3,
1419 'content' =>
'Some Other Content',
1420 'summary' =>
'Create the page',
1427 $this->assertArrayHasKey(
'continue', $firstResult[0] );
1428 $this->assertArrayHasKey(
'wlcontinue', $firstResult[0][
'continue'] );
1430 $continuationParam = $firstResult[0][
'continue'][
'wlcontinue'];
1433 [
'wlcontinue' => $continuationParam,
'wlprop' =>
'title' ]
1436 $this->assertEquals(
1440 'ns' => $target3->getNamespace(),
1445 'ns' => $target2->getNamespace(),
1451 $this->assertEquals(
1455 'ns' => $target1->getNamespace(),
1464 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1473 $otherUser->setOption(
'watchlisttoken',
'1234567890' );
1474 $otherUser->saveSettings();
1476 $this->
watchPages( $otherUser, [ $target ] );
1479 'wlowner' => $otherUser->getName(),
1480 'wltoken' =>
'1234567890',
1481 'wlprop' =>
'title',
1484 $this->assertEquals(
1488 'ns' => $target->getNamespace(),
1498 $otherUser->setOption(
'watchlisttoken',
'1234567890' );
1499 $otherUser->saveSettings();
1504 'wlowner' => $otherUser->getName(),
1505 'wltoken' =>
'wrong-token',
1514 'wltoken' =>
'some-token',
1520 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1531 $this->assertArrayHasKey(
'query',
$result[0] );
1532 $this->assertArrayHasKey(
'pages',
$result[0][
'query'] );
1535 $pages = array_values(
$result[0][
'query'][
'pages'] );
1541 'ns' => $target->getNamespace(),
1546 [
'ns',
'title',
'new' ]
1552 $target =
new TitleValue( 0,
'ApiQueryWatchlistIntegrationTestPage' );
1557 'target' => $target,
1558 'content' =>
'Some Content',
1559 'summary' =>
'Create the page',
1562 'target' => $target,
1563 'content' =>
'Some Other Content',
1564 'summary' =>
'Change the content',
1572 $this->assertArrayHasKey(
'query',
$result[0] );
1573 $this->assertArrayHasKey(
'pages',
$result[0][
'query'] );
1576 $pages = array_values(
$result[0][
'query'][
'pages'] );
1578 $this->assertCount( 1, $pages );
1579 $this->assertEquals( 0, $pages[0][
'ns'] );
1580 $this->assertEquals( $this->
getPrefixedText( $target ), $pages[0][
'title'] );
1582 $pages[0][
'revisions'],
1585 'comment' =>
'Create the page',
1586 'user' =>
$user->getName(),
1590 'comment' =>
'Change the content',
1591 'user' =>
$user->getName(),
1595 [
'comment',
'user',
'minor' ]