259 lines
8.7 KiB
PHP
259 lines
8.7 KiB
PHP
<?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());
|
|
}
|
|
}
|