Merge "Test ApiUserrights"
[lhc/web/wiklou.git] / tests / phpunit / includes / api / ApiQueryRecentChangesIntegrationTest.php
1 <?php
2
3 use MediaWiki\Linker\LinkTarget;
4 use MediaWiki\MediaWikiServices;
5
6 /**
7 * @group API
8 * @group Database
9 * @group medium
10 *
11 * @covers ApiQueryRecentChanges
12 */
13 class ApiQueryRecentChangesIntegrationTest extends ApiTestCase {
14
15 public function __construct( $name = null, array $data = [], $dataName = '' ) {
16 parent::__construct( $name, $data, $dataName );
17
18 $this->tablesUsed[] = 'recentchanges';
19 $this->tablesUsed[] = 'page';
20 }
21
22 protected function setUp() {
23 parent::setUp();
24
25 self::$users['ApiQueryRecentChangesIntegrationTestUser'] = $this->getMutableTestUser();
26 wfGetDB( DB_MASTER )->delete( 'recentchanges', '*', __METHOD__ );
27 }
28
29 private function getLoggedInTestUser() {
30 return self::$users['ApiQueryRecentChangesIntegrationTestUser']->getUser();
31 }
32
33 private function doPageEdit( User $user, LinkTarget $target, $summary ) {
34 static $i = 0;
35
36 $title = Title::newFromLinkTarget( $target );
37 $page = WikiPage::factory( $title );
38 $page->doEditContent(
39 ContentHandler::makeContent( __CLASS__ . $i++, $title ),
40 $summary,
41 0,
42 false,
43 $user
44 );
45 }
46
47 private function doMinorPageEdit( User $user, LinkTarget $target, $summary ) {
48 $title = Title::newFromLinkTarget( $target );
49 $page = WikiPage::factory( $title );
50 $page->doEditContent(
51 ContentHandler::makeContent( __CLASS__, $title ),
52 $summary,
53 EDIT_MINOR,
54 false,
55 $user
56 );
57 }
58
59 private function doBotPageEdit( User $user, LinkTarget $target, $summary ) {
60 $title = Title::newFromLinkTarget( $target );
61 $page = WikiPage::factory( $title );
62 $page->doEditContent(
63 ContentHandler::makeContent( __CLASS__, $title ),
64 $summary,
65 EDIT_FORCE_BOT,
66 false,
67 $user
68 );
69 }
70
71 private function doAnonPageEdit( LinkTarget $target, $summary ) {
72 $title = Title::newFromLinkTarget( $target );
73 $page = WikiPage::factory( $title );
74 $page->doEditContent(
75 ContentHandler::makeContent( __CLASS__, $title ),
76 $summary,
77 0,
78 false,
79 User::newFromId( 0 )
80 );
81 }
82
83 private function deletePage( LinkTarget $target, $reason ) {
84 $title = Title::newFromLinkTarget( $target );
85 $page = WikiPage::factory( $title );
86 $page->doDeleteArticleReal( $reason );
87 }
88
89 /**
90 * Performs a batch of page edits as a specified user
91 * @param User $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)
97 */
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(
102 $user,
103 $singleEditData['target'],
104 $singleEditData['summary']
105 );
106 continue;
107 }
108 if ( array_key_exists( 'botEdit', $singleEditData ) && $singleEditData['botEdit'] ) {
109 $this->doBotPageEdit(
110 $user,
111 $singleEditData['target'],
112 $singleEditData['summary']
113 );
114 continue;
115 }
116 $this->doPageEdit(
117 $user,
118 $singleEditData['target'],
119 $singleEditData['summary']
120 );
121 }
122 }
123
124 private function doListRecentChangesRequest( array $params = [] ) {
125 return $this->doApiRequest(
126 array_merge(
127 [ 'action' => 'query', 'list' => 'recentchanges' ],
128 $params
129 ),
130 null,
131 false,
132 $this->getLoggedInTestUser()
133 );
134 }
135
136 private function doGeneratorRecentChangesRequest( array $params = [] ) {
137 return $this->doApiRequest(
138 array_merge(
139 [ 'action' => 'query', 'generator' => 'recentchanges' ],
140 $params
141 ),
142 null,
143 false,
144 $this->getLoggedInTestUser()
145 );
146 }
147
148 private function getItemsFromApiResponse( array $response ) {
149 return $response[0]['query']['recentchanges'];
150 }
151
152 private function getTitleFormatter() {
153 return new MediaWikiTitleCodec(
154 Language::factory( 'en' ),
155 MediaWikiServices::getInstance()->getGenderCache()
156 );
157 }
158
159 private function getPrefixedText( LinkTarget $target ) {
160 $formatter = $this->getTitleFormatter();
161 return $formatter->getPrefixedText( $target );
162 }
163
164 public function testListRecentChanges_returnsRCInfo() {
165 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
166 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
167
168 $result = $this->doListRecentChangesRequest();
169
170 $this->assertArrayHasKey( 'query', $result[0] );
171 $this->assertArrayHasKey( 'recentchanges', $result[0]['query'] );
172
173 $items = $this->getItemsFromApiResponse( $result );
174 $this->assertCount( 1, $items );
175 $item = $items[0];
176 $this->assertArraySubset(
177 [
178 'type' => 'new',
179 'ns' => $target->getNamespace(),
180 'title' => $this->getPrefixedText( $target ),
181 ],
182 $item
183 );
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 );
190 }
191
192 public function testIdsPropParameter() {
193 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
194 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
195
196 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'ids', ] );
197 $items = $this->getItemsFromApiResponse( $result );
198
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'] );
204 }
205
206 public function testTitlePropParameter() {
207 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
208 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
209 $this->doPageEdits(
210 $this->getLoggedInTestUser(),
211 [
212 [
213 'target' => $subjectTarget,
214 'summary' => 'Create the page',
215 ],
216 [
217 'target' => $talkTarget,
218 'summary' => 'Create Talk page',
219 ],
220 ]
221 );
222
223 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', ] );
224
225 $this->assertEquals(
226 [
227 [
228 'type' => 'new',
229 'ns' => $talkTarget->getNamespace(),
230 'title' => $this->getPrefixedText( $talkTarget ),
231 ],
232 [
233 'type' => 'new',
234 'ns' => $subjectTarget->getNamespace(),
235 'title' => $this->getPrefixedText( $subjectTarget ),
236 ],
237 ],
238 $this->getItemsFromApiResponse( $result )
239 );
240 }
241
242 public function testFlagsPropParameter() {
243 $normalEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
244 $minorEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageM' );
245 $botEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageB' );
246 $this->doPageEdits(
247 $this->getLoggedInTestUser(),
248 [
249 [
250 'target' => $normalEditTarget,
251 'summary' => 'Create the page',
252 ],
253 [
254 'target' => $minorEditTarget,
255 'summary' => 'Create the page',
256 ],
257 [
258 'target' => $minorEditTarget,
259 'summary' => 'Change content',
260 'minorEdit' => true,
261 ],
262 [
263 'target' => $botEditTarget,
264 'summary' => 'Create the page with a bot',
265 'botEdit' => true,
266 ],
267 ]
268 );
269
270 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'flags', ] );
271
272 $this->assertEquals(
273 [
274 [
275 'type' => 'new',
276 'new' => true,
277 'minor' => false,
278 'bot' => true,
279 ],
280 [
281 'type' => 'edit',
282 'new' => false,
283 'minor' => true,
284 'bot' => false,
285 ],
286 [
287 'type' => 'new',
288 'new' => true,
289 'minor' => false,
290 'bot' => false,
291 ],
292 [
293 'type' => 'new',
294 'new' => true,
295 'minor' => false,
296 'bot' => false,
297 ],
298 ],
299 $this->getItemsFromApiResponse( $result )
300 );
301 }
302
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' );
308
309 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'user', ] );
310
311 $this->assertEquals(
312 [
313 [
314 'type' => 'new',
315 'anon' => true,
316 'user' => User::newFromId( 0 )->getName(),
317 ],
318 [
319 'type' => 'new',
320 'user' => $this->getLoggedInTestUser()->getName(),
321 ],
322 ],
323 $this->getItemsFromApiResponse( $result )
324 );
325 }
326
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' );
333
334 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'userid', ] );
335
336 $this->assertEquals(
337 [
338 [
339 'type' => 'new',
340 'anon' => true,
341 'userid' => 0,
342 ],
343 [
344 'type' => 'new',
345 'userid' => $user->getId(),
346 ],
347 ],
348 $this->getItemsFromApiResponse( $result )
349 );
350 }
351
352 public function testCommentPropParameter() {
353 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
354 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
355
356 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'comment', ] );
357
358 $this->assertEquals(
359 [
360 [
361 'type' => 'new',
362 'comment' => 'Create the <b>page</b>',
363 ],
364 ],
365 $this->getItemsFromApiResponse( $result )
366 );
367 }
368
369 public function testParsedCommentPropParameter() {
370 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
371 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
372
373 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'parsedcomment', ] );
374
375 $this->assertEquals(
376 [
377 [
378 'type' => 'new',
379 'parsedcomment' => 'Create the &lt;b&gt;page&lt;/b&gt;',
380 ],
381 ],
382 $this->getItemsFromApiResponse( $result )
383 );
384 }
385
386 public function testTimestampPropParameter() {
387 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
388 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
389
390 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'timestamp', ] );
391 $items = $this->getItemsFromApiResponse( $result );
392
393 $this->assertCount( 1, $items );
394 $this->assertArrayHasKey( 'timestamp', $items[0] );
395 $this->assertInternalType( 'string', $items[0]['timestamp'] );
396 }
397
398 public function testSizesPropParameter() {
399 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
400 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
401
402 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'sizes', ] );
403
404 $this->assertEquals(
405 [
406 [
407 'type' => 'new',
408 'oldlen' => 0,
409 'newlen' => 38,
410 ],
411 ],
412 $this->getItemsFromApiResponse( $result )
413 );
414 }
415
416 private function createPageAndDeleteIt( LinkTarget $target ) {
417 $this->doPageEdit( $this->getLoggedInTestUser(),
418 $target,
419 'Create the page that will be deleted'
420 );
421 $this->deletePage( $target, 'Important Reason' );
422 }
423
424 public function testLoginfoPropParameter() {
425 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
426 $this->createPageAndDeleteIt( $target );
427
428 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'loginfo', ] );
429
430 $items = $this->getItemsFromApiResponse( $result );
431 $this->assertCount( 1, $items );
432 $this->assertArraySubset(
433 [
434 'type' => 'log',
435 'logtype' => 'delete',
436 'logaction' => 'delete',
437 'logparams' => [],
438 ],
439 $items[0]
440 );
441 $this->assertArrayHasKey( 'logid', $items[0] );
442 }
443
444 public function testEmptyPropParameter() {
445 $user = $this->getLoggedInTestUser();
446 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
447 $this->doPageEdit( $user, $target, 'Create the page' );
448
449 $result = $this->doListRecentChangesRequest( [ 'rcprop' => '', ] );
450
451 $this->assertEquals(
452 [
453 [
454 'type' => 'new',
455 ]
456 ],
457 $this->getItemsFromApiResponse( $result )
458 );
459 }
460
461 public function testNamespaceParam() {
462 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
463 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
464 $this->doPageEdits(
465 $this->getLoggedInTestUser(),
466 [
467 [
468 'target' => $subjectTarget,
469 'summary' => 'Create the page',
470 ],
471 [
472 'target' => $talkTarget,
473 'summary' => 'Create the talk page',
474 ],
475 ]
476 );
477
478 $result = $this->doListRecentChangesRequest( [ 'rcnamespace' => '0', ] );
479
480 $items = $this->getItemsFromApiResponse( $result );
481 $this->assertCount( 1, $items );
482 $this->assertArraySubset(
483 [
484 'ns' => 0,
485 'title' => $this->getPrefixedText( $subjectTarget ),
486 ],
487 $items[0]
488 );
489 }
490
491 public function testShowAnonParams() {
492 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
493 $this->doAnonPageEdit( $target, 'Create the page' );
494
495 $resultAnon = $this->doListRecentChangesRequest( [
496 'rcprop' => 'user',
497 'rcshow' => WatchedItemQueryService::FILTER_ANON
498 ] );
499 $resultNotAnon = $this->doListRecentChangesRequest( [
500 'rcprop' => 'user',
501 'rcshow' => WatchedItemQueryService::FILTER_NOT_ANON
502 ] );
503
504 $items = $this->getItemsFromApiResponse( $resultAnon );
505 $this->assertCount( 1, $items );
506 $this->assertArraySubset( [ 'anon' => true ], $items[0] );
507 $this->assertEmpty( $this->getItemsFromApiResponse( $resultNotAnon ) );
508 }
509
510 public function testNewAndEditTypeParameters() {
511 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
512 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
513 $this->doPageEdits(
514 $this->getLoggedInTestUser(),
515 [
516 [
517 'target' => $subjectTarget,
518 'summary' => 'Create the page',
519 ],
520 [
521 'target' => $subjectTarget,
522 'summary' => 'Change the content',
523 ],
524 [
525 'target' => $talkTarget,
526 'summary' => 'Create Talk page',
527 ],
528 ]
529 );
530
531 $resultNew = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'new' ] );
532 $resultEdit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'edit' ] );
533
534 $this->assertEquals(
535 [
536 [
537 'type' => 'new',
538 'ns' => $talkTarget->getNamespace(),
539 'title' => $this->getPrefixedText( $talkTarget ),
540 ],
541 [
542 'type' => 'new',
543 'ns' => $subjectTarget->getNamespace(),
544 'title' => $this->getPrefixedText( $subjectTarget ),
545 ],
546 ],
547 $this->getItemsFromApiResponse( $resultNew )
548 );
549 $this->assertEquals(
550 [
551 [
552 'type' => 'edit',
553 'ns' => $subjectTarget->getNamespace(),
554 'title' => $this->getPrefixedText( $subjectTarget ),
555 ],
556 ],
557 $this->getItemsFromApiResponse( $resultEdit )
558 );
559 }
560
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' );
566
567 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'log' ] );
568
569 $this->assertEquals(
570 [
571 [
572 'type' => 'log',
573 'ns' => $subjectTarget->getNamespace(),
574 'title' => $this->getPrefixedText( $subjectTarget ),
575 ],
576 ],
577 $this->getItemsFromApiResponse( $result )
578 );
579 }
580
581 private function getExternalRC( LinkTarget $target ) {
582 $title = Title::newFromLinkTarget( $target );
583
584 $rc = new RecentChange;
585 $rc->mTitle = $title;
586 $rc->mAttribs = [
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',
592 'rc_minor' => 0,
593 'rc_cur_id' => $title->getArticleID(),
594 'rc_user' => 0,
595 'rc_user_text' => 'm>External User',
596 'rc_comment' => '',
597 'rc_comment_text' => '',
598 'rc_comment_data' => null,
599 'rc_this_oldid' => $title->getLatestRevID(),
600 'rc_last_oldid' => $title->getLatestRevID(),
601 'rc_bot' => 0,
602 'rc_ip' => '',
603 'rc_patrolled' => 0,
604 'rc_new' => 0,
605 'rc_old_len' => $title->getLength(),
606 'rc_new_len' => $title->getLength(),
607 'rc_deleted' => 0,
608 'rc_logid' => 0,
609 'rc_log_type' => null,
610 'rc_log_action' => '',
611 'rc_params' => '',
612 ];
613 $rc->mExtra = [
614 'prefixedDBkey' => $title->getPrefixedDBkey(),
615 'lastTimestamp' => 0,
616 'oldSize' => $title->getLength(),
617 'newSize' => $title->getLength(),
618 'pageStatus' => 'changed'
619 ];
620
621 return $rc;
622 }
623
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' );
630
631 $rc = $this->getExternalRC( $subjectTarget );
632 $rc->save();
633
634 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'external' ] );
635
636 $this->assertEquals(
637 [
638 [
639 'type' => 'external',
640 'ns' => $subjectTarget->getNamespace(),
641 'title' => $this->getPrefixedText( $subjectTarget ),
642 ],
643 ],
644 $this->getItemsFromApiResponse( $result )
645 );
646 }
647
648 public function testCategorizeTypeParameter() {
649 $user = $this->getLoggedInTestUser();
650 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
651 $categoryTarget = new TitleValue( NS_CATEGORY, 'ApiQueryRecentChangesIntegrationTestCategory' );
652 $this->doPageEdits(
653 $user,
654 [
655 [
656 'target' => $categoryTarget,
657 'summary' => 'Create the category',
658 ],
659 [
660 'target' => $subjectTarget,
661 'summary' => 'Create the page and add it to the category',
662 ],
663 ]
664 );
665 $title = Title::newFromLinkTarget( $subjectTarget );
666 $revision = Revision::newFromTitle( $title );
667
668 $rc = RecentChange::newForCategorization(
669 $revision->getTimestamp(),
670 Title::newFromLinkTarget( $categoryTarget ),
671 $user,
672 $revision->getComment(),
673 $title,
674 0,
675 $revision->getId(),
676 null,
677 false
678 );
679 $rc->save();
680
681 $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'categorize' ] );
682
683 $this->assertEquals(
684 [
685 [
686 'type' => 'categorize',
687 'ns' => $categoryTarget->getNamespace(),
688 'title' => $this->getPrefixedText( $categoryTarget ),
689 ],
690 ],
691 $this->getItemsFromApiResponse( $result )
692 );
693 }
694
695 public function testLimitParam() {
696 $target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
697 $target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
698 $target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
699 $this->doPageEdits(
700 $this->getLoggedInTestUser(),
701 [
702 [
703 'target' => $target1,
704 'summary' => 'Create the page',
705 ],
706 [
707 'target' => $target2,
708 'summary' => 'Create Talk page',
709 ],
710 [
711 'target' => $target3,
712 'summary' => 'Create the page',
713 ],
714 ]
715 );
716
717 $resultWithoutLimit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
718 $resultWithLimit = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
719
720 $this->assertEquals(
721 [
722 [
723 'type' => 'new',
724 'ns' => $target3->getNamespace(),
725 'title' => $this->getPrefixedText( $target3 )
726 ],
727 [
728 'type' => 'new',
729 'ns' => $target2->getNamespace(),
730 'title' => $this->getPrefixedText( $target2 )
731 ],
732 [
733 'type' => 'new',
734 'ns' => $target1->getNamespace(),
735 'title' => $this->getPrefixedText( $target1 )
736 ],
737 ],
738 $this->getItemsFromApiResponse( $resultWithoutLimit )
739 );
740 $this->assertEquals(
741 [
742 [
743 'type' => 'new',
744 'ns' => $target3->getNamespace(),
745 'title' => $this->getPrefixedText( $target3 )
746 ],
747 [
748 'type' => 'new',
749 'ns' => $target2->getNamespace(),
750 'title' => $this->getPrefixedText( $target2 )
751 ],
752 ],
753 $this->getItemsFromApiResponse( $resultWithLimit )
754 );
755 $this->assertArrayHasKey( 'continue', $resultWithLimit[0] );
756 $this->assertArrayHasKey( 'rccontinue', $resultWithLimit[0]['continue'] );
757 }
758
759 public function testAllRevParam() {
760 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
761 $this->doPageEdits(
762 $this->getLoggedInTestUser(),
763 [
764 [
765 'target' => $target,
766 'summary' => 'Create the page',
767 ],
768 [
769 'target' => $target,
770 'summary' => 'Change the content',
771 ],
772 ]
773 );
774
775 $resultAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rcallrev' => '', ] );
776 $resultNoAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
777
778 $this->assertEquals(
779 [
780 [
781 'type' => 'edit',
782 'ns' => $target->getNamespace(),
783 'title' => $this->getPrefixedText( $target ),
784 ],
785 [
786 'type' => 'new',
787 'ns' => $target->getNamespace(),
788 'title' => $this->getPrefixedText( $target ),
789 ],
790 ],
791 $this->getItemsFromApiResponse( $resultNoAllRev )
792 );
793 $this->assertEquals(
794 [
795 [
796 'type' => 'edit',
797 'ns' => $target->getNamespace(),
798 'title' => $this->getPrefixedText( $target ),
799 ],
800 [
801 'type' => 'new',
802 'ns' => $target->getNamespace(),
803 'title' => $this->getPrefixedText( $target ),
804 ],
805 ],
806 $this->getItemsFromApiResponse( $resultAllRev )
807 );
808 }
809
810 public function testDirParams() {
811 $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
812 $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
813 $this->doPageEdits(
814 $this->getLoggedInTestUser(),
815 [
816 [
817 'target' => $subjectTarget,
818 'summary' => 'Create the page',
819 ],
820 [
821 'target' => $talkTarget,
822 'summary' => 'Create Talk page',
823 ],
824 ]
825 );
826
827 $resultDirOlder = $this->doListRecentChangesRequest(
828 [ 'rcdir' => 'older', 'rcprop' => 'title' ]
829 );
830 $resultDirNewer = $this->doListRecentChangesRequest(
831 [ 'rcdir' => 'newer', 'rcprop' => 'title' ]
832 );
833
834 $this->assertEquals(
835 [
836 [
837 'type' => 'new',
838 'ns' => $talkTarget->getNamespace(),
839 'title' => $this->getPrefixedText( $talkTarget )
840 ],
841 [
842 'type' => 'new',
843 'ns' => $subjectTarget->getNamespace(),
844 'title' => $this->getPrefixedText( $subjectTarget )
845 ],
846 ],
847 $this->getItemsFromApiResponse( $resultDirOlder )
848 );
849 $this->assertEquals(
850 [
851 [
852 'type' => 'new',
853 'ns' => $subjectTarget->getNamespace(),
854 'title' => $this->getPrefixedText( $subjectTarget )
855 ],
856 [
857 'type' => 'new',
858 'ns' => $talkTarget->getNamespace(),
859 'title' => $this->getPrefixedText( $talkTarget )
860 ],
861 ],
862 $this->getItemsFromApiResponse( $resultDirNewer )
863 );
864 }
865
866 public function testStartEndParams() {
867 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
868 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
869
870 $resultStart = $this->doListRecentChangesRequest( [
871 'rcstart' => '20010115000000',
872 'rcdir' => 'newer',
873 'rcprop' => 'title',
874 ] );
875 $resultEnd = $this->doListRecentChangesRequest( [
876 'rcend' => '20010115000000',
877 'rcdir' => 'newer',
878 'rcprop' => 'title',
879 ] );
880
881 $this->assertEquals(
882 [
883 [
884 'type' => 'new',
885 'ns' => $target->getNamespace(),
886 'title' => $this->getPrefixedText( $target ),
887 ]
888 ],
889 $this->getItemsFromApiResponse( $resultStart )
890 );
891 $this->assertEmpty( $this->getItemsFromApiResponse( $resultEnd ) );
892 }
893
894 public function testContinueParam() {
895 $target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
896 $target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
897 $target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
898 $this->doPageEdits(
899 $this->getLoggedInTestUser(),
900 [
901 [
902 'target' => $target1,
903 'summary' => 'Create the page',
904 ],
905 [
906 'target' => $target2,
907 'summary' => 'Create Talk page',
908 ],
909 [
910 'target' => $target3,
911 'summary' => 'Create the page',
912 ],
913 ]
914 );
915
916 $firstResult = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
917 $this->assertArrayHasKey( 'continue', $firstResult[0] );
918 $this->assertArrayHasKey( 'rccontinue', $firstResult[0]['continue'] );
919
920 $continuationParam = $firstResult[0]['continue']['rccontinue'];
921
922 $continuedResult = $this->doListRecentChangesRequest(
923 [ 'rccontinue' => $continuationParam, 'rcprop' => 'title' ]
924 );
925
926 $this->assertEquals(
927 [
928 [
929 'type' => 'new',
930 'ns' => $target3->getNamespace(),
931 'title' => $this->getPrefixedText( $target3 ),
932 ],
933 [
934 'type' => 'new',
935 'ns' => $target2->getNamespace(),
936 'title' => $this->getPrefixedText( $target2 ),
937 ],
938 ],
939 $this->getItemsFromApiResponse( $firstResult )
940 );
941 $this->assertEquals(
942 [
943 [
944 'type' => 'new',
945 'ns' => $target1->getNamespace(),
946 'title' => $this->getPrefixedText( $target1 )
947 ]
948 ],
949 $this->getItemsFromApiResponse( $continuedResult )
950 );
951 }
952
953 public function testGeneratorRecentChangesPropInfo_returnsRCPages() {
954 $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
955 $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
956
957 $result = $this->doGeneratorRecentChangesRequest( [ 'prop' => 'info' ] );
958
959 $this->assertArrayHasKey( 'query', $result[0] );
960 $this->assertArrayHasKey( 'pages', $result[0]['query'] );
961
962 // $result[0]['query']['pages'] uses page ids as keys. Page ids don't matter here, so drop them
963 $pages = array_values( $result[0]['query']['pages'] );
964
965 $this->assertCount( 1, $pages );
966 $this->assertArraySubset(
967 [
968 'ns' => $target->getNamespace(),
969 'title' => $this->getPrefixedText( $target ),
970 'new' => true,
971 ],
972 $pages[0]
973 );
974 }
975
976 }