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