wiki.techinc.nl/tests/phpunit/unit/includes/Rest/Handler/ContributionsCountHandlerTest.php
DannyS712 91ac8a717d Add UserNameUtils to DummyServicesTrait, and use it
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
2021-07-27 12:17:06 +00:00

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 );
}
}