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 getTitleFormatter() {
153 return new MediaWikiTitleCodec(
154 Language
::factory( 'en' ),
155 MediaWikiServices
::getInstance()->getGenderCache()
159 private function getPrefixedText( LinkTarget
$target ) {
160 $formatter = $this->getTitleFormatter();
161 return $formatter->getPrefixedText( $target );
164 public function testListRecentChanges_returnsRCInfo() {
165 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
166 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
168 $result = $this->doListRecentChangesRequest();
170 $this->assertArrayHasKey( 'query', $result[0] );
171 $this->assertArrayHasKey( 'recentchanges', $result[0]['query'] );
173 $items = $this->getItemsFromApiResponse( $result );
174 $this->assertCount( 1, $items );
176 $this->assertArraySubset(
179 'ns' => $target->getNamespace(),
180 'title' => $this->getPrefixedText( $target ),
184 $this->assertArrayNotHasKey( 'bot', $item );
185 $this->assertArrayNotHasKey( 'new', $item );
186 $this->assertArrayNotHasKey( 'minor', $item );
187 $this->assertArrayHasKey( 'pageid', $item );
188 $this->assertArrayHasKey( 'revid', $item );
189 $this->assertArrayHasKey( 'old_revid', $item );
192 public function testIdsPropParameter() {
193 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
194 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
196 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'ids', ] );
197 $items = $this->getItemsFromApiResponse( $result );
199 $this->assertCount( 1, $items );
200 $this->assertArrayHasKey( 'pageid', $items[0] );
201 $this->assertArrayHasKey( 'revid', $items[0] );
202 $this->assertArrayHasKey( 'old_revid', $items[0] );
203 $this->assertEquals( 'new', $items[0]['type'] );
206 public function testTitlePropParameter() {
207 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
208 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
210 $this->getLoggedInTestUser(),
213 'target' => $subjectTarget,
214 'summary' => 'Create the page',
217 'target' => $talkTarget,
218 'summary' => 'Create Talk page',
223 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', ] );
229 'ns' => $talkTarget->getNamespace(),
230 'title' => $this->getPrefixedText( $talkTarget ),
234 'ns' => $subjectTarget->getNamespace(),
235 'title' => $this->getPrefixedText( $subjectTarget ),
238 $this->getItemsFromApiResponse( $result )
242 public function testFlagsPropParameter() {
243 $normalEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
244 $minorEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageM' );
245 $botEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageB' );
247 $this->getLoggedInTestUser(),
250 'target' => $normalEditTarget,
251 'summary' => 'Create the page',
254 'target' => $minorEditTarget,
255 'summary' => 'Create the page',
258 'target' => $minorEditTarget,
259 'summary' => 'Change content',
263 'target' => $botEditTarget,
264 'summary' => 'Create the page with a bot',
270 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'flags', ] );
299 $this->getItemsFromApiResponse( $result )
303 public function testUserPropParameter() {
304 $userEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
305 $anonEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageA' );
306 $this->doPageEdit( $this->getLoggedInTestUser(), $userEditTarget, 'Create the page' );
307 $this->doAnonPageEdit( $anonEditTarget, 'Create the page' );
309 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'user', ] );
316 'user' => User
::newFromId( 0 )->getName(),
320 'user' => $this->getLoggedInTestUser()->getName(),
323 $this->getItemsFromApiResponse( $result )
327 public function testUserIdPropParameter() {
328 $user = $this->getLoggedInTestUser();
329 $userEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
330 $anonEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageA' );
331 $this->doPageEdit( $user, $userEditTarget, 'Create the page' );
332 $this->doAnonPageEdit( $anonEditTarget, 'Create the page' );
334 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'userid', ] );
345 'userid' => $user->getId(),
348 $this->getItemsFromApiResponse( $result )
352 public function testCommentPropParameter() {
353 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
354 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
356 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'comment', ] );
362 'comment' => 'Create the <b>page</b>',
365 $this->getItemsFromApiResponse( $result )
369 public function testParsedCommentPropParameter() {
370 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
371 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
373 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'parsedcomment', ] );
379 'parsedcomment' => 'Create the <b>page</b>',
382 $this->getItemsFromApiResponse( $result )
386 public function testTimestampPropParameter() {
387 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
388 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
390 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'timestamp', ] );
391 $items = $this->getItemsFromApiResponse( $result );
393 $this->assertCount( 1, $items );
394 $this->assertArrayHasKey( 'timestamp', $items[0] );
395 $this->assertInternalType( 'string', $items[0]['timestamp'] );
398 public function testSizesPropParameter() {
399 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
400 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
402 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'sizes', ] );
412 $this->getItemsFromApiResponse( $result )
416 private function createPageAndDeleteIt( LinkTarget
$target ) {
417 $this->doPageEdit( $this->getLoggedInTestUser(),
419 'Create the page that will be deleted'
421 $this->deletePage( $target, 'Important Reason' );
424 public function testLoginfoPropParameter() {
425 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
426 $this->createPageAndDeleteIt( $target );
428 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'loginfo', ] );
430 $items = $this->getItemsFromApiResponse( $result );
431 $this->assertCount( 1, $items );
432 $this->assertArraySubset(
435 'logtype' => 'delete',
436 'logaction' => 'delete',
441 $this->assertArrayHasKey( 'logid', $items[0] );
444 public function testEmptyPropParameter() {
445 $user = $this->getLoggedInTestUser();
446 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
447 $this->doPageEdit( $user, $target, 'Create the page' );
449 $result = $this->doListRecentChangesRequest( [ 'rcprop' => '', ] );
457 $this->getItemsFromApiResponse( $result )
461 public function testNamespaceParam() {
462 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
463 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
465 $this->getLoggedInTestUser(),
468 'target' => $subjectTarget,
469 'summary' => 'Create the page',
472 'target' => $talkTarget,
473 'summary' => 'Create the talk page',
478 $result = $this->doListRecentChangesRequest( [ 'rcnamespace' => '0', ] );
480 $items = $this->getItemsFromApiResponse( $result );
481 $this->assertCount( 1, $items );
482 $this->assertArraySubset(
485 'title' => $this->getPrefixedText( $subjectTarget ),
491 public function testShowAnonParams() {
492 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
493 $this->doAnonPageEdit( $target, 'Create the page' );
495 $resultAnon = $this->doListRecentChangesRequest( [
497 'rcshow' => WatchedItemQueryService
::FILTER_ANON
499 $resultNotAnon = $this->doListRecentChangesRequest( [
501 'rcshow' => WatchedItemQueryService
::FILTER_NOT_ANON
504 $items = $this->getItemsFromApiResponse( $resultAnon );
505 $this->assertCount( 1, $items );
506 $this->assertArraySubset( [ 'anon' => true ], $items[0] );
507 $this->assertEmpty( $this->getItemsFromApiResponse( $resultNotAnon ) );
510 public function testNewAndEditTypeParameters() {
511 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
512 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
514 $this->getLoggedInTestUser(),
517 'target' => $subjectTarget,
518 'summary' => 'Create the page',
521 'target' => $subjectTarget,
522 'summary' => 'Change the content',
525 'target' => $talkTarget,
526 'summary' => 'Create Talk page',
531 $resultNew = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'new' ] );
532 $resultEdit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'edit' ] );
538 'ns' => $talkTarget->getNamespace(),
539 'title' => $this->getPrefixedText( $talkTarget ),
543 'ns' => $subjectTarget->getNamespace(),
544 'title' => $this->getPrefixedText( $subjectTarget ),
547 $this->getItemsFromApiResponse( $resultNew )
553 'ns' => $subjectTarget->getNamespace(),
554 'title' => $this->getPrefixedText( $subjectTarget ),
557 $this->getItemsFromApiResponse( $resultEdit )
561 public function testLogTypeParameters() {
562 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
563 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
564 $this->createPageAndDeleteIt( $subjectTarget );
565 $this->doPageEdit( $this->getLoggedInTestUser(), $talkTarget, 'Create Talk page' );
567 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'log' ] );
573 'ns' => $subjectTarget->getNamespace(),
574 'title' => $this->getPrefixedText( $subjectTarget ),
577 $this->getItemsFromApiResponse( $result )
581 private function getExternalRC( LinkTarget
$target ) {
582 $title = Title
::newFromLinkTarget( $target );
584 $rc = new RecentChange
;
585 $rc->mTitle
= $title;
587 'rc_timestamp' => wfTimestamp( TS_MW
),
588 'rc_namespace' => $title->getNamespace(),
589 'rc_title' => $title->getDBkey(),
590 'rc_type' => RC_EXTERNAL
,
591 'rc_source' => 'foo',
593 'rc_cur_id' => $title->getArticleID(),
595 'rc_user_text' => 'm>External User',
597 'rc_comment_text' => '',
598 'rc_comment_data' => null,
599 'rc_this_oldid' => $title->getLatestRevID(),
600 'rc_last_oldid' => $title->getLatestRevID(),
605 'rc_old_len' => $title->getLength(),
606 'rc_new_len' => $title->getLength(),
609 'rc_log_type' => null,
610 'rc_log_action' => '',
614 'prefixedDBkey' => $title->getPrefixedDBkey(),
615 'lastTimestamp' => 0,
616 'oldSize' => $title->getLength(),
617 'newSize' => $title->getLength(),
618 'pageStatus' => 'changed'
624 public function testExternalTypeParameters() {
625 $user = $this->getLoggedInTestUser();
626 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
627 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
628 $this->doPageEdit( $user, $subjectTarget, 'Create the page' );
629 $this->doPageEdit( $user, $talkTarget, 'Create Talk page' );
631 $rc = $this->getExternalRC( $subjectTarget );
634 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'external' ] );
639 'type' => 'external',
640 'ns' => $subjectTarget->getNamespace(),
641 'title' => $this->getPrefixedText( $subjectTarget ),
644 $this->getItemsFromApiResponse( $result )
648 public function testCategorizeTypeParameter() {
649 $user = $this->getLoggedInTestUser();
650 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
651 $categoryTarget = new TitleValue( NS_CATEGORY
, 'ApiQueryRecentChangesIntegrationTestCategory' );
656 'target' => $categoryTarget,
657 'summary' => 'Create the category',
660 'target' => $subjectTarget,
661 'summary' => 'Create the page and add it to the category',
665 $title = Title
::newFromLinkTarget( $subjectTarget );
666 $revision = Revision
::newFromTitle( $title );
668 $rc = RecentChange
::newForCategorization(
669 $revision->getTimestamp(),
670 Title
::newFromLinkTarget( $categoryTarget ),
672 $revision->getComment(),
681 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'categorize' ] );
686 'type' => 'categorize',
687 'ns' => $categoryTarget->getNamespace(),
688 'title' => $this->getPrefixedText( $categoryTarget ),
691 $this->getItemsFromApiResponse( $result )
695 public function testLimitParam() {
696 $target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
697 $target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
698 $target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
700 $this->getLoggedInTestUser(),
703 'target' => $target1,
704 'summary' => 'Create the page',
707 'target' => $target2,
708 'summary' => 'Create Talk page',
711 'target' => $target3,
712 'summary' => 'Create the page',
717 $resultWithoutLimit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
718 $resultWithLimit = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
724 'ns' => $target3->getNamespace(),
725 'title' => $this->getPrefixedText( $target3 )
729 'ns' => $target2->getNamespace(),
730 'title' => $this->getPrefixedText( $target2 )
734 'ns' => $target1->getNamespace(),
735 'title' => $this->getPrefixedText( $target1 )
738 $this->getItemsFromApiResponse( $resultWithoutLimit )
744 'ns' => $target3->getNamespace(),
745 'title' => $this->getPrefixedText( $target3 )
749 'ns' => $target2->getNamespace(),
750 'title' => $this->getPrefixedText( $target2 )
753 $this->getItemsFromApiResponse( $resultWithLimit )
755 $this->assertArrayHasKey( 'continue', $resultWithLimit[0] );
756 $this->assertArrayHasKey( 'rccontinue', $resultWithLimit[0]['continue'] );
759 public function testAllRevParam() {
760 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
762 $this->getLoggedInTestUser(),
766 'summary' => 'Create the page',
770 'summary' => 'Change the content',
775 $resultAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rcallrev' => '', ] );
776 $resultNoAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
782 'ns' => $target->getNamespace(),
783 'title' => $this->getPrefixedText( $target ),
787 'ns' => $target->getNamespace(),
788 'title' => $this->getPrefixedText( $target ),
791 $this->getItemsFromApiResponse( $resultNoAllRev )
797 'ns' => $target->getNamespace(),
798 'title' => $this->getPrefixedText( $target ),
802 'ns' => $target->getNamespace(),
803 'title' => $this->getPrefixedText( $target ),
806 $this->getItemsFromApiResponse( $resultAllRev )
810 public function testDirParams() {
811 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
812 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
814 $this->getLoggedInTestUser(),
817 'target' => $subjectTarget,
818 'summary' => 'Create the page',
821 'target' => $talkTarget,
822 'summary' => 'Create Talk page',
827 $resultDirOlder = $this->doListRecentChangesRequest(
828 [ 'rcdir' => 'older', 'rcprop' => 'title' ]
830 $resultDirNewer = $this->doListRecentChangesRequest(
831 [ 'rcdir' => 'newer', 'rcprop' => 'title' ]
838 'ns' => $talkTarget->getNamespace(),
839 'title' => $this->getPrefixedText( $talkTarget )
843 'ns' => $subjectTarget->getNamespace(),
844 'title' => $this->getPrefixedText( $subjectTarget )
847 $this->getItemsFromApiResponse( $resultDirOlder )
853 'ns' => $subjectTarget->getNamespace(),
854 'title' => $this->getPrefixedText( $subjectTarget )
858 'ns' => $talkTarget->getNamespace(),
859 'title' => $this->getPrefixedText( $talkTarget )
862 $this->getItemsFromApiResponse( $resultDirNewer )
866 public function testTitleParams() {
867 $page1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
868 $page2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage2' );
869 $page3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage3' );
871 $this->getLoggedInTestUser(),
875 'summary' => 'Create the page',
879 'summary' => 'Create the page',
883 'summary' => 'Create the page',
888 $result = $this->doListRecentChangesRequest(
890 'rctitle' => 'ApiQueryRecentChangesIntegrationTestPage',
895 $result2 = $this->doListRecentChangesRequest(
897 'rctitle' => 'Talk:ApiQueryRecentChangesIntegrationTestPage2',
906 'ns' => $page1->getNamespace(),
907 'title' => $this->getPrefixedText( $page1 )
910 $this->getItemsFromApiResponse( $result )
917 'ns' => $page2->getNamespace(),
918 'title' => $this->getPrefixedText( $page2 )
921 $this->getItemsFromApiResponse( $result2 )
925 public function testStartEndParams() {
926 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
927 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
929 $resultStart = $this->doListRecentChangesRequest( [
930 'rcstart' => '20010115000000',
934 $resultEnd = $this->doListRecentChangesRequest( [
935 'rcend' => '20010115000000',
944 'ns' => $target->getNamespace(),
945 'title' => $this->getPrefixedText( $target ),
948 $this->getItemsFromApiResponse( $resultStart )
950 $this->assertEmpty( $this->getItemsFromApiResponse( $resultEnd ) );
953 public function testContinueParam() {
954 $target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
955 $target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
956 $target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
958 $this->getLoggedInTestUser(),
961 'target' => $target1,
962 'summary' => 'Create the page',
965 'target' => $target2,
966 'summary' => 'Create Talk page',
969 'target' => $target3,
970 'summary' => 'Create the page',
975 $firstResult = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
976 $this->assertArrayHasKey( 'continue', $firstResult[0] );
977 $this->assertArrayHasKey( 'rccontinue', $firstResult[0]['continue'] );
979 $continuationParam = $firstResult[0]['continue']['rccontinue'];
981 $continuedResult = $this->doListRecentChangesRequest(
982 [ 'rccontinue' => $continuationParam, 'rcprop' => 'title' ]
989 'ns' => $target3->getNamespace(),
990 'title' => $this->getPrefixedText( $target3 ),
994 'ns' => $target2->getNamespace(),
995 'title' => $this->getPrefixedText( $target2 ),
998 $this->getItemsFromApiResponse( $firstResult )
1000 $this->assertEquals(
1004 'ns' => $target1->getNamespace(),
1005 'title' => $this->getPrefixedText( $target1 )
1008 $this->getItemsFromApiResponse( $continuedResult )
1012 public function testGeneratorRecentChangesPropInfo_returnsRCPages() {
1013 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
1014 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
1016 $result = $this->doGeneratorRecentChangesRequest( [ 'prop' => 'info' ] );
1018 $this->assertArrayHasKey( 'query', $result[0] );
1019 $this->assertArrayHasKey( 'pages', $result[0]['query'] );
1021 // $result[0]['query']['pages'] uses page ids as keys. Page ids don't matter here, so drop them
1022 $pages = array_values( $result[0]['query']['pages'] );
1024 $this->assertCount( 1, $pages );
1025 $this->assertArraySubset(
1027 'ns' => $target->getNamespace(),
1028 'title' => $this->getPrefixedText( $target ),