1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
<?php
namespace MediaWiki\Tests\Rest\Handler;
use MediaWiki\Rest\Handler\ContributionsCountHandler;
use MediaWiki\Rest\LocalizedHttpException;
use MediaWiki\Rest\RequestData;
use MediaWiki\Rest\RequestInterface;
use MediaWiki\Revision\ContributionsLookup;
use PHPUnit\Framework\MockObject\MockObject;
use RequestContext;
use User;
use Wikimedia\Message\MessageValue;
/**
* @covers \MediaWiki\Rest\Handler\ContributionsCountHandler
*/
class ContributionsCountHandlerTest extends \MediaWikiUnitTestCase {
use HandlerTestTrait;
private function newHandler( $numRevisions = 5 ) {
/** @var MockObject|ContributionsLookup $mockContributionsLookup */
$mockContributionsLookup = $this->createNoOpMock( ContributionsLookup::class,
[ 'getContributionCount' ]
);
$mockContributionsLookup->method( 'getContributionCount' )->willReturn( $numRevisions );
$handler = new ContributionsCountHandler( $mockContributionsLookup );
return $handler;
}
public function provideTestThatParametersAreHandledCorrectly() {
yield [ new RequestData( [] ) ];
yield [ new RequestData(
[ 'queryParams' => [ 'tag' => 'test' ] ]
) ];
yield [ new RequestData(
[ 'queryParams' => [ 'tag' => null ] ]
) ];
yield [ new RequestData(
[ 'queryParams' => [ 'tag' => '' ] ]
) ];
}
/**
* @param RequestInterface $request
* @dataProvider provideTestThatParametersAreHandledCorrectly
*/
public function testThatParametersAreHandledCorrectly( RequestInterface $request ) {
$mockContributionsLookup = $this->createNoOpMock( ContributionsLookup::class,
[ 'getContributionCount' ]
);
$user = $this->makeMockUser( false );
RequestContext::getMain()->setUser( $user );
$tag = $request->getQueryParams()['tag'] ?? null;
$mockContributionsLookup->method( 'getContributionCount' )
->with( $user, $user, $tag )
->willReturn( 123 );
$handler = new ContributionsCountHandler( $mockContributionsLookup );
$response = $this->executeHandler( $handler, $request );
$this->assertSame( 200, $response->getStatusCode() );
}
public function testThatAnonymousUserReturns401() {
$handler = $this->newHandler();
$request = new RequestData( [] );
RequestContext::getMain()->setUser( new User() );
$this->expectExceptionObject(
new LocalizedHttpException( new MessageValue( 'rest-permission-denied-anon' ), 401 )
);
$response = $this->executeHandler( $handler, $request );
$this->assertSame( 401, $response->getStatusCode() );
}
private function makeMockUser( $anon = false ) {
$user = $this->createNoOpMock( User::class, [ 'isAnon' ] );
$user->method( 'isAnon' )->willReturn( $anon );
return $user;
}
public function provideThatResponseConformsToSchema() {
$basePath = 'https://wiki.example.com/rest/coredev/v0/me/contributions/count';
yield [ 0, [ 'count' => 0 ] ];
yield [ 3, [ 'count' => 3 ] ];
}
/**
* @dataProvider provideThatResponseConformsToSchema
*/
public function testThatResponseConformsToSchema( $numRevisions, $expectedResponse ) {
$handler = $this->newHandler( $numRevisions );
$request = new RequestData( [] );
$user = $this->makeMockUser();
RequestContext::getMain()->setUser( $user );
$response = $this->executeHandlerAndGetBodyData( $handler, $request );
$this->assertSame( $expectedResponse, $response );
}
}
// Returns a list of page revisions by the current logged-in user
// There is a stable chronological order allowing the client to request
// the next or previous segments such that the client will eventually receive all contributions
// Returned list must segmented based on a LIMIT
// Response object must be JSON
// Response object must contain the following fields:
|