3 use MediaWiki\Linker\LinkTarget
;
4 use MediaWiki\MediaWikiServices
;
11 * @covers ApiQueryRecentChanges
13 class ApiQueryRecentChangesIntegrationTest
extends ApiTestCase
{
15 public function __construct( $name = null, array $data = [], $dataName = '' ) {
16 parent
::__construct( $name, $data, $dataName );
18 $this->tablesUsed
[] = 'recentchanges';
19 $this->tablesUsed
[] = 'page';
22 protected function setUp() {
25 self
::$users['ApiQueryRecentChangesIntegrationTestUser'] = $this->getMutableTestUser();
26 wfGetDB( DB_MASTER
)->delete( 'recentchanges', '*', __METHOD__
);
29 private function getLoggedInTestUser() {
30 return self
::$users['ApiQueryRecentChangesIntegrationTestUser']->getUser();
33 private function doPageEdit( User
$user, LinkTarget
$target, $summary ) {
36 $title = Title
::newFromLinkTarget( $target );
37 $page = WikiPage
::factory( $title );
39 ContentHandler
::makeContent( __CLASS__
. $i++
, $title ),
47 private function doMinorPageEdit( User
$user, LinkTarget
$target, $summary ) {
48 $title = Title
::newFromLinkTarget( $target );
49 $page = WikiPage
::factory( $title );
51 ContentHandler
::makeContent( __CLASS__
, $title ),
59 private function doBotPageEdit( User
$user, LinkTarget
$target, $summary ) {
60 $title = Title
::newFromLinkTarget( $target );
61 $page = WikiPage
::factory( $title );
63 ContentHandler
::makeContent( __CLASS__
, $title ),
71 private function doAnonPageEdit( LinkTarget
$target, $summary ) {
72 $title = Title
::newFromLinkTarget( $target );
73 $page = WikiPage
::factory( $title );
75 ContentHandler
::makeContent( __CLASS__
, $title ),
83 private function deletePage( LinkTarget
$target, $reason ) {
84 $title = Title
::newFromLinkTarget( $target );
85 $page = WikiPage
::factory( $title );
86 $page->doDeleteArticleReal( $reason );
90 * Performs a batch of page edits as a specified user
92 * @param array $editData associative array, keys:
93 * - target => LinkTarget page to edit
94 * - summary => string edit summary
95 * - minorEdit => bool mark as minor edit if true (defaults to false)
96 * - botEdit => bool mark as bot edit if true (defaults to false)
98 private function doPageEdits( User
$user, array $editData ) {
99 foreach ( $editData as $singleEditData ) {
100 if ( array_key_exists( 'minorEdit', $singleEditData ) && $singleEditData['minorEdit'] ) {
101 $this->doMinorPageEdit(
103 $singleEditData['target'],
104 $singleEditData['summary']
108 if ( array_key_exists( 'botEdit', $singleEditData ) && $singleEditData['botEdit'] ) {
109 $this->doBotPageEdit(
111 $singleEditData['target'],
112 $singleEditData['summary']
118 $singleEditData['target'],
119 $singleEditData['summary']
124 private function doListRecentChangesRequest( array $params = [] ) {
125 return $this->doApiRequest(
127 [ 'action' => 'query', 'list' => 'recentchanges' ],
132 $this->getLoggedInTestUser()
136 private function doGeneratorRecentChangesRequest( array $params = [] ) {
137 return $this->doApiRequest(
139 [ 'action' => 'query', 'generator' => 'recentchanges' ],
144 $this->getLoggedInTestUser()
148 private function getItemsFromApiResponse( array $response ) {
149 return $response[0]['query']['recentchanges'];
152 private function getPrefixedText( LinkTarget
$target ) {
153 return MediaWikiServices
::getInstance()->getTitleFormatter()->getPrefixedText( $target );
156 public function testListRecentChanges_returnsRCInfo() {
157 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
158 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
160 $result = $this->doListRecentChangesRequest();
162 $this->assertArrayHasKey( 'query', $result[0] );
163 $this->assertArrayHasKey( 'recentchanges', $result[0]['query'] );
165 $items = $this->getItemsFromApiResponse( $result );
166 $this->assertCount( 1, $items );
168 $this->assertArraySubset(
171 'ns' => $target->getNamespace(),
172 'title' => $this->getPrefixedText( $target ),
176 $this->assertArrayNotHasKey( 'bot', $item );
177 $this->assertArrayNotHasKey( 'new', $item );
178 $this->assertArrayNotHasKey( 'minor', $item );
179 $this->assertArrayHasKey( 'pageid', $item );
180 $this->assertArrayHasKey( 'revid', $item );
181 $this->assertArrayHasKey( 'old_revid', $item );
184 public function testIdsPropParameter() {
185 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
186 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
188 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'ids', ] );
189 $items = $this->getItemsFromApiResponse( $result );
191 $this->assertCount( 1, $items );
192 $this->assertArrayHasKey( 'pageid', $items[0] );
193 $this->assertArrayHasKey( 'revid', $items[0] );
194 $this->assertArrayHasKey( 'old_revid', $items[0] );
195 $this->assertEquals( 'new', $items[0]['type'] );
198 public function testTitlePropParameter() {
199 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
200 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
202 $this->getLoggedInTestUser(),
205 'target' => $subjectTarget,
206 'summary' => 'Create the page',
209 'target' => $talkTarget,
210 'summary' => 'Create Talk page',
215 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', ] );
221 'ns' => $talkTarget->getNamespace(),
222 'title' => $this->getPrefixedText( $talkTarget ),
226 'ns' => $subjectTarget->getNamespace(),
227 'title' => $this->getPrefixedText( $subjectTarget ),
230 $this->getItemsFromApiResponse( $result )
234 public function testFlagsPropParameter() {
235 $normalEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
236 $minorEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageM' );
237 $botEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageB' );
239 $this->getLoggedInTestUser(),
242 'target' => $normalEditTarget,
243 'summary' => 'Create the page',
246 'target' => $minorEditTarget,
247 'summary' => 'Create the page',
250 'target' => $minorEditTarget,
251 'summary' => 'Change content',
255 'target' => $botEditTarget,
256 'summary' => 'Create the page with a bot',
262 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'flags', ] );
291 $this->getItemsFromApiResponse( $result )
295 public function testUserPropParameter() {
296 $userEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
297 $anonEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageA' );
298 $this->doPageEdit( $this->getLoggedInTestUser(), $userEditTarget, 'Create the page' );
299 $this->doAnonPageEdit( $anonEditTarget, 'Create the page' );
301 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'user', ] );
308 'user' => User
::newFromId( 0 )->getName(),
312 'user' => $this->getLoggedInTestUser()->getName(),
315 $this->getItemsFromApiResponse( $result )
319 public function testUserIdPropParameter() {
320 $user = $this->getLoggedInTestUser();
321 $userEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
322 $anonEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageA' );
323 $this->doPageEdit( $user, $userEditTarget, 'Create the page' );
324 $this->doAnonPageEdit( $anonEditTarget, 'Create the page' );
326 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'userid', ] );
337 'userid' => $user->getId(),
340 $this->getItemsFromApiResponse( $result )
344 public function testCommentPropParameter() {
345 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
346 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
348 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'comment', ] );
354 'comment' => 'Create the <b>page</b>',
357 $this->getItemsFromApiResponse( $result )
361 public function testParsedCommentPropParameter() {
362 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
363 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
365 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'parsedcomment', ] );
371 'parsedcomment' => 'Create the <b>page</b>',
374 $this->getItemsFromApiResponse( $result )
378 public function testTimestampPropParameter() {
379 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
380 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
382 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'timestamp', ] );
383 $items = $this->getItemsFromApiResponse( $result );
385 $this->assertCount( 1, $items );
386 $this->assertArrayHasKey( 'timestamp', $items[0] );
387 $this->assertInternalType( 'string', $items[0]['timestamp'] );
390 public function testSizesPropParameter() {
391 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
392 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
394 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'sizes', ] );
404 $this->getItemsFromApiResponse( $result )
408 private function createPageAndDeleteIt( LinkTarget
$target ) {
409 $this->doPageEdit( $this->getLoggedInTestUser(),
411 'Create the page that will be deleted'
413 $this->deletePage( $target, 'Important Reason' );
416 public function testLoginfoPropParameter() {
417 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
418 $this->createPageAndDeleteIt( $target );
420 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'loginfo', ] );
422 $items = $this->getItemsFromApiResponse( $result );
423 $this->assertCount( 1, $items );
424 $this->assertArraySubset(
427 'logtype' => 'delete',
428 'logaction' => 'delete',
433 $this->assertArrayHasKey( 'logid', $items[0] );
436 public function testEmptyPropParameter() {
437 $user = $this->getLoggedInTestUser();
438 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
439 $this->doPageEdit( $user, $target, 'Create the page' );
441 $result = $this->doListRecentChangesRequest( [ 'rcprop' => '', ] );
449 $this->getItemsFromApiResponse( $result )
453 public function testNamespaceParam() {
454 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
455 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
457 $this->getLoggedInTestUser(),
460 'target' => $subjectTarget,
461 'summary' => 'Create the page',
464 'target' => $talkTarget,
465 'summary' => 'Create the talk page',
470 $result = $this->doListRecentChangesRequest( [ 'rcnamespace' => '0', ] );
472 $items = $this->getItemsFromApiResponse( $result );
473 $this->assertCount( 1, $items );
474 $this->assertArraySubset(
477 'title' => $this->getPrefixedText( $subjectTarget ),
483 public function testShowAnonParams() {
484 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
485 $this->doAnonPageEdit( $target, 'Create the page' );
487 $resultAnon = $this->doListRecentChangesRequest( [
489 'rcshow' => WatchedItemQueryService
::FILTER_ANON
491 $resultNotAnon = $this->doListRecentChangesRequest( [
493 'rcshow' => WatchedItemQueryService
::FILTER_NOT_ANON
496 $items = $this->getItemsFromApiResponse( $resultAnon );
497 $this->assertCount( 1, $items );
498 $this->assertArraySubset( [ 'anon' => true ], $items[0] );
499 $this->assertEmpty( $this->getItemsFromApiResponse( $resultNotAnon ) );
502 public function testNewAndEditTypeParameters() {
503 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
504 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
506 $this->getLoggedInTestUser(),
509 'target' => $subjectTarget,
510 'summary' => 'Create the page',
513 'target' => $subjectTarget,
514 'summary' => 'Change the content',
517 'target' => $talkTarget,
518 'summary' => 'Create Talk page',
523 $resultNew = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'new' ] );
524 $resultEdit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'edit' ] );
530 'ns' => $talkTarget->getNamespace(),
531 'title' => $this->getPrefixedText( $talkTarget ),
535 'ns' => $subjectTarget->getNamespace(),
536 'title' => $this->getPrefixedText( $subjectTarget ),
539 $this->getItemsFromApiResponse( $resultNew )
545 'ns' => $subjectTarget->getNamespace(),
546 'title' => $this->getPrefixedText( $subjectTarget ),
549 $this->getItemsFromApiResponse( $resultEdit )
553 public function testLogTypeParameters() {
554 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
555 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
556 $this->createPageAndDeleteIt( $subjectTarget );
557 $this->doPageEdit( $this->getLoggedInTestUser(), $talkTarget, 'Create Talk page' );
559 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'log' ] );
565 'ns' => $subjectTarget->getNamespace(),
566 'title' => $this->getPrefixedText( $subjectTarget ),
569 $this->getItemsFromApiResponse( $result )
573 private function getExternalRC( LinkTarget
$target ) {
574 $title = Title
::newFromLinkTarget( $target );
576 $rc = new RecentChange
;
577 $rc->mTitle
= $title;
579 'rc_timestamp' => wfTimestamp( TS_MW
),
580 'rc_namespace' => $title->getNamespace(),
581 'rc_title' => $title->getDBkey(),
582 'rc_type' => RC_EXTERNAL
,
583 'rc_source' => 'foo',
585 'rc_cur_id' => $title->getArticleID(),
587 'rc_user_text' => 'm>External User',
589 'rc_comment_text' => '',
590 'rc_comment_data' => null,
591 'rc_this_oldid' => $title->getLatestRevID(),
592 'rc_last_oldid' => $title->getLatestRevID(),
597 'rc_old_len' => $title->getLength(),
598 'rc_new_len' => $title->getLength(),
601 'rc_log_type' => null,
602 'rc_log_action' => '',
606 'prefixedDBkey' => $title->getPrefixedDBkey(),
607 'lastTimestamp' => 0,
608 'oldSize' => $title->getLength(),
609 'newSize' => $title->getLength(),
610 'pageStatus' => 'changed'
616 public function testExternalTypeParameters() {
617 $user = $this->getLoggedInTestUser();
618 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
619 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
620 $this->doPageEdit( $user, $subjectTarget, 'Create the page' );
621 $this->doPageEdit( $user, $talkTarget, 'Create Talk page' );
623 $rc = $this->getExternalRC( $subjectTarget );
626 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'external' ] );
631 'type' => 'external',
632 'ns' => $subjectTarget->getNamespace(),
633 'title' => $this->getPrefixedText( $subjectTarget ),
636 $this->getItemsFromApiResponse( $result )
640 public function testCategorizeTypeParameter() {
641 $user = $this->getLoggedInTestUser();
642 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
643 $categoryTarget = new TitleValue( NS_CATEGORY
, 'ApiQueryRecentChangesIntegrationTestCategory' );
648 'target' => $categoryTarget,
649 'summary' => 'Create the category',
652 'target' => $subjectTarget,
653 'summary' => 'Create the page and add it to the category',
657 $title = Title
::newFromLinkTarget( $subjectTarget );
658 $revision = Revision
::newFromTitle( $title );
660 $rc = RecentChange
::newForCategorization(
661 $revision->getTimestamp(),
662 Title
::newFromLinkTarget( $categoryTarget ),
664 $revision->getComment(),
673 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'categorize' ] );
678 'type' => 'categorize',
679 'ns' => $categoryTarget->getNamespace(),
680 'title' => $this->getPrefixedText( $categoryTarget ),
683 $this->getItemsFromApiResponse( $result )
687 public function testLimitParam() {
688 $target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
689 $target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
690 $target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
692 $this->getLoggedInTestUser(),
695 'target' => $target1,
696 'summary' => 'Create the page',
699 'target' => $target2,
700 'summary' => 'Create Talk page',
703 'target' => $target3,
704 'summary' => 'Create the page',
709 $resultWithoutLimit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
710 $resultWithLimit = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
716 'ns' => $target3->getNamespace(),
717 'title' => $this->getPrefixedText( $target3 )
721 'ns' => $target2->getNamespace(),
722 'title' => $this->getPrefixedText( $target2 )
726 'ns' => $target1->getNamespace(),
727 'title' => $this->getPrefixedText( $target1 )
730 $this->getItemsFromApiResponse( $resultWithoutLimit )
736 'ns' => $target3->getNamespace(),
737 'title' => $this->getPrefixedText( $target3 )
741 'ns' => $target2->getNamespace(),
742 'title' => $this->getPrefixedText( $target2 )
745 $this->getItemsFromApiResponse( $resultWithLimit )
747 $this->assertArrayHasKey( 'continue', $resultWithLimit[0] );
748 $this->assertArrayHasKey( 'rccontinue', $resultWithLimit[0]['continue'] );
751 public function testAllRevParam() {
752 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
754 $this->getLoggedInTestUser(),
758 'summary' => 'Create the page',
762 'summary' => 'Change the content',
767 $resultAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rcallrev' => '', ] );
768 $resultNoAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
774 'ns' => $target->getNamespace(),
775 'title' => $this->getPrefixedText( $target ),
779 'ns' => $target->getNamespace(),
780 'title' => $this->getPrefixedText( $target ),
783 $this->getItemsFromApiResponse( $resultNoAllRev )
789 'ns' => $target->getNamespace(),
790 'title' => $this->getPrefixedText( $target ),
794 'ns' => $target->getNamespace(),
795 'title' => $this->getPrefixedText( $target ),
798 $this->getItemsFromApiResponse( $resultAllRev )
802 public function testDirParams() {
803 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
804 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
806 $this->getLoggedInTestUser(),
809 'target' => $subjectTarget,
810 'summary' => 'Create the page',
813 'target' => $talkTarget,
814 'summary' => 'Create Talk page',
819 $resultDirOlder = $this->doListRecentChangesRequest(
820 [ 'rcdir' => 'older', 'rcprop' => 'title' ]
822 $resultDirNewer = $this->doListRecentChangesRequest(
823 [ 'rcdir' => 'newer', 'rcprop' => 'title' ]
830 'ns' => $talkTarget->getNamespace(),
831 'title' => $this->getPrefixedText( $talkTarget )
835 'ns' => $subjectTarget->getNamespace(),
836 'title' => $this->getPrefixedText( $subjectTarget )
839 $this->getItemsFromApiResponse( $resultDirOlder )
845 'ns' => $subjectTarget->getNamespace(),
846 'title' => $this->getPrefixedText( $subjectTarget )
850 'ns' => $talkTarget->getNamespace(),
851 'title' => $this->getPrefixedText( $talkTarget )
854 $this->getItemsFromApiResponse( $resultDirNewer )
858 public function testTitleParams() {
859 $page1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
860 $page2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage2' );
861 $page3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage3' );
863 $this->getLoggedInTestUser(),
867 'summary' => 'Create the page',
871 'summary' => 'Create the page',
875 'summary' => 'Create the page',
880 $result = $this->doListRecentChangesRequest(
882 'rctitle' => 'ApiQueryRecentChangesIntegrationTestPage',
887 $result2 = $this->doListRecentChangesRequest(
889 'rctitle' => 'Talk:ApiQueryRecentChangesIntegrationTestPage2',
898 'ns' => $page1->getNamespace(),
899 'title' => $this->getPrefixedText( $page1 )
902 $this->getItemsFromApiResponse( $result )
909 'ns' => $page2->getNamespace(),
910 'title' => $this->getPrefixedText( $page2 )
913 $this->getItemsFromApiResponse( $result2 )
917 public function testStartEndParams() {
918 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
919 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
921 $resultStart = $this->doListRecentChangesRequest( [
922 'rcstart' => '20010115000000',
926 $resultEnd = $this->doListRecentChangesRequest( [
927 'rcend' => '20010115000000',
936 'ns' => $target->getNamespace(),
937 'title' => $this->getPrefixedText( $target ),
940 $this->getItemsFromApiResponse( $resultStart )
942 $this->assertEmpty( $this->getItemsFromApiResponse( $resultEnd ) );
945 public function testContinueParam() {
946 $target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
947 $target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
948 $target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
950 $this->getLoggedInTestUser(),
953 'target' => $target1,
954 'summary' => 'Create the page',
957 'target' => $target2,
958 'summary' => 'Create Talk page',
961 'target' => $target3,
962 'summary' => 'Create the page',
967 $firstResult = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
968 $this->assertArrayHasKey( 'continue', $firstResult[0] );
969 $this->assertArrayHasKey( 'rccontinue', $firstResult[0]['continue'] );
971 $continuationParam = $firstResult[0]['continue']['rccontinue'];
973 $continuedResult = $this->doListRecentChangesRequest(
974 [ 'rccontinue' => $continuationParam, 'rcprop' => 'title' ]
981 'ns' => $target3->getNamespace(),
982 'title' => $this->getPrefixedText( $target3 ),
986 'ns' => $target2->getNamespace(),
987 'title' => $this->getPrefixedText( $target2 ),
990 $this->getItemsFromApiResponse( $firstResult )
996 'ns' => $target1->getNamespace(),
997 'title' => $this->getPrefixedText( $target1 )
1000 $this->getItemsFromApiResponse( $continuedResult )
1004 public function testGeneratorRecentChangesPropInfo_returnsRCPages() {
1005 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
1006 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
1008 $result = $this->doGeneratorRecentChangesRequest( [ 'prop' => 'info' ] );
1010 $this->assertArrayHasKey( 'query', $result[0] );
1011 $this->assertArrayHasKey( 'pages', $result[0]['query'] );
1013 // $result[0]['query']['pages'] uses page ids as keys. Page ids don't matter here, so drop them
1014 $pages = array_values( $result[0]['query']['pages'] );
1016 $this->assertCount( 1, $pages );
1017 $this->assertArraySubset(
1019 'ns' => $target->getNamespace(),
1020 'title' => $this->getPrefixedText( $target ),