File: ActionModuleBasedHandlerTestTrait.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 (109 lines) | stat: -rw-r--r-- 3,205 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
<?php

namespace MediaWiki\Tests\Rest\Handler;

use ApiBase;
use ApiMain;
use Exception;
use FauxRequest;
use MediaWiki\Session\Session;
use MediaWiki\Session\SessionId;
use MediaWiki\Session\SessionProviderInterface;
use PHPUnit\Framework\MockObject\MockBuilder;
use PHPUnit\Framework\MockObject\MockObject;
use RequestContext;

/**
 * A trait providing utility functions for testing Handler classes
 * derived from ActionModuleBasedHandler.
 * This trait is intended to be used on subclasses of MediaWikiUnitTestCase
 * or MediaWikiIntegrationTestCase.
 *
 * @package MediaWiki\Tests\Rest\Handler
 */
trait ActionModuleBasedHandlerTestTrait {

	use HandlerTestTrait;

	/**
	 * Expected to be provided by the class, probably inherited from TestCase.
	 *
	 * @param string $className
	 *
	 * @return MockBuilder
	 */
	abstract protected function getMockBuilder( $className ): MockBuilder;

	/**
	 * @param ApiMain $main
	 * @param string $name
	 * @param array $resultData
	 * @param Exception|null $throwException
	 *
	 * @return ApiBase|MockObject
	 */
	private function getDummyApiModule(
		ApiMain $main,
		$name,
		$resultData,
		Exception $throwException = null
	) {
		/** @var ApiBase|MockObject $module */
		$module = $this->getMockBuilder( ApiBase::class )
			->setConstructorArgs( [ $main, $name ] )
			->onlyMethods( [ 'execute' ] )
			->getMock();

		$module->method( 'execute' )
			->willReturnCallback(
				function () use ( $module, $resultData, $throwException ) {
					if ( $throwException ) {
						throw $throwException;
					}

					$res = $module->getResult();
					foreach ( $resultData as $key => $value ) {
						$res->addValue( null, $key, $value );
					}
				}
			);

		return $module;
	}

	/**
	 * @return ApiMain
	 */
	private function getApiMain( $csrfSafe = false ) {
		/** @var SessionProviderInterface|MockObject $session */
		$sessionProvider =
			$this->createNoOpMock( SessionProviderInterface::class, [ 'safeAgainstCsrf' ] );
		$sessionProvider->method( 'safeAgainstCsrf' )->willReturn( $csrfSafe );

		/** @var Session|MockObject $session */
		$session = $this->createNoOpMock( Session::class, [ 'getSessionId', 'getProvider' ] );
		$session->method( 'getSessionId' )->willReturn( new SessionId( 'test' ) );
		$session->method( 'getProvider' )->willReturn( $sessionProvider );

		// NOTE: This being a FauxRequest instance triggers special case behavior
		// in ApiMain, causing ApiMain::isInternalMode() to return true. Among other things,
		// this causes ApiMain to throw errors rather than encode them in the result data.
		/** @var MockObject|FauxRequest $fauxRequest */
		$fauxRequest = $this->getMockBuilder( FauxRequest::class )
			->onlyMethods( [ 'getSession', 'getSessionId' ] )
			->getMock();
		$fauxRequest->method( 'getSession' )->willReturn( $session );
		$fauxRequest->method( 'getSessionId' )->willReturn( $session->getSessionId() );

		$testContext = RequestContext::getMain();

		$fauxContext = new RequestContext();
		$fauxContext->setRequest( $fauxRequest );
		$fauxContext->setUser( $testContext->getUser() );
		$fauxContext->setLanguage( $testContext->getLanguage() );

		$apiMain = new ApiMain( $fauxContext, true );
		return $apiMain;
	}

}