File: ContributionsCountHandlerTest.php

package info (click to toggle)
mediawiki 1%3A1.35.13-1%2Bdeb11u2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 274,932 kB
  • sloc: php: 677,563; javascript: 572,709; sql: 11,565; python: 4,447; xml: 3,145; sh: 892; perl: 788; ruby: 496; pascal: 365; makefile: 128
file content (112 lines) | stat: -rw-r--r-- 3,681 bytes parent folder | download
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: