scratch

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 86  →  ?path2? @ 87
/vendor/guzzlehttp/guzzle/tests/ClientTest.php
@@ -0,0 +1,460 @@
<?php
 
namespace GuzzleHttp\Tests;
 
use GuzzleHttp\Adapter\FakeParallelAdapter;
use GuzzleHttp\Adapter\MockAdapter;
use GuzzleHttp\Client;
use GuzzleHttp\Event\BeforeEvent;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Message\MessageFactory;
use GuzzleHttp\Message\Response;
use GuzzleHttp\Subscriber\History;
use GuzzleHttp\Subscriber\Mock;
 
/**
* @covers GuzzleHttp\Client
*/
class ClientTest extends \PHPUnit_Framework_TestCase
{
public function testProvidesDefaultUserAgent()
{
$this->assertEquals(1, preg_match('#^Guzzle/.+ curl/.+ PHP/.+$#', Client::getDefaultUserAgent()));
}
 
public function testUsesDefaultDefaultOptions()
{
$client = new Client();
$this->assertTrue($client->getDefaultOption('allow_redirects'));
$this->assertTrue($client->getDefaultOption('exceptions'));
$this->assertContains('cacert.pem', $client->getDefaultOption('verify'));
}
 
public function testUsesProvidedDefaultOptions()
{
$client = new Client([
'defaults' => [
'allow_redirects' => false,
'query' => ['foo' => 'bar']
]
]);
$this->assertFalse($client->getDefaultOption('allow_redirects'));
$this->assertTrue($client->getDefaultOption('exceptions'));
$this->assertContains('cacert.pem', $client->getDefaultOption('verify'));
$this->assertEquals(['foo' => 'bar'], $client->getDefaultOption('query'));
}
 
public function testCanSpecifyBaseUrl()
{
$this->assertSame('', (new Client())->getBaseUrl());
$this->assertEquals('http://foo', (new Client([
'base_url' => 'http://foo'
]))->getBaseUrl());
}
 
public function testCanSpecifyBaseUrlUriTemplate()
{
$client = new Client(['base_url' => ['http://foo.com/{var}/', ['var' => 'baz']]]);
$this->assertEquals('http://foo.com/baz/', $client->getBaseUrl());
}
 
public function testClientUsesDefaultAdapterWhenNoneIsSet()
{
$client = new Client();
if (!extension_loaded('curl')) {
$adapter = 'GuzzleHttp\Adapter\StreamAdapter';
} elseif (ini_get('allow_url_fopen')) {
$adapter = 'GuzzleHttp\Adapter\StreamingProxyAdapter';
} else {
$adapter = 'GuzzleHttp\Adapter\Curl\CurlAdapter';
}
$this->assertInstanceOf($adapter, $this->readAttribute($client, 'adapter'));
}
 
/**
* @expectedException \Exception
* @expectedExceptionMessage Foo
*/
public function testCanSpecifyAdapter()
{
$adapter = $this->getMockBuilder('GuzzleHttp\Adapter\AdapterInterface')
->setMethods(['send'])
->getMockForAbstractClass();
$adapter->expects($this->once())
->method('send')
->will($this->throwException(new \Exception('Foo')));
$client = new Client(['adapter' => $adapter]);
$client->get('http://httpbin.org');
}
 
/**
* @expectedException \Exception
* @expectedExceptionMessage Foo
*/
public function testCanSpecifyMessageFactory()
{
$factory = $this->getMockBuilder('GuzzleHttp\Message\MessageFactoryInterface')
->setMethods(['createRequest'])
->getMockForAbstractClass();
$factory->expects($this->once())
->method('createRequest')
->will($this->throwException(new \Exception('Foo')));
$client = new Client(['message_factory' => $factory]);
$client->get();
}
 
public function testCanSpecifyEmitter()
{
$emitter = $this->getMockBuilder('GuzzleHttp\Event\EmitterInterface')
->setMethods(['listeners'])
->getMockForAbstractClass();
$emitter->expects($this->once())
->method('listeners')
->will($this->returnValue('foo'));
 
$client = new Client(['emitter' => $emitter]);
$this->assertEquals('foo', $client->getEmitter()->listeners());
}
 
public function testAddsDefaultUserAgentHeaderWithDefaultOptions()
{
$client = new Client(['defaults' => ['allow_redirects' => false]]);
$this->assertFalse($client->getDefaultOption('allow_redirects'));
$this->assertEquals(
['User-Agent' => Client::getDefaultUserAgent()],
$client->getDefaultOption('headers')
);
}
 
public function testAddsDefaultUserAgentHeaderWithoutDefaultOptions()
{
$client = new Client();
$this->assertEquals(
['User-Agent' => Client::getDefaultUserAgent()],
$client->getDefaultOption('headers')
);
}
 
private function getRequestClient()
{
$client = $this->getMockBuilder('GuzzleHttp\Client')
->setMethods(['send'])
->getMock();
$client->expects($this->once())
->method('send')
->will($this->returnArgument(0));
 
return $client;
}
 
public function requestMethodProvider()
{
return [
['GET', false],
['HEAD', false],
['DELETE', false],
['OPTIONS', false],
['POST', 'foo'],
['PUT', 'foo'],
['PATCH', 'foo']
];
}
 
/**
* @dataProvider requestMethodProvider
*/
public function testClientProvidesMethodShortcut($method, $body)
{
$client = $this->getRequestClient();
if ($body) {
$request = $client->{$method}('http://foo.com', [
'headers' => ['X-Baz' => 'Bar'],
'body' => $body,
'query' => ['a' => 'b']
]);
} else {
$request = $client->{$method}('http://foo.com', [
'headers' => ['X-Baz' => 'Bar'],
'query' => ['a' => 'b']
]);
}
$this->assertEquals($method, $request->getMethod());
$this->assertEquals('Bar', $request->getHeader('X-Baz'));
$this->assertEquals('a=b', $request->getQuery());
if ($body) {
$this->assertEquals($body, $request->getBody());
}
}
 
public function testClientMergesDefaultOptionsWithRequestOptions()
{
$f = $this->getMockBuilder('GuzzleHttp\Message\MessageFactoryInterface')
->setMethods(array('createRequest'))
->getMockForAbstractClass();
 
$o = null;
// Intercept the creation
$f->expects($this->once())
->method('createRequest')
->will($this->returnCallback(
function ($method, $url, array $options = []) use (&$o) {
$o = $options;
return (new MessageFactory())->createRequest($method, $url, $options);
}
));
 
$client = new Client([
'message_factory' => $f,
'defaults' => [
'headers' => ['Foo' => 'Bar'],
'query' => ['baz' => 'bam'],
'exceptions' => false
]
]);
 
$request = $client->createRequest('GET', 'http://foo.com?a=b', [
'headers' => ['Hi' => 'there', '1' => 'one'],
'allow_redirects' => false,
'query' => ['t' => 1]
]);
 
$this->assertFalse($o['allow_redirects']);
$this->assertFalse($o['exceptions']);
$this->assertEquals('Bar', $request->getHeader('Foo'));
$this->assertEquals('there', $request->getHeader('Hi'));
$this->assertEquals('one', $request->getHeader('1'));
$this->assertEquals('a=b&baz=bam&t=1', $request->getQuery());
}
 
public function testClientMergesDefaultHeadersCaseInsensitively()
{
$client = new Client(['defaults' => ['headers' => ['Foo' => 'Bar']]]);
$request = $client->createRequest('GET', 'http://foo.com?a=b', [
'headers' => ['foo' => 'custom', 'user-agent' => 'test']
]);
$this->assertEquals('test', $request->getHeader('User-Agent'));
$this->assertEquals('custom', $request->getHeader('Foo'));
}
 
public function testUsesBaseUrlWhenNoUrlIsSet()
{
$client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']);
$this->assertEquals(
'http://www.foo.com/baz?bam=bar',
$client->createRequest('GET')->getUrl()
);
}
 
public function testUsesBaseUrlCombinedWithProvidedUrl()
{
$client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']);
$this->assertEquals(
'http://www.foo.com/bar/bam',
$client->createRequest('GET', 'bar/bam')->getUrl()
);
}
 
public function testUsesBaseUrlCombinedWithProvidedUrlViaUriTemplate()
{
$client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']);
$this->assertEquals(
'http://www.foo.com/bar/123',
$client->createRequest('GET', ['bar/{bam}', ['bam' => '123']])->getUrl()
);
}
 
public function testSettingAbsoluteUrlOverridesBaseUrl()
{
$client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']);
$this->assertEquals(
'http://www.foo.com/foo',
$client->createRequest('GET', '/foo')->getUrl()
);
}
 
public function testSettingAbsoluteUriTemplateOverridesBaseUrl()
{
$client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']);
$this->assertEquals(
'http://goo.com/1',
$client->createRequest(
'GET',
['http://goo.com/{bar}', ['bar' => '1']]
)->getUrl()
);
}
 
public function testCanSetRelativeUrlStartingWithHttp()
{
$client = new Client(['base_url' => 'http://www.foo.com']);
$this->assertEquals(
'http://www.foo.com/httpfoo',
$client->createRequest('GET', 'httpfoo')->getUrl()
);
}
 
public function testClientSendsRequests()
{
$response = new Response(200);
$adapter = new MockAdapter();
$adapter->setResponse($response);
$client = new Client(['adapter' => $adapter]);
$this->assertSame($response, $client->get('http://test.com'));
$this->assertEquals('http://test.com', $response->getEffectiveUrl());
}
 
public function testSendingRequestCanBeIntercepted()
{
$response = new Response(200);
$response2 = new Response(200);
$adapter = new MockAdapter();
$adapter->setResponse($response);
$client = new Client(['adapter' => $adapter]);
$client->getEmitter()->on(
'before',
function (BeforeEvent $e) use ($response2) {
$e->intercept($response2);
}
);
$this->assertSame($response2, $client->get('http://test.com'));
$this->assertEquals('http://test.com', $response2->getEffectiveUrl());
}
 
/**
* @expectedException \GuzzleHttp\Exception\RequestException
* @expectedExceptionMessage No response
*/
public function testEnsuresResponseIsPresentAfterSending()
{
$adapter = $this->getMockBuilder('GuzzleHttp\Adapter\MockAdapter')
->setMethods(['send'])
->getMock();
$adapter->expects($this->once())
->method('send');
$client = new Client(['adapter' => $adapter]);
$client->get('http://httpbin.org');
}
 
public function testClientHandlesErrorsDuringBeforeSend()
{
$client = new Client();
$client->getEmitter()->on('before', function ($e) {
throw new \Exception('foo');
});
$client->getEmitter()->on('error', function ($e) {
$e->intercept(new Response(200));
});
$this->assertEquals(200, $client->get('http://test.com')->getStatusCode());
}
 
/**
* @expectedException \GuzzleHttp\Exception\RequestException
* @expectedExceptionMessage foo
*/
public function testClientHandlesErrorsDuringBeforeSendAndThrowsIfUnhandled()
{
$client = new Client();
$client->getEmitter()->on('before', function ($e) {
throw new RequestException('foo', $e->getRequest());
});
$client->get('http://httpbin.org');
}
 
/**
* @expectedException \GuzzleHttp\Exception\RequestException
* @expectedExceptionMessage foo
*/
public function testClientWrapsExceptions()
{
$client = new Client();
$client->getEmitter()->on('before', function ($e) {
throw new \Exception('foo');
});
$client->get('http://httpbin.org');
}
 
public function testCanSetDefaultValues()
{
$client = new Client(['foo' => 'bar']);
$client->setDefaultOption('headers/foo', 'bar');
$this->assertNull($client->getDefaultOption('foo'));
$this->assertEquals('bar', $client->getDefaultOption('headers/foo'));
}
 
public function testSendsAllInParallel()
{
$client = new Client();
$client->getEmitter()->attach(new Mock([
new Response(200),
new Response(201),
new Response(202),
]));
$history = new History();
$client->getEmitter()->attach($history);
 
$requests = [
$client->createRequest('GET', 'http://test.com'),
$client->createRequest('POST', 'http://test.com'),
$client->createRequest('PUT', 'http://test.com')
];
 
$client->sendAll($requests);
$requests = array_map(function ($r) { return $r->getMethod(); }, $history->getRequests());
$this->assertContains('GET', $requests);
$this->assertContains('POST', $requests);
$this->assertContains('PUT', $requests);
}
 
public function testCanSetCustomParallelAdapter()
{
$called = false;
$pa = new FakeParallelAdapter(new MockAdapter(function () use (&$called) {
$called = true;
return new Response(203);
}));
$client = new Client(['parallel_adapter' => $pa]);
$client->sendAll([$client->createRequest('GET', 'http://www.foo.com')]);
$this->assertTrue($called);
}
 
public function testCanDisableAuthPerRequest()
{
$client = new Client(['defaults' => ['auth' => 'foo']]);
$request = $client->createRequest('GET', 'http://test.com');
$this->assertEquals('foo', $request->getConfig()['auth']);
$request = $client->createRequest('GET', 'http://test.com', ['auth' => null]);
$this->assertFalse($request->getConfig()->hasKey('auth'));
}
 
/**
* @expectedException \PHPUnit_Framework_Error_Deprecated
*/
public function testHasDeprecatedGetEmitter()
{
$client = new Client();
$client->getEventDispatcher();
}
 
public function testUsesProxyEnvironmentVariables()
{
$client = new Client();
$this->assertNull($client->getDefaultOption('proxy'));
 
putenv('HTTP_PROXY=127.0.0.1');
$client = new Client();
$this->assertEquals(
['http' => '127.0.0.1'],
$client->getDefaultOption('proxy')
);
 
putenv('HTTPS_PROXY=127.0.0.2');
$client = new Client();
$this->assertEquals(
['http' => '127.0.0.1', 'https' => '127.0.0.2'],
$client->getDefaultOption('proxy')
);
 
putenv('HTTP_PROXY=');
putenv('HTTPS_PROXY=');
}
}