1
0
mirror of https://github.com/guzzle/guzzle.git synced 2025-02-26 02:53:22 +01:00
guzzle/tests/Guzzle/Tests/Service/ClientTest.php
2011-07-07 17:17:28 -05:00

452 lines
16 KiB
PHP

<?php
namespace Guzzle\Tests\Service;
use Guzzle\Guzzle;
use Guzzle\Common\Collection;
use Guzzle\Common\Log\ClosureLogAdapter;
use Guzzle\Http\Message\RequestFactory;
use Guzzle\Http\Plugin\ExponentialBackoffPlugin;
use Guzzle\Http\Plugin\LogPlugin;
use Guzzle\Service\Description\ApiCommand;
use Guzzle\Service\Client;
use Guzzle\Service\Command\CommandSet;
use Guzzle\Service\Command\CommandInterface;
use Guzzle\Service\Description\XmlDescriptionBuilder;
use Guzzle\Service\Description\ServiceDescription;
use Guzzle\Tests\Service\Mock\Command\MockCommand;
/**
* @author Michael Dowling <michael@guzzlephp.org>
*/
class ClientTest extends \Guzzle\Tests\GuzzleTestCase
{
protected $factory;
protected $service;
protected $serviceTest;
protected $factoryTest;
public function setUp()
{
$this->serviceTest = new ServiceDescription(array(
new ApiCommand(array(
'name' => 'test_command',
'doc' => 'documentationForCommand',
'method' => 'DELETE',
'can_batch' => true,
'class' => 'Guzzle\\Tests\\Service\\Mock\\Command\\MockCommand',
'args' => array(
'bucket' => array(
'required' => true
),
'key' => array(
'required' => true
)
)
))
));
$builder = new XmlDescriptionBuilder(__DIR__ . DIRECTORY_SEPARATOR . 'test_service.xml');
$this->service = $builder->build();
}
/**
* Get a LogPlugin
*
* @return LogPlugin
*/
private function getLogPlugin()
{
return new LogPlugin(new ClosureLogAdapter(
function($message, $priority, $extras = null) {
echo $message . ' ' . $priority . ' ' . implode(' - ', (array) $extras) . "\n";
}
));
}
/**
* @covers Guzzle\Service\Client::getConfig
* @covers Guzzle\Service\Client::setConfig
* @covers Guzzle\Service\Client::setBaseUrl
* @covers Guzzle\Service\Client::getBaseUrl
*/
public function testAcceptsConfig()
{
$client = new Client('http://www.google.com/');
$this->assertEquals('http://www.google.com/', $client->getBaseUrl());
$this->assertSame($client, $client->setConfig(array(
'test' => '123'
)));
$this->assertEquals(array('test' => '123'), $client->getConfig()->getAll());
$this->assertEquals('123', $client->getConfig('test'));
$this->assertSame($client, $client->setBaseUrl('http://www.test.com/{{test}}'));
$this->assertEquals('http://www.test.com/123', $client->getBaseUrl());
$this->assertEquals('http://www.test.com/{{test}}', $client->getBaseUrl(false));
try {
$client->setConfig(false);
} catch (\InvalidArgumentException $e) {
}
}
/**
* @covers Guzzle\Service\Client::__construct
*/
public function testConstructorCanAcceptConfig()
{
$client = new Client('http://www.test.com/', array(
'data' => '123'
));
$this->assertEquals('123', $client->getConfig('data'));
}
/**
* @covers Guzzle\Service\Client::setConfig
*/
public function testCanUseCollectionAsConfig()
{
$client = new Client('http://www.google.com/');
$client->setConfig(new Collection(array(
'api' => 'v1',
'key' => 'value',
'base_url' => 'http://www.google.com/'
)));
$this->assertEquals('v1', $client->getConfig('api'));
}
/**
* @covers Guzzle\Service\Client::factory
*/
public function testFactoryCreatesClient()
{
$client = Client::factory(array(
'base_url' => 'http://www.test.com/',
'test' => '123'
));
$this->assertEquals('http://www.test.com/', $client->getBaseUrl());
$this->assertEquals('123', $client->getConfig('test'));
}
/**
* @covers Guzzle\Service\Client
*/
public function testInjectConfig()
{
$client = new Client('http://www.google.com/');
$client->setConfig(array(
'api' => 'v1',
'key' => 'value',
'foo' => 'bar'
));
$this->assertEquals('Testing...api/v1/key/value', $client->inject('Testing...api/{{api}}/key/{{key}}'));
// Make sure that the client properly validates and injects config
$this->assertEquals('bar', $client->getConfig('foo'));
}
/**
* @covers Guzzle\Service\Client::__construct
* @covers Guzzle\Service\Client::createRequest
*/
public function testClientAttachersObserversToRequests()
{
$this->getServer()->flush();
$this->getServer()->enqueue("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
$client = new Client($this->getServer()->getUrl());
$logPlugin = $this->getLogPlugin();
$client->getEventManager()->attach($logPlugin);
// Make sure the plugin was registered correctly
$this->assertTrue($client->getEventManager()->hasObserver($logPlugin));
// Get a request from the client and ensure the the observer was
// attached to the new request
$request = $client->createRequest();
$this->assertTrue($request->getEventManager()->hasObserver($logPlugin));
// Make sure that the log plugin actually logged the request and response
ob_start();
$request->send();
$logged = ob_get_clean();
$this->assertContains('"GET / HTTP/1.1" - 200', $logged);
}
/**
* @covers Guzzle\Service\Client::getBaseUrl
* @covers Guzzle\Service\Client::setBaseUrl
*/
public function testClientReturnsValidBaseUrls()
{
$client = new Client('http://www.{{foo}}.{{data}}/', array(
'data' => '123',
'foo' => 'bar'
));
$this->assertEquals('http://www.bar.123/', $client->getBaseUrl());
$client->setBaseUrl('http://www.google.com/');
$this->assertEquals('http://www.google.com/', $client->getBaseUrl());
}
/**
* @covers Guzzle\Service\Client::execute
*/
public function testExecutesCommands()
{
$this->getServer()->flush();
$this->getServer()->enqueue("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
$client = new Client($this->getServer()->getUrl());
$cmd = new MockCommand();
$client->execute($cmd);
$this->assertInstanceOf('Guzzle\\Http\\Message\\Response', $cmd->getResponse());
$this->assertInstanceOf('Guzzle\\Http\\Message\\Response', $cmd->getResult());
$this->assertEquals(1, count($this->getServer()->getReceivedRequests(false)));
}
/**
* @covers Guzzle\Service\Client::execute
* @expectedException Guzzle\Service\Command\CommandSetException
*/
public function testThrowsExceptionWhenExecutingMixedClientCommandSets()
{
$client = new Client('http://www.test.com/');
$otherClient = new Client('http://www.test-123.com/');
// Create a command set and a command
$set = new CommandSet();
$cmd = new MockCommand();
$set->addCommand($cmd);
// Associate the other client with the command
$cmd->setClient($otherClient);
// Send the set with the wrong client, causing an exception
$client->execute($set);
}
/**
* @covers Guzzle\Service\Client::execute
* @expectedException InvalidArgumentException
*/
public function testThrowsExceptionWhenExecutingInvalidCommandSets()
{
$client = new Client('http://www.test.com/');
$client->execute(new \stdClass());
}
/**
* @covers Guzzle\Service\Client::execute
*/
public function testExecutesCommandSets()
{
$client = new Client('http://www.test.com/');
// Set a mock response for each request from the Client
$client->getEventManager()->attach(function($subject, $event, $context) {
if ($event == 'request.create') {
$context->setResponse(new \Guzzle\Http\Message\Response(200), true);
}
});
// Create a command set and a command
$set = new CommandSet();
$cmd = new MockCommand();
$set->addCommand($cmd);
$this->assertSame($set, $client->execute($set));
// Make sure it sent
$this->assertTrue($cmd->isExecuted());
$this->assertTrue($cmd->isPrepared());
$this->assertEquals(200, $cmd->getResponse()->getStatusCode());
}
/**
* @covers Guzzle\Service\Client::setUserApplication
* @covers Guzzle\Service\Client::createRequest
* @covers Guzzle\Service\Client::prepareRequest
*/
public function testSetsUserApplication()
{
$client = new Client('http://www.test.com/', array(
'api' => 'v1'
));
$this->assertSame($client, $client->setUserApplication('Test', '1.0Ab'));
$request = $client->get();
$this->assertEquals('Test/1.0Ab ' . Guzzle::getDefaultUserAgent(), $request->getHeader('User-Agent'));
}
/**
* @covers Guzzle\Service\Client::createRequest
* @covers Guzzle\Service\Client::prepareRequest
*/
public function testClientAddsCurlOptionsToRequests()
{
$client = new Client('http://www.test.com/', array(
'api' => 'v1',
// Adds the option using the curl values
'curl.CURLOPT_HTTPAUTH' => 'CURLAUTH_DIGEST',
'curl.abc' => 'not added'
));
$request = $client->createRequest();
$options = $request->getCurlOptions();
$this->assertEquals(CURLAUTH_DIGEST, $options->get(CURLOPT_HTTPAUTH));
$this->assertNull($options->get('curl.abc'));
}
/**
* @covers Guzzle\Service\Client::createRequest
* @covers Guzzle\Service\Client::prepareRequest
*/
public function testClientAddsCacheKeyFiltersToRequests()
{
$client = new Client('http://www.test.com/', array(
'api' => 'v1',
'cache.key_filter' => 'query=Date'
));
$request = $client->createRequest();
$this->assertEquals('query=Date', $request->getParams()->get('cache.key_filter'));
}
/**
* @covers Guzzle\Service\Client::getCommand
* @expectedException InvalidArgumentException
*/
public function testThrowsExceptionWhenNoCommandFactoryIsSetAndGettingCommand()
{
$client = new Client($this->getServer()->getUrl());
$client->getCommand('test');
}
/**
* @covers Guzzle\Service\Client::getCommand
* @covers Guzzle\Service\Client::getDescription
* @covers Guzzle\Service\Client::setDescription
*/
public function testRetrievesCommandsFromConcreteAndService()
{
$client = new Mock\MockClient('http://www.example.com/');
$this->assertSame($client, $client->setDescription($this->serviceTest));
$this->assertSame($this->serviceTest, $client->getDescription());
// Creates service commands
$this->assertInstanceOf('Guzzle\\Tests\\Service\\Mock\\Command\\MockCommand', $client->getCommand('test_command'));
// Creates concrete commands
$this->assertInstanceOf('Guzzle\\Tests\\Service\\Mock\\Command\\OtherCommand', $client->getCommand('other_command'));
}
/**
* @covers Guzzle\Service\Client::prepareRequest
*/
public function testPreparesRequestsNotCreatedByTheClient()
{
$client = new Client($this->getServer()->getUrl());
$client->getEventManager()->attach(new ExponentialBackoffPlugin());
$request = RequestFactory::get($client->getBaseUrl());
$this->assertSame($request, $client->prepareRequest($request));
$this->assertTrue($request->getEventManager()->hasObserver('Guzzle\\Http\\Plugin\\ExponentialBackoffPlugin'));
}
/**
* @covers Guzzle\Service\Client::createRequest
*/
public function testCreatesRequestsWithDefaultValues()
{
$client = new Client($this->getServer()->getUrl() . 'base');
// Create a GET request
$request = $client->createRequest();
$this->assertEquals('GET', $request->getMethod());
$this->assertEquals($client->getBaseUrl(), $request->getUrl());
// Create a DELETE request
$request = $client->createRequest('DELETE');
$this->assertEquals('DELETE', $request->getMethod());
$this->assertEquals($client->getBaseUrl(), $request->getUrl());
// Create a HEAD request with custom headers
$request = $client->createRequest('HEAD', 'http://www.test.com/');
$this->assertEquals('HEAD', $request->getMethod());
$this->assertEquals('http://www.test.com/', $request->getUrl());
// Create a PUT request
$request = $client->createRequest('PUT');
$this->assertEquals('PUT', $request->getMethod());
// Create a PUT request with injected config
$request = $client->createRequest('PUT', '/path/{{a}}?q={{b}}', array(
'a' => '1',
'b' => '2'
));
$this->assertEquals($request->getUrl(), $this->getServer()->getUrl() . 'path/1?q=2');
// Realtive URL with relative path
$request = $client->createRequest('GET', 'relative/path/to/resource');
$this->assertEquals($this->getServer()->getUrl() . 'base/relative/path/to/resource', $request->getUrl());
// Realtive URL with relative path and query
$request = $client->createRequest('GET', 'relative/path/to/resource?a=b&c=d');
$this->assertEquals($this->getServer()->getUrl() . 'base/relative/path/to/resource?a=b&c=d', $request->getUrl());
// Relative URL with absolute path
$request = $client->createRequest('GET', '/absolute/path/to/resource');
$this->assertEquals($this->getServer()->getUrl() . 'absolute/path/to/resource', $request->getUrl());
// Relative URL with absolute path and query
$request = $client->createRequest('GET', '/absolute/path/to/resource?a=b&c=d');
$this->assertEquals($this->getServer()->getUrl() . 'absolute/path/to/resource?a=b&c=d', $request->getUrl());
// Test with a base URL containing a query string too
$client = new Client($this->getServer()->getUrl() . 'base?z=1');
// Absolute so replaces query
$request = $client->createRequest('GET', '/absolute/path/to/resource?a=b&c=d');
$this->assertEquals($this->getServer()->getUrl() . 'absolute/path/to/resource?a=b&c=d', $request->getUrl());
// Add relative with no query
$request = $client->createRequest('GET', 'relative/path/to/resource');
$this->assertEquals($this->getServer()->getUrl() . 'base/relative/path/to/resource?z=1', $request->getUrl());
// Add relative with query
$request = $client->createRequest('GET', 'relative/path/to/resource?another=query');
$this->assertEquals($this->getServer()->getUrl() . 'base/relative/path/to/resource?z=1&another=query', $request->getUrl());
}
/**
* @covers Guzzle\Service\Client::get
* @covers Guzzle\Service\Client::delete
* @covers Guzzle\Service\Client::head
* @covers Guzzle\Service\Client::put
* @covers Guzzle\Service\Client::post
* @covers Guzzle\Service\Client::options
*/
public function testClientHasHelperMethodsForCreatingRequests()
{
$url = $this->getServer()->getUrl();
$client = new Client($url . 'base');
$this->assertEquals('GET', $client->get()->getMethod());
$this->assertEquals('PUT', $client->put()->getMethod());
$this->assertEquals('POST', $client->post()->getMethod());
$this->assertEquals('HEAD', $client->head()->getMethod());
$this->assertEquals('DELETE', $client->delete()->getMethod());
$this->assertEquals('OPTIONS', $client->options()->getMethod());
$this->assertEquals($url . 'base/abc', $client->get('abc')->getUrl());
$this->assertEquals($url . 'zxy', $client->put('/zxy')->getUrl());
$this->assertEquals($url . 'zxy?a=b', $client->post('/zxy?a=b')->getUrl());
$this->assertEquals($url . 'base?a=b', $client->head('?a=b')->getUrl());
$this->assertEquals($url . 'base?a=b', $client->delete('/base?a=b')->getUrl());
}
/**
* @covers Guzzle\Service\Client::getBaseUrl
* @expectedException RuntimeException
*/
public function testClientEnsuresBaseUrlIsSetWhenRetrievingIt()
{
$client = new Client('');
$client->getBaseUrl();
}
}