wiki.techinc.nl/tests/phpunit/includes/api/ApiQueryRecentChangesIntegrationTest.php
Brad Jorsch 27c61fb1e9 Add actor table and code to start using it
Storing the user name or IP in every row in large tables like revision
and logging takes up space and makes operations on these tables slower.
This patch begins the process of moving those into one "actor" table
which other tables can reference with a single integer field.

A subsequent patch will remove the old columns.

Bug: T167246
Depends-On: I9293fd6e0f958d87e52965de925046f1bb8f8a50
Change-Id: I8d825eb02c69cc66d90bd41325133fd3f99f0226
2018-02-23 10:06:20 -08:00

973 lines
26 KiB
PHP

<?php
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
/**
* @group API
* @group Database
* @group medium
*
* @covers ApiQueryRecentChanges
*/
class ApiQueryRecentChangesIntegrationTest extends ApiTestCase {
public function __construct( $name = null, array $data = [], $dataName = '' ) {
parent::__construct( $name, $data, $dataName );
$this->tablesUsed[] = 'recentchanges';
$this->tablesUsed[] = 'page';
}
protected function setUp() {
parent::setUp();
self::$users['ApiQueryRecentChangesIntegrationTestUser'] = $this->getMutableTestUser();
$this->doLogin( 'ApiQueryRecentChangesIntegrationTestUser' );
wfGetDB( DB_MASTER )->delete( 'recentchanges', '*', __METHOD__ );
}
private function getLoggedInTestUser() {
return self::$users['ApiQueryRecentChangesIntegrationTestUser']->getUser();
}
private function doPageEdit( User $user, LinkTarget $target, $summary ) {
static $i = 0;
$title = Title::newFromLinkTarget( $target );
$page = WikiPage::factory( $title );
$page->doEditContent(
ContentHandler::makeContent( __CLASS__ . $i++, $title ),
$summary,
0,
false,
$user
);
}
private function doMinorPageEdit( User $user, LinkTarget $target, $summary ) {
$title = Title::newFromLinkTarget( $target );
$page = WikiPage::factory( $title );
$page->doEditContent(
ContentHandler::makeContent( __CLASS__, $title ),
$summary,
EDIT_MINOR,
false,
$user
);
}
private function doBotPageEdit( User $user, LinkTarget $target, $summary ) {
$title = Title::newFromLinkTarget( $target );
$page = WikiPage::factory( $title );
$page->doEditContent(
ContentHandler::makeContent( __CLASS__, $title ),
$summary,
EDIT_FORCE_BOT,
false,
$user
);
}
private function doAnonPageEdit( LinkTarget $target, $summary ) {
$title = Title::newFromLinkTarget( $target );
$page = WikiPage::factory( $title );
$page->doEditContent(
ContentHandler::makeContent( __CLASS__, $title ),
$summary,
0,
false,
User::newFromId( 0 )
);
}
private function deletePage( LinkTarget $target, $reason ) {
$title = Title::newFromLinkTarget( $target );
$page = WikiPage::factory( $title );
$page->doDeleteArticleReal( $reason );
}
/**
* Performs a batch of page edits as a specified user
* @param User $user
* @param array $editData associative array, keys:
* - target => LinkTarget page to edit
* - summary => string edit summary
* - minorEdit => bool mark as minor edit if true (defaults to false)
* - botEdit => bool mark as bot edit if true (defaults to false)
*/
private function doPageEdits( User $user, array $editData ) {
foreach ( $editData as $singleEditData ) {
if ( array_key_exists( 'minorEdit', $singleEditData ) && $singleEditData['minorEdit'] ) {
$this->doMinorPageEdit(
$user,
$singleEditData['target'],
$singleEditData['summary']
);
continue;
}
if ( array_key_exists( 'botEdit', $singleEditData ) && $singleEditData['botEdit'] ) {
$this->doBotPageEdit(
$user,
$singleEditData['target'],
$singleEditData['summary']
);
continue;
}
$this->doPageEdit(
$user,
$singleEditData['target'],
$singleEditData['summary']
);
}
}
private function doListRecentChangesRequest( array $params = [] ) {
return $this->doApiRequest(
array_merge(
[ 'action' => 'query', 'list' => 'recentchanges' ],
$params
),
null,
false
);
}
private function doGeneratorRecentChangesRequest( array $params = [] ) {
return $this->doApiRequest(
array_merge(
[ 'action' => 'query', 'generator' => 'recentchanges' ],
$params
)
);
}
private function getItemsFromApiResponse( array $response ) {
return $response[0]['query']['recentchanges'];
}
private function getTitleFormatter() {
return new MediaWikiTitleCodec(
Language::factory( 'en' ),
MediaWikiServices::getInstance()->getGenderCache()
);
}
private function getPrefixedText( LinkTarget $target ) {
$formatter = $this->getTitleFormatter();
return $formatter->getPrefixedText( $target );
}
public function testListRecentChanges_returnsRCInfo() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
$result = $this->doListRecentChangesRequest();
$this->assertArrayHasKey( 'query', $result[0] );
$this->assertArrayHasKey( 'recentchanges', $result[0]['query'] );
$items = $this->getItemsFromApiResponse( $result );
$this->assertCount( 1, $items );
$item = $items[0];
$this->assertArraySubset(
[
'type' => 'new',
'ns' => $target->getNamespace(),
'title' => $this->getPrefixedText( $target ),
],
$item
);
$this->assertArrayNotHasKey( 'bot', $item );
$this->assertArrayNotHasKey( 'new', $item );
$this->assertArrayNotHasKey( 'minor', $item );
$this->assertArrayHasKey( 'pageid', $item );
$this->assertArrayHasKey( 'revid', $item );
$this->assertArrayHasKey( 'old_revid', $item );
}
public function testIdsPropParameter() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'ids', ] );
$items = $this->getItemsFromApiResponse( $result );
$this->assertCount( 1, $items );
$this->assertArrayHasKey( 'pageid', $items[0] );
$this->assertArrayHasKey( 'revid', $items[0] );
$this->assertArrayHasKey( 'old_revid', $items[0] );
$this->assertEquals( 'new', $items[0]['type'] );
}
public function testTitlePropParameter() {
$subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdits(
$this->getLoggedInTestUser(),
[
[
'target' => $subjectTarget,
'summary' => 'Create the page',
],
[
'target' => $talkTarget,
'summary' => 'Create Talk page',
],
]
);
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', ] );
$this->assertEquals(
[
[
'type' => 'new',
'ns' => $talkTarget->getNamespace(),
'title' => $this->getPrefixedText( $talkTarget ),
],
[
'type' => 'new',
'ns' => $subjectTarget->getNamespace(),
'title' => $this->getPrefixedText( $subjectTarget ),
],
],
$this->getItemsFromApiResponse( $result )
);
}
public function testFlagsPropParameter() {
$normalEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$minorEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageM' );
$botEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageB' );
$this->doPageEdits(
$this->getLoggedInTestUser(),
[
[
'target' => $normalEditTarget,
'summary' => 'Create the page',
],
[
'target' => $minorEditTarget,
'summary' => 'Create the page',
],
[
'target' => $minorEditTarget,
'summary' => 'Change content',
'minorEdit' => true,
],
[
'target' => $botEditTarget,
'summary' => 'Create the page with a bot',
'botEdit' => true,
],
]
);
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'flags', ] );
$this->assertEquals(
[
[
'type' => 'new',
'new' => true,
'minor' => false,
'bot' => true,
],
[
'type' => 'edit',
'new' => false,
'minor' => true,
'bot' => false,
],
[
'type' => 'new',
'new' => true,
'minor' => false,
'bot' => false,
],
[
'type' => 'new',
'new' => true,
'minor' => false,
'bot' => false,
],
],
$this->getItemsFromApiResponse( $result )
);
}
public function testUserPropParameter() {
$userEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$anonEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageA' );
$this->doPageEdit( $this->getLoggedInTestUser(), $userEditTarget, 'Create the page' );
$this->doAnonPageEdit( $anonEditTarget, 'Create the page' );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'user', ] );
$this->assertEquals(
[
[
'type' => 'new',
'anon' => true,
'user' => User::newFromId( 0 )->getName(),
],
[
'type' => 'new',
'user' => $this->getLoggedInTestUser()->getName(),
],
],
$this->getItemsFromApiResponse( $result )
);
}
public function testUserIdPropParameter() {
$user = $this->getLoggedInTestUser();
$userEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$anonEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageA' );
$this->doPageEdit( $user, $userEditTarget, 'Create the page' );
$this->doAnonPageEdit( $anonEditTarget, 'Create the page' );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'userid', ] );
$this->assertEquals(
[
[
'type' => 'new',
'anon' => true,
'userid' => 0,
],
[
'type' => 'new',
'userid' => $user->getId(),
],
],
$this->getItemsFromApiResponse( $result )
);
}
public function testCommentPropParameter() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'comment', ] );
$this->assertEquals(
[
[
'type' => 'new',
'comment' => 'Create the <b>page</b>',
],
],
$this->getItemsFromApiResponse( $result )
);
}
public function testParsedCommentPropParameter() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'parsedcomment', ] );
$this->assertEquals(
[
[
'type' => 'new',
'parsedcomment' => 'Create the &lt;b&gt;page&lt;/b&gt;',
],
],
$this->getItemsFromApiResponse( $result )
);
}
public function testTimestampPropParameter() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'timestamp', ] );
$items = $this->getItemsFromApiResponse( $result );
$this->assertCount( 1, $items );
$this->assertArrayHasKey( 'timestamp', $items[0] );
$this->assertInternalType( 'string', $items[0]['timestamp'] );
}
public function testSizesPropParameter() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'sizes', ] );
$this->assertEquals(
[
[
'type' => 'new',
'oldlen' => 0,
'newlen' => 38,
],
],
$this->getItemsFromApiResponse( $result )
);
}
private function createPageAndDeleteIt( LinkTarget $target ) {
$this->doPageEdit( $this->getLoggedInTestUser(),
$target,
'Create the page that will be deleted'
);
$this->deletePage( $target, 'Important Reason' );
}
public function testLoginfoPropParameter() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->createPageAndDeleteIt( $target );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'loginfo', ] );
$items = $this->getItemsFromApiResponse( $result );
$this->assertCount( 1, $items );
$this->assertArraySubset(
[
'type' => 'log',
'logtype' => 'delete',
'logaction' => 'delete',
'logparams' => [],
],
$items[0]
);
$this->assertArrayHasKey( 'logid', $items[0] );
}
public function testEmptyPropParameter() {
$user = $this->getLoggedInTestUser();
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $user, $target, 'Create the page' );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => '', ] );
$this->assertEquals(
[
[
'type' => 'new',
]
],
$this->getItemsFromApiResponse( $result )
);
}
public function testNamespaceParam() {
$subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdits(
$this->getLoggedInTestUser(),
[
[
'target' => $subjectTarget,
'summary' => 'Create the page',
],
[
'target' => $talkTarget,
'summary' => 'Create the talk page',
],
]
);
$result = $this->doListRecentChangesRequest( [ 'rcnamespace' => '0', ] );
$items = $this->getItemsFromApiResponse( $result );
$this->assertCount( 1, $items );
$this->assertArraySubset(
[
'ns' => 0,
'title' => $this->getPrefixedText( $subjectTarget ),
],
$items[0]
);
}
public function testShowAnonParams() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doAnonPageEdit( $target, 'Create the page' );
$resultAnon = $this->doListRecentChangesRequest( [
'rcprop' => 'user',
'rcshow' => WatchedItemQueryService::FILTER_ANON
] );
$resultNotAnon = $this->doListRecentChangesRequest( [
'rcprop' => 'user',
'rcshow' => WatchedItemQueryService::FILTER_NOT_ANON
] );
$items = $this->getItemsFromApiResponse( $resultAnon );
$this->assertCount( 1, $items );
$this->assertArraySubset( [ 'anon' => true ], $items[0] );
$this->assertEmpty( $this->getItemsFromApiResponse( $resultNotAnon ) );
}
public function testNewAndEditTypeParameters() {
$subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdits(
$this->getLoggedInTestUser(),
[
[
'target' => $subjectTarget,
'summary' => 'Create the page',
],
[
'target' => $subjectTarget,
'summary' => 'Change the content',
],
[
'target' => $talkTarget,
'summary' => 'Create Talk page',
],
]
);
$resultNew = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'new' ] );
$resultEdit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'edit' ] );
$this->assertEquals(
[
[
'type' => 'new',
'ns' => $talkTarget->getNamespace(),
'title' => $this->getPrefixedText( $talkTarget ),
],
[
'type' => 'new',
'ns' => $subjectTarget->getNamespace(),
'title' => $this->getPrefixedText( $subjectTarget ),
],
],
$this->getItemsFromApiResponse( $resultNew )
);
$this->assertEquals(
[
[
'type' => 'edit',
'ns' => $subjectTarget->getNamespace(),
'title' => $this->getPrefixedText( $subjectTarget ),
],
],
$this->getItemsFromApiResponse( $resultEdit )
);
}
public function testLogTypeParameters() {
$subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->createPageAndDeleteIt( $subjectTarget );
$this->doPageEdit( $this->getLoggedInTestUser(), $talkTarget, 'Create Talk page' );
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'log' ] );
$this->assertEquals(
[
[
'type' => 'log',
'ns' => $subjectTarget->getNamespace(),
'title' => $this->getPrefixedText( $subjectTarget ),
],
],
$this->getItemsFromApiResponse( $result )
);
}
private function getExternalRC( LinkTarget $target ) {
$title = Title::newFromLinkTarget( $target );
$rc = new RecentChange;
$rc->mTitle = $title;
$rc->mAttribs = [
'rc_timestamp' => wfTimestamp( TS_MW ),
'rc_namespace' => $title->getNamespace(),
'rc_title' => $title->getDBkey(),
'rc_type' => RC_EXTERNAL,
'rc_source' => 'foo',
'rc_minor' => 0,
'rc_cur_id' => $title->getArticleID(),
'rc_user' => 0,
'rc_user_text' => 'm>External User',
'rc_comment' => '',
'rc_comment_text' => '',
'rc_comment_data' => null,
'rc_this_oldid' => $title->getLatestRevID(),
'rc_last_oldid' => $title->getLatestRevID(),
'rc_bot' => 0,
'rc_ip' => '',
'rc_patrolled' => 0,
'rc_new' => 0,
'rc_old_len' => $title->getLength(),
'rc_new_len' => $title->getLength(),
'rc_deleted' => 0,
'rc_logid' => 0,
'rc_log_type' => null,
'rc_log_action' => '',
'rc_params' => '',
];
$rc->mExtra = [
'prefixedDBkey' => $title->getPrefixedDBkey(),
'lastTimestamp' => 0,
'oldSize' => $title->getLength(),
'newSize' => $title->getLength(),
'pageStatus' => 'changed'
];
return $rc;
}
public function testExternalTypeParameters() {
$user = $this->getLoggedInTestUser();
$subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $user, $subjectTarget, 'Create the page' );
$this->doPageEdit( $user, $talkTarget, 'Create Talk page' );
$rc = $this->getExternalRC( $subjectTarget );
$rc->save();
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'external' ] );
$this->assertEquals(
[
[
'type' => 'external',
'ns' => $subjectTarget->getNamespace(),
'title' => $this->getPrefixedText( $subjectTarget ),
],
],
$this->getItemsFromApiResponse( $result )
);
}
public function testCategorizeTypeParameter() {
$user = $this->getLoggedInTestUser();
$subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$categoryTarget = new TitleValue( NS_CATEGORY, 'ApiQueryRecentChangesIntegrationTestCategory' );
$this->doPageEdits(
$user,
[
[
'target' => $categoryTarget,
'summary' => 'Create the category',
],
[
'target' => $subjectTarget,
'summary' => 'Create the page and add it to the category',
],
]
);
$title = Title::newFromLinkTarget( $subjectTarget );
$revision = Revision::newFromTitle( $title );
$rc = RecentChange::newForCategorization(
$revision->getTimestamp(),
Title::newFromLinkTarget( $categoryTarget ),
$user,
$revision->getComment(),
$title,
0,
$revision->getId(),
null,
false
);
$rc->save();
$result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'categorize' ] );
$this->assertEquals(
[
[
'type' => 'categorize',
'ns' => $categoryTarget->getNamespace(),
'title' => $this->getPrefixedText( $categoryTarget ),
],
],
$this->getItemsFromApiResponse( $result )
);
}
public function testLimitParam() {
$target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
$target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
$this->doPageEdits(
$this->getLoggedInTestUser(),
[
[
'target' => $target1,
'summary' => 'Create the page',
],
[
'target' => $target2,
'summary' => 'Create Talk page',
],
[
'target' => $target3,
'summary' => 'Create the page',
],
]
);
$resultWithoutLimit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
$resultWithLimit = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
$this->assertEquals(
[
[
'type' => 'new',
'ns' => $target3->getNamespace(),
'title' => $this->getPrefixedText( $target3 )
],
[
'type' => 'new',
'ns' => $target2->getNamespace(),
'title' => $this->getPrefixedText( $target2 )
],
[
'type' => 'new',
'ns' => $target1->getNamespace(),
'title' => $this->getPrefixedText( $target1 )
],
],
$this->getItemsFromApiResponse( $resultWithoutLimit )
);
$this->assertEquals(
[
[
'type' => 'new',
'ns' => $target3->getNamespace(),
'title' => $this->getPrefixedText( $target3 )
],
[
'type' => 'new',
'ns' => $target2->getNamespace(),
'title' => $this->getPrefixedText( $target2 )
],
],
$this->getItemsFromApiResponse( $resultWithLimit )
);
$this->assertArrayHasKey( 'continue', $resultWithLimit[0] );
$this->assertArrayHasKey( 'rccontinue', $resultWithLimit[0]['continue'] );
}
public function testAllRevParam() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdits(
$this->getLoggedInTestUser(),
[
[
'target' => $target,
'summary' => 'Create the page',
],
[
'target' => $target,
'summary' => 'Change the content',
],
]
);
$resultAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rcallrev' => '', ] );
$resultNoAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
$this->assertEquals(
[
[
'type' => 'edit',
'ns' => $target->getNamespace(),
'title' => $this->getPrefixedText( $target ),
],
[
'type' => 'new',
'ns' => $target->getNamespace(),
'title' => $this->getPrefixedText( $target ),
],
],
$this->getItemsFromApiResponse( $resultNoAllRev )
);
$this->assertEquals(
[
[
'type' => 'edit',
'ns' => $target->getNamespace(),
'title' => $this->getPrefixedText( $target ),
],
[
'type' => 'new',
'ns' => $target->getNamespace(),
'title' => $this->getPrefixedText( $target ),
],
],
$this->getItemsFromApiResponse( $resultAllRev )
);
}
public function testDirParams() {
$subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdits(
$this->getLoggedInTestUser(),
[
[
'target' => $subjectTarget,
'summary' => 'Create the page',
],
[
'target' => $talkTarget,
'summary' => 'Create Talk page',
],
]
);
$resultDirOlder = $this->doListRecentChangesRequest(
[ 'rcdir' => 'older', 'rcprop' => 'title' ]
);
$resultDirNewer = $this->doListRecentChangesRequest(
[ 'rcdir' => 'newer', 'rcprop' => 'title' ]
);
$this->assertEquals(
[
[
'type' => 'new',
'ns' => $talkTarget->getNamespace(),
'title' => $this->getPrefixedText( $talkTarget )
],
[
'type' => 'new',
'ns' => $subjectTarget->getNamespace(),
'title' => $this->getPrefixedText( $subjectTarget )
],
],
$this->getItemsFromApiResponse( $resultDirOlder )
);
$this->assertEquals(
[
[
'type' => 'new',
'ns' => $subjectTarget->getNamespace(),
'title' => $this->getPrefixedText( $subjectTarget )
],
[
'type' => 'new',
'ns' => $talkTarget->getNamespace(),
'title' => $this->getPrefixedText( $talkTarget )
],
],
$this->getItemsFromApiResponse( $resultDirNewer )
);
}
public function testStartEndParams() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
$resultStart = $this->doListRecentChangesRequest( [
'rcstart' => '20010115000000',
'rcdir' => 'newer',
'rcprop' => 'title',
] );
$resultEnd = $this->doListRecentChangesRequest( [
'rcend' => '20010115000000',
'rcdir' => 'newer',
'rcprop' => 'title',
] );
$this->assertEquals(
[
[
'type' => 'new',
'ns' => $target->getNamespace(),
'title' => $this->getPrefixedText( $target ),
]
],
$this->getItemsFromApiResponse( $resultStart )
);
$this->assertEmpty( $this->getItemsFromApiResponse( $resultEnd ) );
}
public function testContinueParam() {
$target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
$target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
$this->doPageEdits(
$this->getLoggedInTestUser(),
[
[
'target' => $target1,
'summary' => 'Create the page',
],
[
'target' => $target2,
'summary' => 'Create Talk page',
],
[
'target' => $target3,
'summary' => 'Create the page',
],
]
);
$firstResult = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
$this->assertArrayHasKey( 'continue', $firstResult[0] );
$this->assertArrayHasKey( 'rccontinue', $firstResult[0]['continue'] );
$continuationParam = $firstResult[0]['continue']['rccontinue'];
$continuedResult = $this->doListRecentChangesRequest(
[ 'rccontinue' => $continuationParam, 'rcprop' => 'title' ]
);
$this->assertEquals(
[
[
'type' => 'new',
'ns' => $target3->getNamespace(),
'title' => $this->getPrefixedText( $target3 ),
],
[
'type' => 'new',
'ns' => $target2->getNamespace(),
'title' => $this->getPrefixedText( $target2 ),
],
],
$this->getItemsFromApiResponse( $firstResult )
);
$this->assertEquals(
[
[
'type' => 'new',
'ns' => $target1->getNamespace(),
'title' => $this->getPrefixedText( $target1 )
]
],
$this->getItemsFromApiResponse( $continuedResult )
);
}
public function testGeneratorRecentChangesPropInfo_returnsRCPages() {
$target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
$this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
$result = $this->doGeneratorRecentChangesRequest( [ 'prop' => 'info' ] );
$this->assertArrayHasKey( 'query', $result[0] );
$this->assertArrayHasKey( 'pages', $result[0]['query'] );
// $result[0]['query']['pages'] uses page ids as keys. Page ids don't matter here, so drop them
$pages = array_values( $result[0]['query']['pages'] );
$this->assertCount( 1, $pages );
$this->assertArraySubset(
[
'ns' => $target->getNamespace(),
'title' => $this->getPrefixedText( $target ),
'new' => true,
],
$pages[0]
);
}
}