Allows us to reduce direct mocking in individual tests, or relying on MediaWikiServices, by having a reusable service instead that can be used in unit tests. Make use of it in a few places. This dummy service is also less coupled to individual tests; in the rest handler tests, replacing mocks that report that only a specific string is an ip address with the actual implementation that accepts other ip address, and in BlockUtilsTest use an actually invalid user name instead of making the mock UserNameUtils complain about a perfectly valid name. Change-Id: Iaa3195002ac4ae7e0c9c58ed57c80c02762d4070
145 lines
4.7 KiB
PHP
145 lines
4.7 KiB
PHP
<?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 MediaWiki\Tests\Unit\DummyServicesTrait;
|
|
use MediaWiki\User\UserIdentityValue;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use Wikimedia\Message\MessageValue;
|
|
|
|
/**
|
|
* @covers \MediaWiki\Rest\Handler\ContributionsCountHandler
|
|
*/
|
|
class ContributionsCountHandlerTest extends \MediaWikiUnitTestCase {
|
|
use DummyServicesTrait;
|
|
use HandlerTestTrait;
|
|
|
|
private function newHandler( $numContributions = 5 ) {
|
|
/** @var MockObject|ContributionsLookup $mockContributionsLookup */
|
|
$mockContributionsLookup = $this->createNoOpMock( ContributionsLookup::class,
|
|
[ 'getContributionCount' ]
|
|
);
|
|
$mockContributionsLookup->method( 'getContributionCount' )->willReturn( $numContributions );
|
|
|
|
return new ContributionsCountHandler(
|
|
$mockContributionsLookup,
|
|
$this->getDummyUserNameUtils()
|
|
);
|
|
}
|
|
|
|
public function provideTestThatParametersAreHandledCorrectly() {
|
|
yield [ new RequestData( [] ), 'me' ];
|
|
yield [ new RequestData(
|
|
[ 'queryParams' => [ 'tag' => 'test' ] ]
|
|
), 'me' ];
|
|
yield [ new RequestData(
|
|
[ 'queryParams' => [ 'tag' => null ] ]
|
|
), 'me' ];
|
|
yield [ new RequestData(
|
|
[ 'pathParams' => [ 'user' => 'someUser' ], 'queryParams' => [ 'tag' => '' ] ]
|
|
), 'user' ];
|
|
yield [ new RequestData(
|
|
[ 'pathParams' => [ 'user' => 'someUser' ] ]
|
|
), 'user' ];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideTestThatParametersAreHandledCorrectly
|
|
*/
|
|
public function testThatParametersAreHandledCorrectly( RequestInterface $request, $mode ) {
|
|
$mockContributionsLookup = $this->createNoOpMock( ContributionsLookup::class,
|
|
[ 'getContributionCount' ]
|
|
);
|
|
$username = $request->getPathParams()['user'] ?? null;
|
|
$user = $username ? new UserIdentityValue( 42, $username ) : null;
|
|
|
|
$tag = $request->getQueryParams()['tag'] ?? null;
|
|
$mockContributionsLookup->method( 'getContributionCount' )
|
|
->with( $user, $this->anything(), $tag )
|
|
->willReturn( 123 );
|
|
|
|
$handler = $this->newHandler( 5 );
|
|
$validatedParams = [
|
|
'user' => $user,
|
|
'tag' => $tag ?? null,
|
|
];
|
|
$response = $this->executeHandler( $handler, $request, [ 'mode' => $mode ], [], $validatedParams, [],
|
|
$mode === 'me' ? $this->mockRegisteredUltimateAuthority() : null );
|
|
|
|
$this->assertSame( 200, $response->getStatusCode() );
|
|
}
|
|
|
|
public function testThatAnonymousUserReturns401() {
|
|
$handler = $this->newHandler();
|
|
$request = new RequestData( [] );
|
|
$validatedParams = [ 'user' => null, 'tag' => null ];
|
|
|
|
$this->expectExceptionObject(
|
|
new LocalizedHttpException( new MessageValue( 'rest-permission-denied-anon' ), 401 )
|
|
);
|
|
$this->executeHandler( $handler, $request, [ 'mode' => 'me' ], [], $validatedParams, [],
|
|
$this->mockAnonUltimateAuthority() );
|
|
}
|
|
|
|
public function provideThatResponseConformsToSchema() {
|
|
yield [ 0, [ 'count' => 0 ], [], 'me' ];
|
|
yield [ 3, [ 'count' => 3 ], [], 'me' ];
|
|
yield [ 0, [ 'count' => 0 ], [ 'pathParams' => [ 'user' => 'someName' ] ], 'user' ];
|
|
yield [ 3, [ 'count' => 3 ], [ 'pathParams' => [ 'user' => 'someName' ] ] , 'user' ];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideThatResponseConformsToSchema
|
|
*/
|
|
public function testThatResponseConformsToSchema( $numContributions, $expectedResponse, $config, $mode ) {
|
|
$handler = $this->newHandler( $numContributions );
|
|
$request = new RequestData( $config );
|
|
$username = $request->getPathParams()['user'] ?? null;
|
|
$validatedParams = [
|
|
'user' => $username ? new UserIdentityValue( 42, $username ) : null,
|
|
'tag' => null
|
|
];
|
|
|
|
$response = $this->executeHandlerAndGetBodyData(
|
|
$handler, $request, [ 'mode' => $mode ], [], $validatedParams, [],
|
|
$this->mockRegisteredUltimateAuthority()
|
|
);
|
|
|
|
$this->assertSame( $expectedResponse, $response );
|
|
}
|
|
|
|
public function testThatUnknownUserReturns404() {
|
|
$username = 'UNKNOWN';
|
|
$handler = $this->newHandler();
|
|
$request = new RequestData( [ 'pathParams' => [ 'user' => $username ] ] );
|
|
|
|
$validatedParams = [
|
|
'user' => new UserIdentityValue( 0, $username ),
|
|
'tag' => null
|
|
];
|
|
|
|
$this->expectExceptionObject(
|
|
new LocalizedHttpException( new MessageValue( 'rest-nonexistent-user' ), 404 )
|
|
);
|
|
$this->executeHandler( $handler, $request, [ 'mode' => 'user' ], [], $validatedParams );
|
|
}
|
|
|
|
public function testThatIpUserReturns200() {
|
|
$handler = $this->newHandler();
|
|
$ipAddr = '127.0.0.1';
|
|
$request = new RequestData( [ 'pathParams' => [ 'user' => $ipAddr ] ] );
|
|
$validatedParams = [
|
|
'user' => new UserIdentityValue( 0, $ipAddr ),
|
|
'tag' => null
|
|
];
|
|
|
|
$data = $this->executeHandlerAndGetBodyData( $handler, $request, [ 'mode' => 'user' ], [], $validatedParams );
|
|
$this->assertArrayHasKey( 'count', $data );
|
|
}
|
|
|
|
}
|