Файл: gapps/vendor/fabpot/goutte/Goutte/Tests/ClientTest.php
Строк: 530
<?php
/*
* This file is part of the Goutte package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace GoutteTests;
use GoutteClient;
use GuzzleHttpClient as GuzzleClient;
use GuzzleHttpExceptionRequestException;
use GuzzleHttpHandlerMockHandler;
use GuzzleHttpHandlerStack;
use GuzzleHttpPsr7Response as GuzzleResponse;
use GuzzleHttpMiddleware;
use SymfonyComponentBrowserKitCookie;
/**
* Goutte Client Test.
*
* @author Michael Dowling <michael@guzzlephp.org>
* @author Charles Sarrazin <charles@sarraz.in>
*/
class ClientTest extends PHPUnit_Framework_TestCase
{
protected $history;
/** @var MockHandler */
protected $mock;
protected function getGuzzle(array $responses = [])
{
if (empty($responses)) {
$responses = [new GuzzleResponse(200, [], '<html><body><p>Hi</p></body></html>')];
}
$this->mock = new MockHandler($responses);
$handlerStack = HandlerStack::create($this->mock);
$this->history = [];
$handlerStack->push(Middleware::history($this->history));
$guzzle = new GuzzleClient(array('redirect.disable' => true, 'base_uri' => '', 'handler' => $handlerStack));
return $guzzle;
}
public function testCreatesDefaultClient()
{
$client = new Client();
$this->assertInstanceOf('GuzzleHttp\ClientInterface', $client->getClient());
}
public function testUsesCustomClient()
{
$guzzle = new GuzzleClient();
$client = new Client();
$this->assertSame($client, $client->setClient($guzzle));
$this->assertSame($guzzle, $client->getClient());
}
public function testUsesCustomHeaders()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$client->setHeader('X-Test', 'test');
$client->request('GET', 'http://www.example.com/');
$this->assertEquals('test', end($this->history)['request']->getHeaderLine('X-Test'));
}
public function testCustomUserAgent()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$client->setHeader('User-Agent', 'foo');
$client->request('GET', 'http://www.example.com/');
$this->assertEquals('foo', end($this->history)['request']->getHeaderLine('User-Agent'));
}
public function testUsesAuth()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$client->setAuth('me', '**');
$client->request('GET', 'http://www.example.com/');
$request = end($this->history)['request'];
$this->assertEquals('Basic bWU6Kio=', $request->getHeaderLine('Authorization'));
}
public function testResetsAuth()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$client->setAuth('me', '**');
$client->resetAuth();
$client->request('GET', 'http://www.example.com/');
$request = end($this->history)['request'];
$this->assertEquals('', $request->getHeaderLine('authorization'));
}
public function testUsesCookies()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$client->getCookieJar()->set(new Cookie('test', '123'));
$client->request('GET', 'http://www.example.com/');
$request = end($this->history)['request'];
$this->assertEquals('test=123', $request->getHeaderLine('Cookie'));
}
public function testUsesCookiesWithCustomPort()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$client->getCookieJar()->set(new Cookie('test', '123'));
$client->request('GET', 'http://www.example.com:8000/');
$request = end($this->history)['request'];
$this->assertEquals('test=123', $request->getHeaderLine('Cookie'));
}
public function testUsesPostFiles()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$files = array(
'test' => array(
'name' => 'test.txt',
'tmp_name' => __DIR__.'/fixtures.txt',
),
);
$client->request('POST', 'http://www.example.com/', array(), $files);
$request = end($this->history)['request'];
$stream = $request->getBody();
$boundary = $stream->getBoundary();
$this->assertEquals(
"--$boundaryrnContent-Disposition: form-data; name="test"; filename="test.txt"rnContent-Length: 4rn"
."Content-Type: text/plainrnrnfoonrn--$boundary--rn",
$stream->getContents()
);
}
public function testUsesPostNamedFiles()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$files = array(
'test' => __DIR__.'/fixtures.txt',
);
$client->request('POST', 'http://www.example.com/', array(), $files);
$request = end($this->history)['request'];
$stream = $request->getBody();
$boundary = $stream->getBoundary();
$this->assertEquals(
"--$boundaryrnContent-Disposition: form-data; name="test"; filename="fixtures.txt"rnContent-Length: 4rn"
."Content-Type: text/plainrnrnfoonrn--$boundary--rn",
$stream->getContents()
);
}
public function testUsesPostFilesNestedFields()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$files = array(
'form' => array(
'test' => array(
'name' => 'test.txt',
'tmp_name' => __DIR__.'/fixtures.txt',
),
),
);
$client->request('POST', 'http://www.example.com/', array(), $files);
$request = end($this->history)['request'];
$stream = $request->getBody();
$boundary = $stream->getBoundary();
$this->assertEquals(
"--$boundaryrnContent-Disposition: form-data; name="form[test]"; filename="test.txt"rnContent-Length: 4rn"
."Content-Type: text/plainrnrnfoonrn--$boundary--rn",
$stream->getContents()
);
}
public function testPostFormWithFiles()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$files = array(
'test' => __DIR__.'/fixtures.txt',
);
$params = array(
'foo' => 'bar',
);
$client->request('POST', 'http://www.example.com/', $params, $files);
$request = end($this->history)['request'];
$stream = $request->getBody();
$boundary = $stream->getBoundary();
$this->assertEquals(
"--$boundaryrnContent-Disposition: form-data; name="foo"rnContent-Length: 3rn"
."rnbarrn"
."--$boundaryrnContent-Disposition: form-data; name="test"; filename="fixtures.txt"rnContent-Length: 4rn"
."Content-Type: text/plainrnrnfoonrn--$boundary--rn",
$stream->getContents());
}
public function testPostEmbeddedFormWithFiles()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$files = array(
'test' => __DIR__.'/fixtures.txt',
);
$params = array(
'foo' => array(
'bar' => 'baz',
),
);
$client->request('POST', 'http://www.example.com/', $params, $files);
$request = end($this->history)['request'];
$stream = $request->getBody();
$boundary = $stream->getBoundary();
$this->assertEquals(
"--$boundaryrnContent-Disposition: form-data; name="foo[bar]"rnContent-Length: 3rn"
."rnbazrn"
."--$boundaryrnContent-Disposition: form-data; name="test"; filename="fixtures.txt"rnContent-Length: 4rn"
."Content-Type: text/plainrnrnfoonrn--$boundary--rn",
$stream->getContents());
}
public function testUsesPostFilesOnClientSide()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$files = array(
'test' => __DIR__.'/fixtures.txt',
);
$client->request('POST', 'http://www.example.com/', array(), $files);
$request = end($this->history)['request'];
$stream = $request->getBody();
$boundary = $stream->getBoundary();
$this->assertEquals(
"--$boundaryrnContent-Disposition: form-data; name="test"; filename="fixtures.txt"rnContent-Length: 4rn"
."Content-Type: text/plainrnrnfoonrn--$boundary--rn",
$stream->getContents()
);
}
public function testUsesPostFilesUploadError()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$files = array(
'test' => array(
'name' => '',
'type' => '',
'tmp_name' => '',
'error' => 4,
'size' => 0,
),
);
$client->request('POST', 'http://www.example.com/', array(), $files);
$request = end($this->history)['request'];
$stream = $request->getBody();
$boundary = $stream->getBoundary();
$this->assertEquals("--$boundary--rn", $stream->getContents());
}
public function testCreatesResponse()
{
$guzzle = $this->getGuzzle();
$client = new Client();
$client->setClient($guzzle);
$crawler = $client->request('GET', 'http://www.example.com/');
$this->assertEquals('Hi', $crawler->filter('p')->text());
}
public function testHandlesRedirectsCorrectly()
{
$guzzle = $this->getGuzzle([
new GuzzleResponse(301, array(
'Location' => 'http://www.example.com/',
)),
new GuzzleResponse(200, [], '<html><body><p>Test</p></body></html>'),
]);
$client = new Client();
$client->setClient($guzzle);
$crawler = $client->request('GET', 'http://www.example.com/');
$this->assertEquals('Test', $crawler->filter('p')->text());
// Ensure that two requests were sent
$this->assertEquals(2, count($this->history));
}
public function testConvertsGuzzleHeadersToArrays()
{
$guzzle = $this->getGuzzle([
new GuzzleResponse(200, array(
'Date' => 'Tue, 04 Jun 2013 13:22:41 GMT',
)),
]);
$client = new Client();
$client->setClient($guzzle);
$client->request('GET', 'http://www.example.com/');
$response = $client->getResponse();
$headers = $response->getHeaders();
$this->assertInternalType('array', array_shift($headers), 'Header not converted from GuzzleHttpMessageHeader to array');
}
public function testNullResponseException()
{
$this->setExpectedException('GuzzleHttpExceptionRequestException');
$guzzle = $this->getGuzzle([
new RequestException('', $this->getMock('PsrHttpMessageRequestInterface')),
]);
$client = new Client();
$client->setClient($guzzle);
$client->request('GET', 'http://www.example.com/');
$client->getResponse();
}
public function testHttps()
{
$guzzle = $this->getGuzzle([
new GuzzleResponse(200, [], '<html><body><p>Test</p></body></html>'),
]);
$client = new Client();
$client->setClient($guzzle);
$crawler = $client->request('GET', 'https://www.example.com/');
$this->assertEquals('Test', $crawler->filter('p')->text());
}
public function testCustomUserAgentConstructor()
{
$guzzle = $this->getGuzzle();
$client = new Client([
'HTTP_HOST' => '1.2.3.4',
'HTTP_USER_AGENT' => 'SomeHost',
]);
$client->setClient($guzzle);
$client->request('GET', 'http://www.example.com/');
$this->assertEquals('SomeHost', end($this->history)['request']->getHeaderLine('User-Agent'));
}
public function testResetHeaders()
{
$client = new Client();
$client->setHeader('X-Test', 'test');
$reflectionProperty = new ReflectionProperty('GoutteClient', 'headers');
$reflectionProperty->setAccessible(true);
$this->assertEquals(array('x-test' => 'test'), $reflectionProperty->getValue($client));
$client->resetHeaders();
$this->assertEquals([], $reflectionProperty->getValue($client));
}
public function testRestart()
{
$client = new Client();
$client->setHeader('X-Test', 'test');
$client->setAuth('foo', 'bar');
$headersReflectionProperty = new ReflectionProperty('GoutteClient', 'headers');
$headersReflectionProperty->setAccessible(true);
$this->assertEquals(array('x-test' => 'test'), $headersReflectionProperty->getValue($client));
$authReflectionProperty = new ReflectionProperty('GoutteClient', 'auth');
$authReflectionProperty->setAccessible(true);
$this->assertEquals(array('foo', 'bar', 'basic'), $authReflectionProperty->getValue($client));
$client->restart();
$this->assertEquals([], $headersReflectionProperty->getValue($client));
$this->assertNull($authReflectionProperty->getValue($client));
}
}