|
<?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()); |
|
} |
|
} |
|
|