Kanboard-Prod/libs/jsonrpc/tests/HttpClientTest.php

221 lines
7.1 KiB
PHP

<?php
namespace JsonRPC;
require_once __DIR__.'/../../../vendor/autoload.php';
defined('CURLOPT_URL') or define('CURLOPT_URL', 10002);
defined('CURLOPT_RETURNTRANSFER') or define('CURLOPT_RETURNTRANSFER', 19913);
defined('CURLOPT_CONNECTTIMEOUT') or define('CURLOPT_CONNECTTIMEOUT', 78);
defined('CURLOPT_MAXREDIRS') or define('CURLOPT_MAXREDIRS', 68);
defined('CURLOPT_SSL_VERIFYPEER') or define('CURLOPT_SSL_VERIFYPEER', 64);
defined('CURLOPT_POST') or define('CURLOPT_POST', 47);
defined('CURLOPT_POSTFIELDS') or define('CURLOPT_POSTFIELDS', 10015);
defined('CURLOPT_HTTPHEADER') or define('CURLOPT_HTTPHEADER', 10023);
defined('CURLOPT_HEADERFUNCTION') or define('CURLOPT_HEADERFUNCTION', 20079);
defined('CURLOPT_CAINFO') or define('CURLOPT_CAINFO', 10065);
function extension_loaded($extension) {
return HttpClientTest::$functions->extension_loaded($extension);
}
function fopen($url, $mode, $use_include_path, $context)
{
return HttpClientTest::$functions->fopen($url, $mode, $use_include_path, $context);
}
function stream_context_create(array $params)
{
return HttpClientTest::$functions->stream_context_create($params);
}
function curl_init() {
return HttpClientTest::$functions->curl_init();
}
function curl_setopt_array($ch, array $params) {
HttpClientTest::$functions->curl_setopt_array($ch, $params);
}
function curl_setopt($ch, $option, $value) {
HttpClientTest::$functions->curl_setopt($ch, $option, $value);
}
function curl_exec($ch) {
return HttpClientTest::$functions->curl_exec($ch);
}
function curl_close($ch) {
HttpClientTest::$functions->curl_close($ch);
}
class HttpClientTest extends \PHPUnit_Framework_TestCase
{
public static $functions;
public function setUp()
{
self::$functions = $this
->getMockBuilder('stdClass')
->setMethods(array('extension_loaded', 'fopen', 'stream_context_create',
'curl_init', 'curl_setopt_array', 'curl_setopt', 'curl_exec', 'curl_close'))
->getMock();
}
public function testWithServerError()
{
$this->setExpectedException('\JsonRPC\Exception\ServerErrorException');
$httpClient = new HttpClient();
$httpClient->handleExceptions(array(
'HTTP/1.0 301 Moved Permanently',
'Connection: close',
'HTTP/1.1 500 Internal Server Error',
));
}
public function testWithConnectionFailure()
{
$this->setExpectedException('\JsonRPC\Exception\ConnectionFailureException');
$httpClient = new HttpClient();
$httpClient->handleExceptions(array(
'HTTP/1.1 404 Not Found',
));
}
public function testWithAccessForbidden()
{
$this->setExpectedException('\JsonRPC\Exception\AccessDeniedException');
$httpClient = new HttpClient();
$httpClient->handleExceptions(array(
'HTTP/1.1 403 Forbidden',
));
}
public function testWithAccessNotAllowed()
{
$this->setExpectedException('\JsonRPC\Exception\AccessDeniedException');
$httpClient = new HttpClient();
$httpClient->handleExceptions(array(
'HTTP/1.0 401 Unauthorized',
));
}
public function testWithCallback()
{
self::$functions
->expects($this->at(0))
->method('extension_loaded')
->with('curl')
->will($this->returnValue(false));
self::$functions
->expects($this->at(1))
->method('stream_context_create')
->with(array(
'http' => array(
'method' => 'POST',
'protocol_version' => 1.1,
'timeout' => 5,
'max_redirects' => 2,
'header' => implode("\r\n", array(
'User-Agent: JSON-RPC PHP Client <https://github.com/fguillot/JsonRPC>',
'Content-Type: application/json',
'Accept: application/json',
'Connection: close',
'Content-Length: 4',
)),
'content' => 'test',
'ignore_errors' => true,
),
'ssl' => array(
'verify_peer' => true,
'verify_peer_name' => true,
)
))
->will($this->returnValue('context'));
self::$functions
->expects($this->at(2))
->method('fopen')
->with('url', 'r', false, 'context')
->will($this->returnValue(false));
$httpClient = new HttpClient('url');
$httpClient->withBeforeRequestCallback(function(HttpClient $client, $payload) {
$client->withHeaders(array('Content-Length: '.strlen($payload)));
});
$this->setExpectedException('\JsonRPC\Exception\ConnectionFailureException');
$httpClient->execute('test');
}
public function testWithCurl()
{
self::$functions
->expects($this->at(0))
->method('extension_loaded')
->with('curl')
->will($this->returnValue(true));
self::$functions
->expects($this->at(1))
->method('curl_init')
->will($this->returnValue('curl'));
self::$functions
->expects($this->at(2))
->method('curl_setopt_array')
->with('curl', array(
CURLOPT_URL => 'url',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_MAXREDIRS => 2,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => 'test',
CURLOPT_HTTPHEADER => array(
'User-Agent: JSON-RPC PHP Client <https://github.com/fguillot/JsonRPC>',
'Content-Type: application/json',
'Accept: application/json',
'Connection: close',
'Content-Length: 4',
),
CURLOPT_HEADERFUNCTION => function ($curl, $header) use (&$headers) {
$headers[] = $header;
return strlen($header);
}
));
self::$functions
->expects($this->at(3))
->method('curl_setopt')
->with('curl', CURLOPT_CAINFO, 'test.crt');
self::$functions
->expects($this->at(4))
->method('curl_exec')
->with('curl')
->will($this->returnValue(false));
self::$functions
->expects($this->at(5))
->method('curl_close')
->with('curl');
$httpClient = new HttpClient('url');
$httpClient
->withSslLocalCert('test.crt')
->withBeforeRequestCallback(function(HttpClient $client, $payload) {
$client->withHeaders(array('Content-Length: '.strlen($payload)));
});
$this->setExpectedException('\JsonRPC\Exception\ConnectionFailureException');
$httpClient->execute('test');
}
}