3 namespace MediaWiki\Tests\Rest
;
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
;
19 use Wikimedia\ObjectFactory
;
23 * @covers \MediaWiki\Rest\EntryPoint
24 * @covers \MediaWiki\Rest\Router
26 class EntryPointTest
extends \MediaWikiTestCase
{
27 private static $mockHandler;
29 private function createRouter( RequestInterface
$request ) {
32 $objectFactory = new ObjectFactory(
33 $this->getMockForAbstractClass( ContainerInterface
::class )
37 [ "$IP/tests/phpunit/unit/includes/Rest/testRoutes.json" ],
41 new ResponseFactory(),
42 new StaticBasicAuthorizer(),
44 new Validator( $objectFactory, $request, new User
)
48 private function createWebResponse() {
49 return $this->getMockBuilder( WebResponse
::class )
50 ->setMethods( [ 'header' ] )
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' );
64 public function testHeader() {
65 $webResponse = $this->createWebResponse();
66 $webResponse->expects( $this->any() )
69 [ 'HTTP/1.1 200 OK', true, null ],
70 [ 'Foo: Bar', true, null ]
73 $request = new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/header' ) ] );
74 $entryPoint = new EntryPoint(
75 RequestContext
::getMain(),
78 $this->createRouter( $request ) );
79 $entryPoint->execute();
80 $this->assertTrue( true );
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 );
96 * Make sure EntryPoint rewinds a seekable body stream before reading.
98 public function testBodyRewind() {
99 $request = new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/bodyRewind' ) ] );
100 $entryPoint = new EntryPoint(
101 RequestContext
::getMain(),
103 $this->createWebResponse(),
104 $this->createRouter( $request ) );
106 $entryPoint->execute();
107 $this->assertSame( 'hello', ob_get_clean() );