Merge "Provide command to adjust phpunit.xml for code coverage"
[lhc/web/wiklou.git] / tests / phpunit / includes / Rest / EntryPointTest.php
1 <?php
2
3 namespace MediaWiki\Tests\Rest;
4
5 use EmptyBagOStuff;
6 use GuzzleHttp\Psr7\Uri;
7 use GuzzleHttp\Psr7\Stream;
8 use MediaWiki\Rest\BasicAccess\StaticBasicAuthorizer;
9 use MediaWiki\Rest\Handler;
10 use MediaWiki\Rest\EntryPoint;
11 use MediaWiki\Rest\RequestData;
12 use MediaWiki\Rest\RequestInterface;
13 use MediaWiki\Rest\ResponseFactory;
14 use MediaWiki\Rest\Router;
15 use MediaWiki\Rest\Validator\Validator;
16 use Psr\Container\ContainerInterface;
17 use RequestContext;
18 use WebResponse;
19 use Wikimedia\ObjectFactory;
20 use User;
21
22 /**
23 * @covers \MediaWiki\Rest\EntryPoint
24 * @covers \MediaWiki\Rest\Router
25 */
26 class EntryPointTest extends \MediaWikiTestCase {
27 private static $mockHandler;
28
29 private function createRouter( RequestInterface $request ) {
30 global $IP;
31
32 $objectFactory = new ObjectFactory(
33 $this->getMockForAbstractClass( ContainerInterface::class )
34 );
35
36 return new Router(
37 [ "$IP/tests/phpunit/unit/includes/Rest/testRoutes.json" ],
38 [],
39 '/rest',
40 new EmptyBagOStuff(),
41 new ResponseFactory(),
42 new StaticBasicAuthorizer(),
43 $objectFactory,
44 new Validator( $objectFactory, $request, new User )
45 );
46 }
47
48 private function createWebResponse() {
49 return $this->getMockBuilder( WebResponse::class )
50 ->setMethods( [ 'header' ] )
51 ->getMock();
52 }
53
54 public static function mockHandlerHeader() {
55 return new class extends Handler {
56 public function execute() {
57 $response = $this->getResponseFactory()->create();
58 $response->setHeader( 'Foo', 'Bar' );
59 return $response;
60 }
61 };
62 }
63
64 public function testHeader() {
65 $webResponse = $this->createWebResponse();
66 $webResponse->expects( $this->any() )
67 ->method( 'header' )
68 ->withConsecutive(
69 [ 'HTTP/1.1 200 OK', true, null ],
70 [ 'Foo: Bar', true, null ]
71 );
72
73 $request = new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/header' ) ] );
74 $entryPoint = new EntryPoint(
75 RequestContext::getMain(),
76 $request,
77 $webResponse,
78 $this->createRouter( $request ) );
79 $entryPoint->execute();
80 $this->assertTrue( true );
81 }
82
83 public static function mockHandlerBodyRewind() {
84 return new class extends Handler {
85 public function execute() {
86 $response = $this->getResponseFactory()->create();
87 $stream = new Stream( fopen( 'php://memory', 'w+' ) );
88 $stream->write( 'hello' );
89 $response->setBody( $stream );
90 return $response;
91 }
92 };
93 }
94
95 /**
96 * Make sure EntryPoint rewinds a seekable body stream before reading.
97 */
98 public function testBodyRewind() {
99 $request = new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/bodyRewind' ) ] );
100 $entryPoint = new EntryPoint(
101 RequestContext::getMain(),
102 $request,
103 $this->createWebResponse(),
104 $this->createRouter( $request ) );
105 ob_start();
106 $entryPoint->execute();
107 $this->assertSame( 'hello', ob_get_clean() );
108 }
109
110 }