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