| <?php |
|
|
| use JsonRPC\Exception\AccessDeniedException; |
| use JsonRPC\Exception\AuthenticationFailureException; |
| use JsonRPC\Exception\ResponseException; |
| use JsonRPC\MiddlewareInterface; |
| use JsonRPC\Response\HeaderMockTest; |
| use JsonRPC\Server; |
|
|
| require_once __DIR__.'/../../../vendor/autoload.php'; |
| require_once __DIR__.'/Response/HeaderMockTest.php'; |
|
|
| class MyException extends Exception |
| { |
|
|
| } |
|
|
| class DummyMiddleware implements MiddlewareInterface |
| { |
| public function execute($username, $password, $procedureName) |
| { |
| throw new AuthenticationFailureException('Bad user'); |
| } |
| } |
|
|
| class ServerTest extends HeaderMockTest |
| { |
| private $payload = '{"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"}'; |
|
|
| public function testCustomAuthenticationHeader() |
| { |
| $env = array( |
| 'HTTP_X_AUTH' => base64_encode('myuser:mypassword'), |
| ); |
|
|
| $server = new Server($this->payload, $env); |
| $server->setAuthenticationHeader('X-Auth'); |
| $this->assertEquals('myuser', $server->getUsername()); |
| $this->assertEquals('mypassword', $server->getPassword()); |
| } |
|
|
| public function testCustomAuthenticationHeaderWithEmptyValue() |
| { |
| $server = new Server($this->payload); |
| $server->setAuthenticationHeader('X-Auth'); |
| $this->assertNull($server->getUsername()); |
| $this->assertNull($server->getPassword()); |
| } |
|
|
| public function testGetUsername() |
| { |
| $server = new Server($this->payload); |
| $this->assertNull($server->getUsername()); |
|
|
| $server = new Server($this->payload, array('PHP_AUTH_USER' => 'username')); |
| $this->assertEquals('username', $server->getUsername()); |
| } |
|
|
| public function testGetPassword() |
| { |
| $server = new Server($this->payload); |
| $this->assertNull($server->getPassword()); |
|
|
| $server = new Server($this->payload, array('PHP_AUTH_PW' => 'password')); |
| $this->assertEquals('password', $server->getPassword()); |
| } |
|
|
| public function testExecute() |
| { |
| $server = new Server($this->payload); |
| $server->getProcedureHandler()->withCallback('sum', function($a, $b, $c) { |
| return $a + $b + $c; |
| }); |
|
|
| self::$functions |
| ->expects($this->once()) |
| ->method('header') |
| ->with('Content-Type: application/json'); |
|
|
| $this->assertEquals('{"jsonrpc":"2.0","result":7,"id":"1"}', $server->execute()); |
| } |
|
|
| public function testExecuteRequestParserOverride() |
| { |
| $requestParser = $this->getMockBuilder('JsonRPC\Request\RequestParser') |
| ->getMock(); |
|
|
| $requestParser->method('withPayload')->willReturn($requestParser); |
| $requestParser->method('withProcedureHandler')->willReturn($requestParser); |
| $requestParser->method('withMiddlewareHandler')->willReturn($requestParser); |
| $requestParser->method('withLocalException')->willReturn($requestParser); |
|
|
| $server = new Server($this->payload, array(), null, $requestParser); |
|
|
| $requestParser->expects($this->once()) |
| ->method('parse'); |
|
|
| $server->execute(); |
| } |
|
|
| public function testExecuteBatchRequestParserOverride() |
| { |
| $batchRequestParser = $this->getMockBuilder('JsonRPC\Request\BatchRequestParser') |
| ->getMock(); |
|
|
| $batchRequestParser->method('withPayload')->willReturn($batchRequestParser); |
| $batchRequestParser->method('withProcedureHandler')->willReturn($batchRequestParser); |
| $batchRequestParser->method('withMiddlewareHandler')->willReturn($batchRequestParser); |
| $batchRequestParser->method('withLocalException')->willReturn($batchRequestParser); |
|
|
| $server = new Server('["...", "..."]', array(), null, null, $batchRequestParser); |
|
|
| $batchRequestParser->expects($this->once()) |
| ->method('parse'); |
|
|
| $server->execute(); |
| } |
|
|
| public function testExecuteResponseBuilderOverride() |
| { |
| $responseBuilder = $this->getMockBuilder('JsonRPC\Response\ResponseBuilder') |
| ->getMock(); |
|
|
| $responseBuilder->expects($this->once()) |
| ->method('sendHeaders'); |
|
|
| $server = new Server($this->payload, array(), $responseBuilder); |
| $server->execute(); |
| } |
|
|
| public function testExecuteProcedureHandlerOverride() |
| { |
| $batchRequestParser = $this->getMockBuilder('JsonRPC\Request\BatchRequestParser') |
| ->getMock(); |
|
|
| $procedureHandler = $this->getMockBuilder('JsonRPC\ProcedureHandler') |
| ->getMock(); |
|
|
| $batchRequestParser->method('withPayload')->willReturn($batchRequestParser); |
| $batchRequestParser->method('withProcedureHandler')->willReturn($batchRequestParser); |
| $batchRequestParser->method('withMiddlewareHandler')->willReturn($batchRequestParser); |
| $batchRequestParser->method('withLocalException')->willReturn($batchRequestParser); |
|
|
| $server = new Server('["...", "..."]', array(), null, null, $batchRequestParser, $procedureHandler); |
|
|
| $batchRequestParser->expects($this->once()) |
| ->method('parse'); |
|
|
| $batchRequestParser->expects($this->once()) |
| ->method('withProcedureHandler') |
| ->with($this->identicalTo($procedureHandler)); |
|
|
| $server->execute(); |
| } |
|
|
| public function testWhenCallbackRaiseForbiddenException() |
| { |
| $server = new Server($this->payload); |
| $server->getProcedureHandler()->withCallback('sum', function($a, $b, $c) { |
| throw new AccessDeniedException(); |
| }); |
|
|
| self::$functions |
| ->expects($this->at(0)) |
| ->method('header') |
| ->with('HTTP/1.0 403 Forbidden'); |
|
|
| self::$functions |
| ->expects($this->at(1)) |
| ->method('header') |
| ->with('Content-Type: application/json'); |
|
|
| $this->assertEquals('{"jsonrpc":"2.0","error":{"code":403,"message":"Forbidden"},"id":null}', $server->execute()); |
| } |
|
|
| public function testWhenCallbackRaiseUnauthorizedException() |
| { |
| $server = new Server($this->payload); |
| $server->getProcedureHandler()->withCallback('sum', function($a, $b, $c) { |
| throw new AuthenticationFailureException(); |
| }); |
|
|
| self::$functions |
| ->expects($this->at(0)) |
| ->method('header') |
| ->with('HTTP/1.0 401 Unauthorized'); |
|
|
| self::$functions |
| ->expects($this->at(1)) |
| ->method('header') |
| ->with('Content-Type: application/json'); |
|
|
| $this->assertEquals('{"jsonrpc":"2.0","error":{"code":401,"message":"Unauthorized"},"id":null}', $server->execute()); |
| } |
|
|
| public function testWhenMiddlewareRaiseUnauthorizedException() |
| { |
| $server = new Server($this->payload); |
| $server->getMiddlewareHandler()->withMiddleware(new DummyMiddleware()); |
| $server->getProcedureHandler()->withCallback('sum', function($a, $b) { |
| return $a + $b; |
| }); |
|
|
| self::$functions |
| ->expects($this->at(0)) |
| ->method('header') |
| ->with('HTTP/1.0 401 Unauthorized'); |
|
|
| self::$functions |
| ->expects($this->at(1)) |
| ->method('header') |
| ->with('Content-Type: application/json'); |
|
|
| $this->assertEquals('{"jsonrpc":"2.0","error":{"code":401,"message":"Unauthorized"},"id":null}', $server->execute()); |
| } |
|
|
| public function testFilterRelayExceptions() |
| { |
| $server = new Server($this->payload); |
| $server->withLocalException('MyException'); |
| $server->getProcedureHandler()->withCallback('sum', function($a, $b, $c) { |
| throw new MyException('test'); |
| }); |
|
|
| $this->expectException('MyException'); |
| $server->execute(); |
| } |
|
|
| public function testCustomExceptionAreRelayedToClient() |
| { |
| $server = new Server($this->payload); |
| $server->getProcedureHandler()->withCallback('sum', function($a, $b, $c) { |
| throw new MyException('test'); |
| }); |
|
|
| self::$functions |
| ->expects($this->once()) |
| ->method('header') |
| ->with('Content-Type: application/json'); |
|
|
| $this->assertEquals('{"jsonrpc":"2.0","error":{"code":0,"message":"test"},"id":"1"}', $server->execute()); |
| } |
|
|
| public function testCustomResponseException() |
| { |
| $server = new Server($this->payload); |
| $server->getProcedureHandler()->withCallback('sum', function($a, $b, $c) { |
| throw new ResponseException('test', 123, null, 'more info'); |
| }); |
|
|
| self::$functions |
| ->expects($this->once()) |
| ->method('header') |
| ->with('Content-Type: application/json'); |
|
|
| $this->assertEquals('{"jsonrpc":"2.0","error":{"code":123,"message":"test","data":"more info"},"id":"1"}', $server->execute()); |
| } |
| } |
|
|