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