3 namespace MediaWiki\Tests\Rest
;
5 use GuzzleHttp\Psr7\Uri
;
6 use MediaWiki\Rest\BasicAccess\StaticBasicAuthorizer
;
7 use MediaWiki\Rest\Handler
;
8 use MediaWiki\Rest\HttpException
;
9 use MediaWiki\Rest\RequestData
;
10 use MediaWiki\Rest\RequestInterface
;
11 use MediaWiki\Rest\ResponseFactory
;
12 use MediaWiki\Rest\Router
;
13 use MediaWiki\Rest\Validator\Validator
;
14 use Psr\Container\ContainerInterface
;
15 use Wikimedia\ObjectFactory
;
19 * @covers \MediaWiki\Rest\Router
21 class RouterTest
extends \MediaWikiUnitTestCase
{
23 private function createRouter( RequestInterface
$request, $authError = null ) {
24 $objectFactory = new ObjectFactory(
25 $this->getMockForAbstractClass( ContainerInterface
::class )
28 [ __DIR__
. '/testRoutes.json' ],
31 new \
EmptyBagOStuff(),
32 new ResponseFactory( [] ),
33 new StaticBasicAuthorizer( $authError ),
35 new Validator( $objectFactory, $request, new User
)
39 public function testPrefixMismatch() {
40 $request = new RequestData( [ 'uri' => new Uri( '/bogus' ) ] );
41 $router = $this->createRouter( $request );
42 $response = $router->execute( $request );
43 $this->assertSame( 404, $response->getStatusCode() );
46 public function testWrongMethod() {
47 $request = new RequestData( [
48 'uri' => new Uri( '/rest/user/joe/hello' ),
51 $router = $this->createRouter( $request );
52 $response = $router->execute( $request );
53 $this->assertSame( 405, $response->getStatusCode() );
54 $this->assertSame( 'Method Not Allowed', $response->getReasonPhrase() );
55 $this->assertSame( 'GET', $response->getHeaderLine( 'Allow' ) );
58 public function testHeadToGet() {
59 $request = new RequestData( [
60 'uri' => new Uri( '/rest/user/joe/hello' ),
63 $router = $this->createRouter( $request );
64 $response = $router->execute( $request );
65 $this->assertSame( 200, $response->getStatusCode() );
68 public function testNoMatch() {
69 $request = new RequestData( [ 'uri' => new Uri( '/rest/bogus' ) ] );
70 $router = $this->createRouter( $request );
71 $response = $router->execute( $request );
72 $this->assertSame( 404, $response->getStatusCode() );
73 // TODO: add more information to the response body and test for its presence here
76 public static function throwHandlerFactory() {
77 return new class extends Handler
{
78 public function execute() {
79 throw new HttpException( 'Mock error', 555 );
84 public function testException() {
85 $request = new RequestData( [ 'uri' => new Uri( '/rest/mock/RouterTest/throw' ) ] );
86 $router = $this->createRouter( $request );
87 $response = $router->execute( $request );
88 $this->assertSame( 555, $response->getStatusCode() );
89 $body = $response->getBody();
91 $data = json_decode( $body->getContents(), true );
92 $this->assertSame( 'Mock error', $data['message'] );
95 public function testBasicAccess() {
96 // Using the throwing handler is a way to assert that the handler is not executed
97 $request = new RequestData( [ 'uri' => new Uri( '/rest/mock/RouterTest/throw' ) ] );
98 $router = $this->createRouter( $request, 'test-error' );
99 $response = $router->execute( $request );
100 $this->assertSame( 403, $response->getStatusCode() );
101 $body = $response->getBody();
103 $data = json_decode( $body->getContents(), true );
104 $this->assertSame( 'test-error', $data['error'] );