Merge "Title: Title::getSubpage should not lose the interwiki prefix"
[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\BasicAccess\StaticBasicAuthorizer;
9 use MediaWiki\Rest\Handler;
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 \MediaWikiUnitTestCase {
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 new StaticBasicAuthorizer() );
31 }
32
33 private function createWebResponse() {
34 return $this->getMockBuilder( WebResponse::class )
35 ->setMethods( [ 'header' ] )
36 ->getMock();
37 }
38
39 public static function mockHandlerHeader() {
40 return new class extends Handler {
41 public function execute() {
42 $response = $this->getResponseFactory()->create();
43 $response->setHeader( 'Foo', 'Bar' );
44 return $response;
45 }
46 };
47 }
48
49 public function testHeader() {
50 $webResponse = $this->createWebResponse();
51 $webResponse->expects( $this->any() )
52 ->method( 'header' )
53 ->withConsecutive(
54 [ 'HTTP/1.1 200 OK', true, null ],
55 [ 'Foo: Bar', true, null ]
56 );
57
58 $entryPoint = new EntryPoint(
59 new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/header' ) ] ),
60 $webResponse,
61 $this->createRouter() );
62 $entryPoint->execute();
63 $this->assertTrue( true );
64 }
65
66 public static function mockHandlerBodyRewind() {
67 return new class extends Handler {
68 public function execute() {
69 $response = $this->getResponseFactory()->create();
70 $stream = new Stream( fopen( 'php://memory', 'w+' ) );
71 $stream->write( 'hello' );
72 $response->setBody( $stream );
73 return $response;
74 }
75 };
76 }
77
78 /**
79 * Make sure EntryPoint rewinds a seekable body stream before reading.
80 */
81 public function testBodyRewind() {
82 $entryPoint = new EntryPoint(
83 new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/bodyRewind' ) ] ),
84 $this->createWebResponse(),
85 $this->createRouter() );
86 ob_start();
87 $entryPoint->execute();
88 $this->assertSame( 'hello', ob_get_clean() );
89 }
90
91 }