Follow-up 9c9cfa2ec3d7: fix non-session entry point error
[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\Handler;
9 use MediaWikiTestCase;
10 use MediaWiki\Rest\EntryPoint;
11 use MediaWiki\Rest\RequestData;
12 use MediaWiki\Rest\ResponseFactory;
13 use MediaWiki\Rest\Router;
14 use WebResponse;
15
16 /**
17 * @covers \MediaWiki\Rest\EntryPoint
18 * @covers \MediaWiki\Rest\Router
19 */
20 class EntryPointTest extends MediaWikiTestCase {
21 private static $mockHandler;
22
23 private function createRouter() {
24 return new Router(
25 [ __DIR__ . '/testRoutes.json' ],
26 [],
27 '/rest',
28 new EmptyBagOStuff(),
29 new ResponseFactory() );
30 }
31
32 private function createWebResponse() {
33 return $this->getMockBuilder( WebResponse::class )
34 ->setMethods( [ 'header' ] )
35 ->getMock();
36 }
37
38 public static function mockHandlerHeader() {
39 return new class extends Handler {
40 public function execute() {
41 $response = $this->getResponseFactory()->create();
42 $response->setHeader( 'Foo', 'Bar' );
43 return $response;
44 }
45 };
46 }
47
48 public function testHeader() {
49 $webResponse = $this->createWebResponse();
50 $webResponse->expects( $this->any() )
51 ->method( 'header' )
52 ->withConsecutive(
53 [ 'HTTP/1.1 200 OK', true, null ],
54 [ 'Foo: Bar', true, null ]
55 );
56
57 $entryPoint = new EntryPoint(
58 new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/header' ) ] ),
59 $webResponse,
60 $this->createRouter() );
61 $entryPoint->execute();
62 $this->assertTrue( true );
63 }
64
65 public static function mockHandlerBodyRewind() {
66 return new class extends Handler {
67 public function execute() {
68 $response = $this->getResponseFactory()->create();
69 $stream = new Stream( fopen( 'php://memory', 'w+' ) );
70 $stream->write( 'hello' );
71 $response->setBody( $stream );
72 return $response;
73 }
74 };
75 }
76
77 /**
78 * Make sure EntryPoint rewinds a seekable body stream before reading.
79 */
80 public function testBodyRewind() {
81 $entryPoint = new EntryPoint(
82 new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/bodyRewind' ) ] ),
83 $this->createWebResponse(),
84 $this->createRouter() );
85 ob_start();
86 $entryPoint->execute();
87 $this->assertSame( 'hello', ob_get_clean() );
88 }
89
90 }