summaryrefslogtreecommitdiff
path: root/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/guzzle/guzzle/tests/Guzzle/Tests/Service')
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/AbstractConfigLoaderTest.php149
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderLoaderTest.php177
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderTest.php317
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/CachingConfigLoaderTest.php43
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/ClientTest.php320
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/AbstractCommandTest.php16
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/ClosureCommandTest.php54
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/CommandTest.php445
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultRequestSerializerTest.php122
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultResponseParserTest.php59
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/AliasFactoryTest.php76
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/CompositeFactoryTest.php124
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ConcreteClassFactoryTest.php49
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/MapFactoryTest.php37
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ServiceDescriptionFactoryTest.php68
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/AbstractVisitorTestCase.php110
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/BodyVisitorTest.php63
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/HeaderVisitorTest.php48
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/JsonVisitorTest.php60
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFieldVisitorTest.php33
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFileVisitorTest.php54
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/QueryVisitorTest.php48
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/ResponseBodyVisitorTest.php20
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/XmlVisitorTest.php558
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/AbstractResponseVisitorTest.php29
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/BodyVisitorTest.php21
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/HeaderVisitorTest.php98
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/JsonVisitorTest.php157
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/ReasonPhraseVisitorTest.php21
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/StatusCodeVisitorTest.php21
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/XmlVisitorTest.php431
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/VisitorFlyweightTest.php53
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationCommandTest.php102
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationResponseParserTest.php335
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/OperationTest.php308
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ParameterTest.php411
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaFormatterTest.php61
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaValidatorTest.php326
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionLoaderTest.php177
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionTest.php240
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/CommandTransferExceptionTest.php66
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/InconsistentClientTransferExceptionTest.php15
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/ValidationExceptionTest.php17
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/IterableCommand.php31
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/MockCommand.php32
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/OtherCommand.php30
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/Sub/Sub.php7
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/MockClient.php36
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Model/MockCommandIterator.php42
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/CompositeResourceIteratorFactoryTest.php37
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/MapResourceIteratorFactoryTest.php40
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ModelTest.php65
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorClassFactoryTest.php41
-rw-r--r--vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorTest.php184
54 files changed, 6484 insertions, 0 deletions
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/AbstractConfigLoaderTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/AbstractConfigLoaderTest.php
new file mode 100644
index 0000000..8b42fb8
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/AbstractConfigLoaderTest.php
@@ -0,0 +1,149 @@
+<?php
+
+namespace Guzzle\Tests\Service;
+
+/**
+ * @covers Guzzle\Service\AbstractConfigLoader
+ */
+class AbstractConfigLoaderTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ /** @var \Guzzle\Service\AbstractConfigLoader */
+ protected $loader;
+
+ /** @var array Any files that need to be deleted on tear down */
+ protected $cleanup = array();
+
+ public function setUp()
+ {
+ $this->loader = $this->getMockBuilder('Guzzle\Service\AbstractConfigLoader')
+ ->setMethods(array('build'))
+ ->getMockForAbstractClass();
+ }
+
+ public function tearDown()
+ {
+ foreach ($this->cleanup as $file) {
+ unlink($file);
+ }
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\InvalidArgumentException
+ */
+ public function testOnlyLoadsSupportedTypes()
+ {
+ $this->loader->load(new \stdClass());
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Unable to open fooooooo.json
+ */
+ public function testFileMustBeReadable()
+ {
+ $this->loader->load('fooooooo.json');
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Unknown file extension
+ */
+ public function testMustBeSupportedExtension()
+ {
+ $this->loader->load(dirname(__DIR__) . '/TestData/FileBody.txt');
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\RuntimeException
+ * @expectedExceptionMessage Error loading JSON data from
+ */
+ public function testJsonMustBeValue()
+ {
+ $filename = tempnam(sys_get_temp_dir(), 'json') . '.json';
+ file_put_contents($filename, '{/{./{}foo');
+ $this->cleanup[] = $filename;
+ $this->loader->load($filename);
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\InvalidArgumentException
+ * @expectedExceptionMessage PHP files must return an array
+ */
+ public function testPhpFilesMustReturnAnArray()
+ {
+ $filename = tempnam(sys_get_temp_dir(), 'php') . '.php';
+ file_put_contents($filename, '<?php $fdr = false;');
+ $this->cleanup[] = $filename;
+ $this->loader->load($filename);
+ }
+
+ public function testLoadsPhpFileIncludes()
+ {
+ $filename = tempnam(sys_get_temp_dir(), 'php') . '.php';
+ file_put_contents($filename, '<?php return array("foo" => "bar");');
+ $this->cleanup[] = $filename;
+ $this->loader->expects($this->exactly(1))->method('build')->will($this->returnArgument(0));
+ $config = $this->loader->load($filename);
+ $this->assertEquals(array('foo' => 'bar'), $config);
+ }
+
+ public function testCanCreateFromJson()
+ {
+ $file = dirname(__DIR__) . '/TestData/services/json1.json';
+ // The build method will just return the config data
+ $this->loader->expects($this->exactly(1))->method('build')->will($this->returnArgument(0));
+ $data = $this->loader->load($file);
+ // Ensure that the config files were merged using the includes directives
+ $this->assertArrayHasKey('includes', $data);
+ $this->assertArrayHasKey('services', $data);
+ $this->assertInternalType('array', $data['services']['foo']);
+ $this->assertInternalType('array', $data['services']['abstract']);
+ $this->assertInternalType('array', $data['services']['mock']);
+ $this->assertEquals('bar', $data['services']['foo']['params']['baz']);
+ }
+
+ public function testUsesAliases()
+ {
+ $file = dirname(__DIR__) . '/TestData/services/json1.json';
+ $this->loader->addAlias('foo', $file);
+ // The build method will just return the config data
+ $this->loader->expects($this->exactly(1))->method('build')->will($this->returnArgument(0));
+ $data = $this->loader->load('foo');
+ $this->assertEquals('bar', $data['services']['foo']['params']['baz']);
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Unable to open foo.json
+ */
+ public function testCanRemoveAliases()
+ {
+ $file = dirname(__DIR__) . '/TestData/services/json1.json';
+ $this->loader->addAlias('foo.json', $file);
+ $this->loader->removeAlias('foo.json');
+ $this->loader->load('foo.json');
+ }
+
+ public function testCanLoadArraysWithIncludes()
+ {
+ $file = dirname(__DIR__) . '/TestData/services/json1.json';
+ $config = array('includes' => array($file));
+ // The build method will just return the config data
+ $this->loader->expects($this->exactly(1))->method('build')->will($this->returnArgument(0));
+ $data = $this->loader->load($config);
+ $this->assertEquals('bar', $data['services']['foo']['params']['baz']);
+ }
+
+ public function testDoesNotEnterInfiniteLoop()
+ {
+ $prefix = $file = dirname(__DIR__) . '/TestData/description';
+ $this->loader->load("{$prefix}/baz.json");
+ $this->assertCount(4, $this->readAttribute($this->loader, 'loadedFiles'));
+ // Ensure that the internal list of loaded files is reset
+ $this->loader->load("{$prefix}/../test_service2.json");
+ $this->assertCount(1, $this->readAttribute($this->loader, 'loadedFiles'));
+ // Ensure that previously loaded files will be reloaded when starting fresh
+ $this->loader->load("{$prefix}/baz.json");
+ $this->assertCount(4, $this->readAttribute($this->loader, 'loadedFiles'));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderLoaderTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderLoaderTest.php
new file mode 100644
index 0000000..f63070e
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderLoaderTest.php
@@ -0,0 +1,177 @@
+<?php
+
+namespace Guzzle\Tests\Service\Builder;
+
+use Guzzle\Service\Builder\ServiceBuilderLoader;
+
+/**
+ * @covers Guzzle\Service\Builder\ServiceBuilderLoader
+ */
+class ServiceBuilderLoaderTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testBuildsServiceBuilders()
+ {
+ $arrayFactory = new ServiceBuilderLoader();
+
+ $data = array(
+ 'services' => array(
+ 'abstract' => array(
+ 'params' => array(
+ 'access_key' => 'xyz',
+ 'secret' => 'abc',
+ ),
+ ),
+ 'foo' => array(
+ 'extends' => 'abstract',
+ 'params' => array(
+ 'baz' => 'bar',
+ ),
+ ),
+ 'mock' => array(
+ 'extends' => 'abstract',
+ 'params' => array(
+ 'username' => 'foo',
+ 'password' => 'baz',
+ 'subdomain' => 'bar',
+ )
+ )
+ )
+ );
+
+ $builder = $arrayFactory->load($data);
+
+ // Ensure that services were parsed
+ $this->assertTrue(isset($builder['mock']));
+ $this->assertTrue(isset($builder['abstract']));
+ $this->assertTrue(isset($builder['foo']));
+ $this->assertFalse(isset($builder['jimmy']));
+ }
+
+ /**
+ * @expectedException Guzzle\Service\Exception\ServiceNotFoundException
+ * @expectedExceptionMessage foo is trying to extend a non-existent service: abstract
+ */
+ public function testThrowsExceptionWhenExtendingNonExistentService()
+ {
+ $arrayFactory = new ServiceBuilderLoader();
+
+ $data = array(
+ 'services' => array(
+ 'foo' => array(
+ 'extends' => 'abstract'
+ )
+ )
+ );
+
+ $builder = $arrayFactory->load($data);
+ }
+
+ public function testAllowsGlobalParameterOverrides()
+ {
+ $arrayFactory = new ServiceBuilderLoader();
+
+ $data = array(
+ 'services' => array(
+ 'foo' => array(
+ 'params' => array(
+ 'foo' => 'baz',
+ 'bar' => 'boo'
+ )
+ )
+ )
+ );
+
+ $builder = $arrayFactory->load($data, array(
+ 'bar' => 'jar',
+ 'far' => 'car'
+ ));
+
+ $compiled = json_decode($builder->serialize(), true);
+ $this->assertEquals(array(
+ 'foo' => 'baz',
+ 'bar' => 'jar',
+ 'far' => 'car'
+ ), $compiled['foo']['params']);
+ }
+
+ public function tstDoesNotErrorOnCircularReferences()
+ {
+ $arrayFactory = new ServiceBuilderLoader();
+ $arrayFactory->load(array(
+ 'services' => array(
+ 'too' => array('extends' => 'ball'),
+ 'ball' => array('extends' => 'too'),
+ )
+ ));
+ }
+
+ public function configProvider()
+ {
+ $foo = array(
+ 'extends' => 'bar',
+ 'class' => 'stdClass',
+ 'params' => array('a' => 'test', 'b' => '456')
+ );
+
+ return array(
+ array(
+ // Does not extend the existing `foo` service but overwrites it
+ array(
+ 'services' => array(
+ 'foo' => $foo,
+ 'bar' => array('params' => array('baz' => '123'))
+ )
+ ),
+ array(
+ 'services' => array(
+ 'foo' => array('class' => 'Baz')
+ )
+ ),
+ array(
+ 'services' => array(
+ 'foo' => array('class' => 'Baz'),
+ 'bar' => array('params' => array('baz' => '123'))
+ )
+ )
+ ),
+ array(
+ // Extends the existing `foo` service
+ array(
+ 'services' => array(
+ 'foo' => $foo,
+ 'bar' => array('params' => array('baz' => '123'))
+ )
+ ),
+ array(
+ 'services' => array(
+ 'foo' => array(
+ 'extends' => 'foo',
+ 'params' => array('b' => '123', 'c' => 'def')
+ )
+ )
+ ),
+ array(
+ 'services' => array(
+ 'foo' => array(
+ 'extends' => 'bar',
+ 'class' => 'stdClass',
+ 'params' => array('a' => 'test', 'b' => '123', 'c' => 'def')
+ ),
+ 'bar' => array('params' => array('baz' => '123'))
+ )
+ )
+ )
+ );
+ }
+
+ /**
+ * @dataProvider configProvider
+ */
+ public function testCombinesConfigs($a, $b, $c)
+ {
+ $l = new ServiceBuilderLoader();
+ $m = new \ReflectionMethod($l, 'mergeData');
+ $m->setAccessible(true);
+ $this->assertEquals($c, $m->invoke($l, $a, $b));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderTest.php
new file mode 100644
index 0000000..e1b3a1d
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderTest.php
@@ -0,0 +1,317 @@
+<?php
+
+namespace Guzzle\Tests\Service;
+
+use Guzzle\Plugin\History\HistoryPlugin;
+use Guzzle\Service\Builder\ServiceBuilder;
+use Guzzle\Service\Client;
+
+/**
+ * @covers Guzzle\Service\Builder\ServiceBuilder
+ */
+class ServiceBuilderTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ protected $arrayData = array(
+ 'michael.mock' => array(
+ 'class' => 'Guzzle\Tests\Service\Mock\MockClient',
+ 'params' => array(
+ 'username' => 'michael',
+ 'password' => 'testing123',
+ 'subdomain' => 'michael',
+ ),
+ ),
+ 'billy.mock' => array(
+ 'alias' => 'Hello!',
+ 'class' => 'Guzzle\Tests\Service\Mock\MockClient',
+ 'params' => array(
+ 'username' => 'billy',
+ 'password' => 'passw0rd',
+ 'subdomain' => 'billy',
+ ),
+ ),
+ 'billy.testing' => array(
+ 'extends' => 'billy.mock',
+ 'params' => array(
+ 'subdomain' => 'test.billy',
+ ),
+ ),
+ 'missing_params' => array(
+ 'extends' => 'billy.mock'
+ )
+ );
+
+ public function testAllowsSerialization()
+ {
+ $builder = ServiceBuilder::factory($this->arrayData);
+ $cached = unserialize(serialize($builder));
+ $this->assertEquals($cached, $builder);
+ }
+
+ public function testDelegatesFactoryMethodToAbstractFactory()
+ {
+ $builder = ServiceBuilder::factory($this->arrayData);
+ $c = $builder->get('michael.mock');
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\MockClient', $c);
+ }
+
+ /**
+ * @expectedException Guzzle\Service\Exception\ServiceNotFoundException
+ * @expectedExceptionMessage No service is registered as foobar
+ */
+ public function testThrowsExceptionWhenGettingInvalidClient()
+ {
+ ServiceBuilder::factory($this->arrayData)->get('foobar');
+ }
+
+ public function testStoresClientCopy()
+ {
+ $builder = ServiceBuilder::factory($this->arrayData);
+ $client = $builder->get('michael.mock');
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\MockClient', $client);
+ $this->assertEquals('http://127.0.0.1:8124/v1/michael', $client->getBaseUrl());
+ $this->assertEquals($client, $builder->get('michael.mock'));
+
+ // Get another client but throw this one away
+ $client2 = $builder->get('billy.mock', true);
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\MockClient', $client2);
+ $this->assertEquals('http://127.0.0.1:8124/v1/billy', $client2->getBaseUrl());
+
+ // Make sure the original client is still there and set
+ $this->assertTrue($client === $builder->get('michael.mock'));
+
+ // Create a new billy.mock client that is stored
+ $client3 = $builder->get('billy.mock');
+
+ // Make sure that the stored billy.mock client is equal to the other stored client
+ $this->assertTrue($client3 === $builder->get('billy.mock'));
+
+ // Make sure that this client is not equal to the previous throwaway client
+ $this->assertFalse($client2 === $builder->get('billy.mock'));
+ }
+
+ public function testBuildersPassOptionsThroughToClients()
+ {
+ $s = new ServiceBuilder(array(
+ 'michael.mock' => array(
+ 'class' => 'Guzzle\Tests\Service\Mock\MockClient',
+ 'params' => array(
+ 'base_url' => 'http://www.test.com/',
+ 'subdomain' => 'michael',
+ 'password' => 'test',
+ 'username' => 'michael',
+ 'curl.curlopt_proxyport' => 8080
+ )
+ )
+ ));
+
+ $c = $s->get('michael.mock');
+ $this->assertEquals(8080, $c->getConfig('curl.curlopt_proxyport'));
+ }
+
+ public function testUsesTheDefaultBuilderWhenNoBuilderIsSpecified()
+ {
+ $s = new ServiceBuilder(array(
+ 'michael.mock' => array(
+ 'class' => 'Guzzle\Tests\Service\Mock\MockClient',
+ 'params' => array(
+ 'base_url' => 'http://www.test.com/',
+ 'subdomain' => 'michael',
+ 'password' => 'test',
+ 'username' => 'michael',
+ 'curl.curlopt_proxyport' => 8080
+ )
+ )
+ ));
+
+ $c = $s->get('michael.mock');
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\MockClient', $c);
+ }
+
+ public function testUsedAsArray()
+ {
+ $b = ServiceBuilder::factory($this->arrayData);
+ $this->assertTrue($b->offsetExists('michael.mock'));
+ $this->assertFalse($b->offsetExists('not_there'));
+ $this->assertInstanceOf('Guzzle\Service\Client', $b['michael.mock']);
+
+ unset($b['michael.mock']);
+ $this->assertFalse($b->offsetExists('michael.mock'));
+
+ $b['michael.mock'] = new Client('http://www.test.com/');
+ $this->assertInstanceOf('Guzzle\Service\Client', $b['michael.mock']);
+ }
+
+ public function testFactoryCanCreateFromJson()
+ {
+ $tmp = sys_get_temp_dir() . '/test.js';
+ file_put_contents($tmp, json_encode($this->arrayData));
+ $b = ServiceBuilder::factory($tmp);
+ unlink($tmp);
+ $s = $b->get('billy.testing');
+ $this->assertEquals('test.billy', $s->getConfig('subdomain'));
+ $this->assertEquals('billy', $s->getConfig('username'));
+ }
+
+ public function testFactoryCanCreateFromArray()
+ {
+ $b = ServiceBuilder::factory($this->arrayData);
+ $s = $b->get('billy.testing');
+ $this->assertEquals('test.billy', $s->getConfig('subdomain'));
+ $this->assertEquals('billy', $s->getConfig('username'));
+ }
+
+ public function testFactoryDoesNotRequireParams()
+ {
+ $b = ServiceBuilder::factory($this->arrayData);
+ $s = $b->get('missing_params');
+ $this->assertEquals('billy', $s->getConfig('username'));
+ }
+
+ public function testBuilderAllowsReferencesBetweenClients()
+ {
+ $builder = ServiceBuilder::factory(array(
+ 'a' => array(
+ 'class' => 'Guzzle\Tests\Service\Mock\MockClient',
+ 'params' => array(
+ 'other_client' => '{b}',
+ 'username' => 'x',
+ 'password' => 'y',
+ 'subdomain' => 'z'
+ )
+ ),
+ 'b' => array(
+ 'class' => 'Guzzle\Tests\Service\Mock\MockClient',
+ 'params' => array(
+ 'username' => '1',
+ 'password' => '2',
+ 'subdomain' => '3'
+ )
+ )
+ ));
+
+ $client = $builder['a'];
+ $this->assertEquals('x', $client->getConfig('username'));
+ $this->assertSame($builder['b'], $client->getConfig('other_client'));
+ $this->assertEquals('1', $builder['b']->getConfig('username'));
+ }
+
+ public function testEmitsEventsWhenClientsAreCreated()
+ {
+ // Ensure that the client signals that it emits an event
+ $this->assertEquals(array('service_builder.create_client'), ServiceBuilder::getAllEvents());
+
+ // Create a test service builder
+ $builder = ServiceBuilder::factory(array(
+ 'a' => array(
+ 'class' => 'Guzzle\Tests\Service\Mock\MockClient',
+ 'params' => array(
+ 'username' => 'test',
+ 'password' => '123',
+ 'subdomain' => 'z'
+ )
+ )
+ ));
+
+ // Add an event listener to pick up client creation events
+ $emits = 0;
+ $builder->getEventDispatcher()->addListener('service_builder.create_client', function($event) use (&$emits) {
+ $emits++;
+ });
+
+ // Get the 'a' client by name
+ $client = $builder->get('a');
+
+ // Ensure that the event was emitted once, and that the client was present
+ $this->assertEquals(1, $emits);
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\MockClient', $client);
+ }
+
+ public function testCanAddGlobalParametersToServicesOnLoad()
+ {
+ $builder = ServiceBuilder::factory($this->arrayData, array(
+ 'username' => 'fred',
+ 'new_value' => 'test'
+ ));
+
+ $data = json_decode($builder->serialize(), true);
+
+ foreach ($data as $service) {
+ $this->assertEquals('fred', $service['params']['username']);
+ $this->assertEquals('test', $service['params']['new_value']);
+ }
+ }
+
+ public function testAddsGlobalPlugins()
+ {
+ $b = new ServiceBuilder($this->arrayData);
+ $b->addGlobalPlugin(new HistoryPlugin());
+ $s = $b->get('michael.mock');
+ $this->assertTrue($s->getEventDispatcher()->hasListeners('request.sent'));
+ }
+
+ public function testCanGetData()
+ {
+ $b = new ServiceBuilder($this->arrayData);
+ $this->assertEquals($this->arrayData['michael.mock'], $b->getData('michael.mock'));
+ $this->assertNull($b->getData('ewofweoweofe'));
+ }
+
+ public function testCanGetByAlias()
+ {
+ $b = new ServiceBuilder($this->arrayData);
+ $this->assertSame($b->get('billy.mock'), $b->get('Hello!'));
+ }
+
+ public function testCanOverwriteParametersForThrowawayClients()
+ {
+ $b = new ServiceBuilder($this->arrayData);
+
+ $c1 = $b->get('michael.mock');
+ $this->assertEquals('michael', $c1->getConfig('username'));
+
+ $c2 = $b->get('michael.mock', array('username' => 'jeremy'));
+ $this->assertEquals('jeremy', $c2->getConfig('username'));
+ }
+
+ public function testGettingAThrowawayClientWithParametersDoesNotAffectGettingOtherClients()
+ {
+ $b = new ServiceBuilder($this->arrayData);
+
+ $c1 = $b->get('michael.mock', array('username' => 'jeremy'));
+ $this->assertEquals('jeremy', $c1->getConfig('username'));
+
+ $c2 = $b->get('michael.mock');
+ $this->assertEquals('michael', $c2->getConfig('username'));
+ }
+
+ public function testCanUseArbitraryData()
+ {
+ $b = new ServiceBuilder();
+ $b['a'] = 'foo';
+ $this->assertTrue(isset($b['a']));
+ $this->assertEquals('foo', $b['a']);
+ unset($b['a']);
+ $this->assertFalse(isset($b['a']));
+ }
+
+ public function testCanRegisterServiceData()
+ {
+ $b = new ServiceBuilder();
+ $b['a'] = array(
+ 'class' => 'Guzzle\Tests\Service\Mock\MockClient',
+ 'params' => array(
+ 'username' => 'billy',
+ 'password' => 'passw0rd',
+ 'subdomain' => 'billy',
+ )
+ );
+ $this->assertTrue(isset($b['a']));
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\MockClient', $b['a']);
+ $client = $b['a'];
+ unset($b['a']);
+ $this->assertFalse(isset($b['a']));
+ // Ensure that instantiated clients can be registered
+ $b['mock'] = $client;
+ $this->assertSame($client, $b['mock']);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/CachingConfigLoaderTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/CachingConfigLoaderTest.php
new file mode 100644
index 0000000..b8245ad
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/CachingConfigLoaderTest.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Guzzle\Tests\Service;
+
+use Guzzle\Cache\DoctrineCacheAdapter;
+use Guzzle\Service\CachingConfigLoader;
+use Doctrine\Common\Cache\ArrayCache;
+
+/**
+ * @covers Guzzle\Service\CachingConfigLoader
+ */
+class CachingConfigLoaderTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testLoadsPhpFileIncludes()
+ {
+ $cache = new DoctrineCacheAdapter(new ArrayCache());
+ $loader = $this->getMockBuilder('Guzzle\Service\ConfigLoaderInterface')
+ ->setMethods(array('load'))
+ ->getMockForAbstractClass();
+ $data = array('foo' => 'bar');
+ $loader->expects($this->once())
+ ->method('load')
+ ->will($this->returnValue($data));
+ $cache = new CachingConfigLoader($loader, $cache);
+ $this->assertEquals($data, $cache->load('foo'));
+ $this->assertEquals($data, $cache->load('foo'));
+ }
+
+ public function testDoesNotCacheArrays()
+ {
+ $cache = new DoctrineCacheAdapter(new ArrayCache());
+ $loader = $this->getMockBuilder('Guzzle\Service\ConfigLoaderInterface')
+ ->setMethods(array('load'))
+ ->getMockForAbstractClass();
+ $data = array('foo' => 'bar');
+ $loader->expects($this->exactly(2))
+ ->method('load')
+ ->will($this->returnValue($data));
+ $cache = new CachingConfigLoader($loader, $cache);
+ $this->assertEquals($data, $cache->load(array()));
+ $this->assertEquals($data, $cache->load(array()));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/ClientTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/ClientTest.php
new file mode 100644
index 0000000..aee29ed
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/ClientTest.php
@@ -0,0 +1,320 @@
+<?php
+
+namespace Guzzle\Tests\Service;
+
+use Guzzle\Inflection\Inflector;
+use Guzzle\Http\Message\Response;
+use Guzzle\Plugin\Mock\MockPlugin;
+use Guzzle\Service\Description\Operation;
+use Guzzle\Service\Client;
+use Guzzle\Service\Exception\CommandTransferException;
+use Guzzle\Service\Description\ServiceDescription;
+use Guzzle\Tests\Service\Mock\Command\MockCommand;
+use Guzzle\Service\Resource\ResourceIteratorClassFactory;
+use Guzzle\Service\Command\AbstractCommand;
+
+/**
+ * @group server
+ * @covers Guzzle\Service\Client
+ */
+class ClientTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ protected $service;
+ protected $serviceTest;
+
+ public function setUp()
+ {
+ $this->serviceTest = new ServiceDescription(array(
+ 'test_command' => new Operation(array(
+ 'doc' => 'documentationForCommand',
+ 'method' => 'DELETE',
+ 'class' => 'Guzzle\\Tests\\Service\\Mock\\Command\\MockCommand',
+ 'args' => array(
+ 'bucket' => array(
+ 'required' => true
+ ),
+ 'key' => array(
+ 'required' => true
+ )
+ )
+ ))
+ ));
+
+ $this->service = ServiceDescription::factory(__DIR__ . '/../TestData/test_service.json');
+ }
+
+ public function testAllowsCustomClientParameters()
+ {
+ $client = new Mock\MockClient(null, array(
+ Client::COMMAND_PARAMS => array(AbstractCommand::RESPONSE_PROCESSING => 'foo')
+ ));
+ $command = $client->getCommand('mock_command');
+ $this->assertEquals('foo', $command->get(AbstractCommand::RESPONSE_PROCESSING));
+ }
+
+ 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'));
+ }
+
+ public function testFactoryDoesNotRequireBaseUrl()
+ {
+ $client = Client::factory();
+ }
+
+ public function testDescribesEvents()
+ {
+ $this->assertInternalType('array', Client::getAllEvents());
+ }
+
+ 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)));
+ }
+
+ public function testExecutesCommandsWithArray()
+ {
+ $client = new Client('http://www.test.com/');
+ $client->getEventDispatcher()->addSubscriber(new MockPlugin(array(
+ new Response(200),
+ new Response(200)
+ )));
+
+ // Create a command set and a command
+ $set = array(new MockCommand(), new MockCommand());
+ $client->execute($set);
+
+ // Make sure it sent
+ $this->assertTrue($set[0]->isExecuted());
+ $this->assertTrue($set[1]->isExecuted());
+ }
+
+ /**
+ * @expectedException Guzzle\Common\Exception\InvalidArgumentException
+ */
+ public function testThrowsExceptionWhenInvalidCommandIsExecuted()
+ {
+ $client = new Client();
+ $client->execute(new \stdClass());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testThrowsExceptionWhenMissingCommand()
+ {
+ $client = new Client();
+
+ $mock = $this->getMock('Guzzle\\Service\\Command\\Factory\\FactoryInterface');
+ $mock->expects($this->any())
+ ->method('factory')
+ ->with($this->equalTo('test'))
+ ->will($this->returnValue(null));
+
+ $client->setCommandFactory($mock);
+ $client->getCommand('test');
+ }
+
+ public function testCreatesCommandsUsingCommandFactory()
+ {
+ $mockCommand = new MockCommand();
+
+ $client = new Mock\MockClient();
+ $mock = $this->getMock('Guzzle\\Service\\Command\\Factory\\FactoryInterface');
+ $mock->expects($this->any())
+ ->method('factory')
+ ->with($this->equalTo('foo'))
+ ->will($this->returnValue($mockCommand));
+
+ $client->setCommandFactory($mock);
+
+ $command = $client->getCommand('foo', array('acl' => '123'));
+ $this->assertSame($mockCommand, $command);
+ $command = $client->getCommand('foo', array('acl' => '123'));
+ $this->assertSame($mockCommand, $command);
+ $this->assertSame($client, $command->getClient());
+ }
+
+ public function testOwnsServiceDescription()
+ {
+ $client = new Mock\MockClient();
+ $this->assertNull($client->getDescription());
+
+ $description = $this->getMock('Guzzle\\Service\\Description\\ServiceDescription');
+ $this->assertSame($client, $client->setDescription($description));
+ $this->assertSame($description, $client->getDescription());
+ }
+
+ public function testOwnsResourceIteratorFactory()
+ {
+ $client = new Mock\MockClient();
+
+ $method = new \ReflectionMethod($client, 'getResourceIteratorFactory');
+ $method->setAccessible(TRUE);
+ $rf1 = $method->invoke($client);
+
+ $rf = $this->readAttribute($client, 'resourceIteratorFactory');
+ $this->assertInstanceOf('Guzzle\\Service\\Resource\\ResourceIteratorClassFactory', $rf);
+ $this->assertSame($rf1, $rf);
+
+ $rf = new ResourceIteratorClassFactory('Guzzle\Tests\Service\Mock');
+ $client->setResourceIteratorFactory($rf);
+ $this->assertNotSame($rf1, $rf);
+ }
+
+ public function testClientResetsRequestsBeforeExecutingCommands()
+ {
+ $this->getServer()->flush();
+ $this->getServer()->enqueue(array(
+ "HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nHi",
+ "HTTP/1.1 200 OK\r\nContent-Length: 1\r\n\r\nI"
+ ));
+
+ $client = new Mock\MockClient($this->getServer()->getUrl());
+
+ $command = $client->getCommand('mock_command');
+ $client->execute($command);
+ $client->execute($command);
+ $this->assertEquals('I', $command->getResponse()->getBody(true));
+ }
+
+ public function testClientCreatesIterators()
+ {
+ $client = new Mock\MockClient();
+
+ $iterator = $client->getIterator('mock_command', array(
+ 'foo' => 'bar'
+ ), array(
+ 'limit' => 10
+ ));
+
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\Model\MockCommandIterator', $iterator);
+ $this->assertEquals(10, $this->readAttribute($iterator, 'limit'));
+
+ $command = $this->readAttribute($iterator, 'originalCommand');
+ $this->assertEquals('bar', $command->get('foo'));
+ }
+
+ public function testClientCreatesIteratorsWithNoOptions()
+ {
+ $client = new Mock\MockClient();
+ $iterator = $client->getIterator('mock_command');
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\Model\MockCommandIterator', $iterator);
+ }
+
+ public function testClientCreatesIteratorsWithCommands()
+ {
+ $client = new Mock\MockClient();
+ $command = new MockCommand();
+ $iterator = $client->getIterator($command);
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\Model\MockCommandIterator', $iterator);
+ $iteratorCommand = $this->readAttribute($iterator, 'originalCommand');
+ $this->assertSame($command, $iteratorCommand);
+ }
+
+ public function testClientHoldsInflector()
+ {
+ $client = new Mock\MockClient();
+ $this->assertInstanceOf('Guzzle\Inflection\MemoizingInflector', $client->getInflector());
+
+ $inflector = new Inflector();
+ $client->setInflector($inflector);
+ $this->assertSame($inflector, $client->getInflector());
+ }
+
+ public function testClientAddsGlobalCommandOptions()
+ {
+ $client = new Mock\MockClient('http://www.foo.com', array(
+ Client::COMMAND_PARAMS => array(
+ 'mesa' => 'bar'
+ )
+ ));
+ $command = $client->getCommand('mock_command');
+ $this->assertEquals('bar', $command->get('mesa'));
+ }
+
+ public function testSupportsServiceDescriptionBaseUrls()
+ {
+ $description = new ServiceDescription(array('baseUrl' => 'http://foo.com'));
+ $client = new Client();
+ $client->setDescription($description);
+ $this->assertEquals('http://foo.com', $client->getBaseUrl());
+ }
+
+ public function testMergesDefaultCommandParamsCorrectly()
+ {
+ $client = new Mock\MockClient('http://www.foo.com', array(
+ Client::COMMAND_PARAMS => array(
+ 'mesa' => 'bar',
+ 'jar' => 'jar'
+ )
+ ));
+ $command = $client->getCommand('mock_command', array('jar' => 'test'));
+ $this->assertEquals('bar', $command->get('mesa'));
+ $this->assertEquals('test', $command->get('jar'));
+ }
+
+ /**
+ * @expectedException \Guzzle\Http\Exception\BadResponseException
+ */
+ public function testWrapsSingleCommandExceptions()
+ {
+ $client = new Mock\MockClient('http://foobaz.com');
+ $mock = new MockPlugin(array(new Response(401)));
+ $client->addSubscriber($mock);
+ $client->execute(new MockCommand());
+ }
+
+ public function testWrapsMultipleCommandExceptions()
+ {
+ $client = new Mock\MockClient('http://foobaz.com');
+ $mock = new MockPlugin(array(new Response(200), new Response(200), new Response(404), new Response(500)));
+ $client->addSubscriber($mock);
+
+ $cmds = array(new MockCommand(), new MockCommand(), new MockCommand(), new MockCommand());
+ try {
+ $client->execute($cmds);
+ } catch (CommandTransferException $e) {
+ $this->assertEquals(2, count($e->getFailedRequests()));
+ $this->assertEquals(2, count($e->getSuccessfulRequests()));
+ $this->assertEquals(2, count($e->getFailedCommands()));
+ $this->assertEquals(2, count($e->getSuccessfulCommands()));
+
+ foreach ($e->getSuccessfulCommands() as $c) {
+ $this->assertTrue($c->getResponse()->isSuccessful());
+ }
+
+ foreach ($e->getFailedCommands() as $c) {
+ $this->assertFalse($c->getRequest()->getResponse()->isSuccessful());
+ }
+ }
+ }
+
+ public function testGetCommandAfterTwoSetDescriptions()
+ {
+ $service1 = ServiceDescription::factory(__DIR__ . '/../TestData/test_service.json');
+ $service2 = ServiceDescription::factory(__DIR__ . '/../TestData/test_service_3.json');
+
+ $client = new Mock\MockClient();
+
+ $client->setDescription($service1);
+ $client->getCommand('foo_bar');
+ $client->setDescription($service2);
+ $client->getCommand('baz_qux');
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/AbstractCommandTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/AbstractCommandTest.php
new file mode 100644
index 0000000..1004fae
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/AbstractCommandTest.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Service\Client;
+use Guzzle\Service\Description\ServiceDescription;
+
+abstract class AbstractCommandTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ protected function getClient()
+ {
+ $client = new Client('http://www.google.com/');
+
+ return $client->setDescription(ServiceDescription::factory(__DIR__ . '/../../TestData/test_service.json'));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/ClosureCommandTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/ClosureCommandTest.php
new file mode 100644
index 0000000..d762246
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/ClosureCommandTest.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Http\Message\RequestFactory;
+use Guzzle\Service\Command\ClosureCommand;
+use Guzzle\Service\Client;
+
+/**
+ * @covers Guzzle\Service\Command\ClosureCommand
+ */
+class ClosureCommandTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ /**
+ * @expectedException InvalidArgumentException
+ * @expectedExceptionMessage A closure must be passed in the parameters array
+ */
+ public function testConstructorValidatesClosure()
+ {
+ $c = new ClosureCommand();
+ }
+
+ public function testExecutesClosure()
+ {
+ $c = new ClosureCommand(array(
+ 'closure' => function($command, $api) {
+ $command->set('testing', '123');
+ $request = RequestFactory::getInstance()->create('GET', 'http://www.test.com/');
+ return $request;
+ }
+ ));
+
+ $client = $this->getServiceBuilder()->get('mock');
+ $c->setClient($client)->prepare();
+ $this->assertEquals('123', $c->get('testing'));
+ $this->assertEquals('http://www.test.com/', $c->getRequest()->getUrl());
+ }
+
+ /**
+ * @expectedException UnexpectedValueException
+ * @expectedExceptionMessage Closure command did not return a RequestInterface object
+ */
+ public function testMustReturnRequest()
+ {
+ $c = new ClosureCommand(array(
+ 'closure' => function($command, $api) {
+ return false;
+ }
+ ));
+
+ $client = $this->getServiceBuilder()->get('mock');
+ $c->setClient($client)->prepare();
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/CommandTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/CommandTest.php
new file mode 100644
index 0000000..b7173d4
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/CommandTest.php
@@ -0,0 +1,445 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Plugin\Mock\MockPlugin;
+use Guzzle\Http\EntityBody;
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Client;
+use Guzzle\Service\Command\AbstractCommand;
+use Guzzle\Service\Description\Operation;
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Service\Description\SchemaValidator;
+use Guzzle\Service\Description\ServiceDescription;
+use Guzzle\Tests\Service\Mock\Command\MockCommand;
+use Guzzle\Tests\Service\Mock\Command\Sub\Sub;
+
+/**
+ * @covers Guzzle\Service\Command\AbstractCommand
+ */
+class CommandTest extends AbstractCommandTest
+{
+ public function testConstructorAddsDefaultParams()
+ {
+ $command = new MockCommand();
+ $this->assertEquals('123', $command->get('test'));
+ $this->assertFalse($command->isPrepared());
+ $this->assertFalse($command->isExecuted());
+ }
+
+ public function testDeterminesShortName()
+ {
+ $api = new Operation(array('name' => 'foobar'));
+ $command = new MockCommand(array(), $api);
+ $this->assertEquals('foobar', $command->getName());
+
+ $command = new MockCommand();
+ $this->assertEquals('mock_command', $command->getName());
+
+ $command = new Sub();
+ $this->assertEquals('sub.sub', $command->getName());
+ }
+
+ /**
+ * @expectedException RuntimeException
+ */
+ public function testGetRequestThrowsExceptionBeforePreparation()
+ {
+ $command = new MockCommand();
+ $command->getRequest();
+ }
+
+ public function testGetResponseExecutesCommandsWhenNeeded()
+ {
+ $response = new Response(200);
+ $client = $this->getClient();
+ $this->setMockResponse($client, array($response));
+ $command = new MockCommand();
+ $command->setClient($client);
+ $this->assertSame($response, $command->getResponse());
+ $this->assertSame($response, $command->getResponse());
+ }
+
+ public function testGetResultExecutesCommandsWhenNeeded()
+ {
+ $response = new Response(200);
+ $client = $this->getClient();
+ $this->setMockResponse($client, array($response));
+ $command = new MockCommand();
+ $command->setClient($client);
+ $this->assertSame($response, $command->getResult());
+ $this->assertSame($response, $command->getResult());
+ }
+
+ public function testSetClient()
+ {
+ $command = new MockCommand();
+ $client = $this->getClient();
+
+ $command->setClient($client);
+ $this->assertEquals($client, $command->getClient());
+
+ unset($client);
+ unset($command);
+
+ $command = new MockCommand();
+ $client = $this->getClient();
+
+ $command->setClient($client)->prepare();
+ $this->assertEquals($client, $command->getClient());
+ $this->assertTrue($command->isPrepared());
+ }
+
+ public function testExecute()
+ {
+ $client = $this->getClient();
+ $response = new Response(200, array(
+ 'Content-Type' => 'application/xml'
+ ), '<xml><data>123</data></xml>');
+ $this->setMockResponse($client, array($response));
+ $command = new MockCommand();
+ $this->assertSame($command, $command->setClient($client));
+
+ // Returns the result of the command
+ $this->assertInstanceOf('SimpleXMLElement', $command->execute());
+
+ $this->assertTrue($command->isPrepared());
+ $this->assertTrue($command->isExecuted());
+ $this->assertSame($response, $command->getResponse());
+ $this->assertInstanceOf('Guzzle\\Http\\Message\\Request', $command->getRequest());
+ // Make sure that the result was automatically set to a SimpleXMLElement
+ $this->assertInstanceOf('SimpleXMLElement', $command->getResult());
+ $this->assertEquals('123', (string) $command->getResult()->data);
+ }
+
+ public function testConvertsJsonResponsesToArray()
+ {
+ $client = $this->getClient();
+ $this->setMockResponse($client, array(
+ new \Guzzle\Http\Message\Response(200, array(
+ 'Content-Type' => 'application/json'
+ ), '{ "key": "Hi!" }'
+ )
+ ));
+ $command = new MockCommand();
+ $command->setClient($client);
+ $command->execute();
+ $this->assertEquals(array(
+ 'key' => 'Hi!'
+ ), $command->getResult());
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\RuntimeException
+ */
+ public function testConvertsInvalidJsonResponsesToArray()
+ {
+ $json = '{ "key": "Hi!" }invalid';
+ // Some implementations of php-json extension are not strict enough
+ // and allow to parse invalid json ignoring invalid parts
+ // See https://github.com/remicollet/pecl-json-c/issues/5
+ if (json_decode($json) && JSON_ERROR_NONE === json_last_error()) {
+ $this->markTestSkipped('php-pecl-json library regression issues');
+ }
+
+ $client = $this->getClient();
+ $this->setMockResponse($client, array(
+ new \Guzzle\Http\Message\Response(200, array(
+ 'Content-Type' => 'application/json'
+ ), $json
+ )
+ ));
+ $command = new MockCommand();
+ $command->setClient($client);
+ $command->execute();
+ }
+
+ public function testProcessResponseIsNotXml()
+ {
+ $client = $this->getClient();
+ $this->setMockResponse($client, array(
+ new Response(200, array(
+ 'Content-Type' => 'application/octet-stream'
+ ), 'abc,def,ghi')
+ ));
+ $command = new MockCommand();
+ $client->execute($command);
+
+ // Make sure that the result was not converted to XML
+ $this->assertFalse($command->getResult() instanceof \SimpleXMLElement);
+ }
+
+ /**
+ * @expectedException RuntimeException
+ */
+ public function testExecuteThrowsExceptionWhenNoClientIsSet()
+ {
+ $command = new MockCommand();
+ $command->execute();
+ }
+
+ /**
+ * @expectedException RuntimeException
+ */
+ public function testPrepareThrowsExceptionWhenNoClientIsSet()
+ {
+ $command = new MockCommand();
+ $command->prepare();
+ }
+
+ public function testCommandsAllowsCustomRequestHeaders()
+ {
+ $command = new MockCommand();
+ $command->getRequestHeaders()->set('test', '123');
+ $this->assertInstanceOf('Guzzle\Common\Collection', $command->getRequestHeaders());
+ $this->assertEquals('123', $command->getRequestHeaders()->get('test'));
+
+ $command->setClient($this->getClient())->prepare();
+ $this->assertEquals('123', (string) $command->getRequest()->getHeader('test'));
+ }
+
+ public function testCommandsAllowsCustomRequestHeadersAsArray()
+ {
+ $command = new MockCommand(array(AbstractCommand::HEADERS_OPTION => array('Foo' => 'Bar')));
+ $this->assertInstanceOf('Guzzle\Common\Collection', $command->getRequestHeaders());
+ $this->assertEquals('Bar', $command->getRequestHeaders()->get('Foo'));
+ }
+
+ private function getOperation()
+ {
+ return new Operation(array(
+ 'name' => 'foobar',
+ 'httpMethod' => 'POST',
+ 'class' => 'Guzzle\\Tests\\Service\\Mock\\Command\\MockCommand',
+ 'parameters' => array(
+ 'test' => array(
+ 'default' => '123',
+ 'type' => 'string'
+ )
+ )));
+ }
+
+ public function testCommandsUsesOperation()
+ {
+ $api = $this->getOperation();
+ $command = new MockCommand(array(), $api);
+ $this->assertSame($api, $command->getOperation());
+ $command->setClient($this->getClient())->prepare();
+ $this->assertEquals('123', $command->get('test'));
+ $this->assertSame($api, $command->getOperation($api));
+ }
+
+ public function testCloneMakesNewRequest()
+ {
+ $client = $this->getClient();
+ $command = new MockCommand(array(), $this->getOperation());
+ $command->setClient($client);
+
+ $command->prepare();
+ $this->assertTrue($command->isPrepared());
+
+ $command2 = clone $command;
+ $this->assertFalse($command2->isPrepared());
+ }
+
+ public function testHasOnCompleteMethod()
+ {
+ $that = $this;
+ $called = 0;
+
+ $testFunction = function($command) use (&$called, $that) {
+ $called++;
+ $that->assertInstanceOf('Guzzle\Service\Command\CommandInterface', $command);
+ };
+
+ $client = $this->getClient();
+ $command = new MockCommand(array(
+ 'command.on_complete' => $testFunction
+ ), $this->getOperation());
+ $command->setClient($client);
+
+ $command->prepare()->setResponse(new Response(200), true);
+ $command->execute();
+ $this->assertEquals(1, $called);
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\InvalidArgumentException
+ */
+ public function testOnCompleteMustBeCallable()
+ {
+ $client = $this->getClient();
+ $command = new MockCommand();
+ $command->setOnComplete('foo');
+ }
+
+ public function testCanSetResultManually()
+ {
+ $client = $this->getClient();
+ $client->getEventDispatcher()->addSubscriber(new MockPlugin(array(
+ new Response(200)
+ )));
+ $command = new MockCommand();
+ $client->execute($command);
+ $command->setResult('foo!');
+ $this->assertEquals('foo!', $command->getResult());
+ }
+
+ public function testCanInitConfig()
+ {
+ $command = $this->getMockBuilder('Guzzle\\Service\\Command\\AbstractCommand')
+ ->setConstructorArgs(array(array(
+ 'foo' => 'bar'
+ ), new Operation(array(
+ 'parameters' => array(
+ 'baz' => new Parameter(array(
+ 'default' => 'baaar'
+ ))
+ )
+ ))))
+ ->getMockForAbstractClass();
+
+ $this->assertEquals('bar', $command['foo']);
+ $this->assertEquals('baaar', $command['baz']);
+ }
+
+ public function testAddsCurlOptionsToRequestsWhenPreparing()
+ {
+ $command = new MockCommand(array(
+ 'foo' => 'bar',
+ 'curl.options' => array('CURLOPT_PROXYPORT' => 8080)
+ ));
+ $client = new Client();
+ $command->setClient($client);
+ $request = $command->prepare();
+ $this->assertEquals(8080, $request->getCurlOptions()->get(CURLOPT_PROXYPORT));
+ }
+
+ public function testIsInvokable()
+ {
+ $client = $this->getClient();
+ $response = new Response(200);
+ $this->setMockResponse($client, array($response));
+ $command = new MockCommand();
+ $command->setClient($client);
+ // Returns the result of the command
+ $this->assertSame($response, $command());
+ }
+
+ public function testCreatesDefaultOperation()
+ {
+ $command = $this->getMockBuilder('Guzzle\Service\Command\AbstractCommand')->getMockForAbstractClass();
+ $this->assertInstanceOf('Guzzle\Service\Description\Operation', $command->getOperation());
+ }
+
+ public function testAllowsValidatorToBeInjected()
+ {
+ $command = $this->getMockBuilder('Guzzle\Service\Command\AbstractCommand')->getMockForAbstractClass();
+ $v = new SchemaValidator();
+ $command->setValidator($v);
+ $this->assertSame($v, $this->readAttribute($command, 'validator'));
+ }
+
+ public function testCanDisableValidation()
+ {
+ $command = new MockCommand();
+ $command->setClient(new \Guzzle\Service\Client());
+ $v = $this->getMockBuilder('Guzzle\Service\Description\SchemaValidator')
+ ->setMethods(array('validate'))
+ ->getMock();
+ $v->expects($this->never())->method('validate');
+ $command->setValidator($v);
+ $command->set(AbstractCommand::DISABLE_VALIDATION, true);
+ $command->prepare();
+ }
+
+ public function testValidatorDoesNotUpdateNonDefaultValues()
+ {
+ $command = new MockCommand(array('test' => 123, 'foo' => 'bar'));
+ $command->setClient(new \Guzzle\Service\Client());
+ $command->prepare();
+ $this->assertEquals(123, $command->get('test'));
+ $this->assertEquals('bar', $command->get('foo'));
+ }
+
+ public function testValidatorUpdatesDefaultValues()
+ {
+ $command = new MockCommand();
+ $command->setClient(new \Guzzle\Service\Client());
+ $command->prepare();
+ $this->assertEquals(123, $command->get('test'));
+ $this->assertEquals('abc', $command->get('_internal'));
+ }
+
+ /**
+ * @expectedException \Guzzle\Service\Exception\ValidationException
+ * @expectedExceptionMessage [Foo] Baz
+ */
+ public function testValidatesCommandBeforeSending()
+ {
+ $command = new MockCommand();
+ $command->setClient(new \Guzzle\Service\Client());
+ $v = $this->getMockBuilder('Guzzle\Service\Description\SchemaValidator')
+ ->setMethods(array('validate', 'getErrors'))
+ ->getMock();
+ $v->expects($this->any())->method('validate')->will($this->returnValue(false));
+ $v->expects($this->any())->method('getErrors')->will($this->returnValue(array('[Foo] Baz', '[Bar] Boo')));
+ $command->setValidator($v);
+ $command->prepare();
+ }
+
+ /**
+ * @expectedException \Guzzle\Service\Exception\ValidationException
+ * @expectedExceptionMessage Validation errors: [abc] must be of type string
+ */
+ public function testValidatesAdditionalParameters()
+ {
+ $description = ServiceDescription::factory(array(
+ 'operations' => array(
+ 'foo' => array(
+ 'parameters' => array(
+ 'baz' => array('type' => 'integer')
+ ),
+ 'additionalParameters' => array(
+ 'type' => 'string'
+ )
+ )
+ )
+ ));
+
+ $client = new Client();
+ $client->setDescription($description);
+ $command = $client->getCommand('foo', array(
+ 'abc' => false,
+ 'command.headers' => array('foo' => 'bar')
+ ));
+ $command->prepare();
+ }
+
+ public function testCanAccessValidationErrorsFromCommand()
+ {
+ $validationErrors = array('[Foo] Baz', '[Bar] Boo');
+ $command = new MockCommand();
+ $command->setClient(new \Guzzle\Service\Client());
+
+ $this->assertFalse($command->getValidationErrors());
+
+ $v = $this->getMockBuilder('Guzzle\Service\Description\SchemaValidator')
+ ->setMethods(array('validate', 'getErrors'))
+ ->getMock();
+ $v->expects($this->any())->method('getErrors')->will($this->returnValue($validationErrors));
+ $command->setValidator($v);
+
+ $this->assertEquals($validationErrors, $command->getValidationErrors());
+ }
+
+ public function testCanChangeResponseBody()
+ {
+ $body = EntityBody::factory();
+ $command = new MockCommand();
+ $command->setClient(new \Guzzle\Service\Client());
+ $command->set(AbstractCommand::RESPONSE_BODY, $body);
+ $request = $command->prepare();
+ $this->assertSame($body, $this->readAttribute($request, 'responseBody'));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultRequestSerializerTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultRequestSerializerTest.php
new file mode 100644
index 0000000..b7a4682
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultRequestSerializerTest.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Service\Command\DefaultRequestSerializer;
+use Guzzle\Http\Message\EntityEnclosingRequest;
+use Guzzle\Service\Client;
+use Guzzle\Service\Description\ServiceDescription;
+use Guzzle\Service\Description\Operation;
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Service\Command\LocationVisitor\Request\HeaderVisitor;
+use Guzzle\Service\Command\LocationVisitor\VisitorFlyweight;
+
+/**
+ * @covers Guzzle\Service\Command\DefaultRequestSerializer
+ */
+class DefaultRequestSerializerTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ /** @var EntityEnclosingRequest */
+ protected $request;
+
+ /** @var \Guzzle\Service\Command\AbstractCommand */
+ protected $command;
+
+ /** @var Client */
+ protected $client;
+
+ /** @var DefaultRequestSerializer */
+ protected $serializer;
+
+ /** @var Operation */
+ protected $operation;
+
+ public function setUp()
+ {
+ $this->serializer = DefaultRequestSerializer::getInstance();
+ $this->client = new Client('http://foo.com/baz');
+ $this->operation = new Operation(array('httpMethod' => 'POST'));
+ $this->command = $this->getMockBuilder('Guzzle\Service\Command\AbstractCommand')
+ ->setConstructorArgs(array(array(), $this->operation))
+ ->getMockForAbstractClass();
+ $this->command->setClient($this->client);
+ }
+
+ public function testAllowsCustomVisitor()
+ {
+ $this->serializer->addVisitor('custom', new HeaderVisitor());
+ $this->command['test'] = '123';
+ $this->operation->addParam(new Parameter(array('name' => 'test', 'location' => 'custom')));
+ $request = $this->serializer->prepare($this->command);
+ $this->assertEquals('123', (string) $request->getHeader('test'));
+ }
+
+ public function testUsesRelativePath()
+ {
+ $this->operation->setUri('bar');
+ $request = $this->serializer->prepare($this->command);
+ $this->assertEquals('http://foo.com/baz/bar', (string) $request->getUrl());
+ }
+
+ public function testUsesRelativePathWithUriLocations()
+ {
+ $this->command['test'] = '123';
+ $this->operation->setUri('bar/{test}');
+ $this->operation->addParam(new Parameter(array('name' => 'test', 'location' => 'uri')));
+ $request = $this->serializer->prepare($this->command);
+ $this->assertEquals('http://foo.com/baz/bar/123', (string) $request->getUrl());
+ }
+
+ public function testAllowsCustomFactory()
+ {
+ $f = new VisitorFlyweight();
+ $serializer = new DefaultRequestSerializer($f);
+ $this->assertSame($f, $this->readAttribute($serializer, 'factory'));
+ }
+
+ public function testMixedParams()
+ {
+ $this->operation->setUri('bar{?limit,fields}');
+ $this->operation->addParam(new Parameter(array(
+ 'name' => 'limit',
+ 'location' => 'uri',
+ 'required' => false,
+ )));
+ $this->operation->addParam(new Parameter(array(
+ 'name' => 'fields',
+ 'location' => 'uri',
+ 'required' => true,
+ )));
+
+ $this->command['fields'] = array('id', 'name');
+
+ $request = $this->serializer->prepare($this->command);
+ $this->assertEquals('http://foo.com/baz/bar?fields='.urlencode('id,name'), (string) $request->getUrl());
+ }
+
+ public function testValidatesAdditionalParameters()
+ {
+ $description = ServiceDescription::factory(array(
+ 'operations' => array(
+ 'foo' => array(
+ 'httpMethod' => 'PUT',
+ 'parameters' => array(
+ 'bar' => array('location' => 'header')
+ ),
+ 'additionalParameters' => array(
+ 'location' => 'json'
+ )
+ )
+ )
+ ));
+
+ $client = new Client();
+ $client->setDescription($description);
+ $command = $client->getCommand('foo');
+ $command['bar'] = 'test';
+ $command['hello'] = 'abc';
+ $request = $command->prepare();
+ $this->assertEquals('test', (string) $request->getHeader('bar'));
+ $this->assertEquals('{"hello":"abc"}', (string) $request->getBody());
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultResponseParserTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultResponseParserTest.php
new file mode 100644
index 0000000..a6a02f9
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultResponseParserTest.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Client;
+use Guzzle\Service\Command\DefaultResponseParser;
+use Guzzle\Service\Command\OperationCommand;
+use Guzzle\Service\Description\Operation;
+
+/**
+ * @covers Guzzle\Service\Command\DefaultResponseParser
+ */
+class DefaultResponseParserTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testParsesXmlResponses()
+ {
+ $op = new OperationCommand(array(), new Operation());
+ $op->setClient(new Client());
+ $request = $op->prepare();
+ $request->setResponse(new Response(200, array(
+ 'Content-Type' => 'application/xml'
+ ), '<Foo><Baz>Bar</Baz></Foo>'), true);
+ $this->assertInstanceOf('SimpleXMLElement', $op->execute());
+ }
+
+ public function testParsesJsonResponses()
+ {
+ $op = new OperationCommand(array(), new Operation());
+ $op->setClient(new Client());
+ $request = $op->prepare();
+ $request->setResponse(new Response(200, array(
+ 'Content-Type' => 'application/json'
+ ), '{"Baz":"Bar"}'), true);
+ $this->assertEquals(array('Baz' => 'Bar'), $op->execute());
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\RuntimeException
+ */
+ public function testThrowsExceptionWhenParsingJsonFails()
+ {
+ $op = new OperationCommand(array(), new Operation());
+ $op->setClient(new Client());
+ $request = $op->prepare();
+ $request->setResponse(new Response(200, array('Content-Type' => 'application/json'), '{"Baz":ddw}'), true);
+ $op->execute();
+ }
+
+ public function testAddsContentTypeWhenExpectsIsSetOnCommand()
+ {
+ $op = new OperationCommand(array(), new Operation());
+ $op['command.expects'] = 'application/json';
+ $op->setClient(new Client());
+ $request = $op->prepare();
+ $request->setResponse(new Response(200, null, '{"Baz":"Bar"}'), true);
+ $this->assertEquals(array('Baz' => 'Bar'), $op->execute());
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/AliasFactoryTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/AliasFactoryTest.php
new file mode 100644
index 0000000..ab1041a
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/AliasFactoryTest.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Service\Client;
+use Guzzle\Service\Command\Factory\AliasFactory;
+use Guzzle\Service\Command\Factory\MapFactory;
+use Guzzle\Service\Command\Factory\CompositeFactory;
+
+/**
+ * @covers Guzzle\Service\Command\Factory\AliasFactory
+ */
+class AliasFactoryTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ private $factory;
+ private $client;
+
+ public function setup()
+ {
+ $this->client = new Client();
+
+ $map = new MapFactory(array(
+ 'test' => 'Guzzle\Tests\Service\Mock\Command\MockCommand',
+ 'test1' => 'Guzzle\Tests\Service\Mock\Command\OtherCommand'
+ ));
+
+ $this->factory = new AliasFactory($this->client, array(
+ 'foo' => 'test',
+ 'bar' => 'sub',
+ 'sub' => 'test1',
+ 'krull' => 'test3',
+ 'krull_2' => 'krull',
+ 'sub_2' => 'bar',
+ 'bad_link' => 'jarjar'
+ ));
+
+ $map2 = new MapFactory(array(
+ 'test3' => 'Guzzle\Tests\Service\Mock\Command\Sub\Sub'
+ ));
+
+ $this->client->setCommandFactory(new CompositeFactory(array($map, $this->factory, $map2)));
+ }
+
+ public function aliasProvider()
+ {
+ return array(
+ array('foo', 'Guzzle\Tests\Service\Mock\Command\MockCommand', false),
+ array('bar', 'Guzzle\Tests\Service\Mock\Command\OtherCommand', false),
+ array('sub', 'Guzzle\Tests\Service\Mock\Command\OtherCommand', false),
+ array('sub_2', 'Guzzle\Tests\Service\Mock\Command\OtherCommand', false),
+ array('krull', 'Guzzle\Tests\Service\Mock\Command\Sub\Sub', false),
+ array('krull_2', 'Guzzle\Tests\Service\Mock\Command\Sub\Sub', false),
+ array('missing', null, true),
+ array('bad_link', null, true)
+ );
+ }
+
+ /**
+ * @dataProvider aliasProvider
+ */
+ public function testAliasesCommands($key, $result, $exception)
+ {
+ try {
+ $command = $this->client->getCommand($key);
+ if (is_null($result)) {
+ $this->assertNull($command);
+ } else {
+ $this->assertInstanceof($result, $command);
+ }
+ } catch (\Exception $e) {
+ if (!$exception) {
+ $this->fail('Got exception when it was not expected');
+ }
+ }
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/CompositeFactoryTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/CompositeFactoryTest.php
new file mode 100644
index 0000000..b896dcf
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/CompositeFactoryTest.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Service\Command\Factory\CompositeFactory;
+
+/**
+ * @covers Guzzle\Service\Command\Factory\CompositeFactory
+ */
+class CompositeFactoryTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ private function getFactory($class = 'Guzzle\\Service\\Command\\Factory\\MapFactory')
+ {
+ return $mock = $this->getMockBuilder($class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ }
+
+ public function testIsIterable()
+ {
+ $factory = new CompositeFactory(array($this->getFactory(), $this->getFactory()));
+ $this->assertEquals(2, count($factory));
+ $this->assertEquals(2, count(iterator_to_array($factory->getIterator())));
+ }
+
+ public function testFindsFactories()
+ {
+ $f1 = $this->getFactory();
+ $f2 = $this->getFactory('Guzzle\\Service\\Command\\Factory\\CompositeFactory');
+ $factory = new CompositeFactory(array($f1, $f2));
+ $this->assertNull($factory->find('foo'));
+ $this->assertNull($factory->find($this->getFactory()));
+ $this->assertSame($f1, $factory->find('Guzzle\\Service\\Command\\Factory\\MapFactory'));
+ $this->assertSame($f2, $factory->find('Guzzle\\Service\\Command\\Factory\\CompositeFactory'));
+ $this->assertSame($f1, $factory->find($f1));
+ $this->assertSame($f2, $factory->find($f2));
+
+ $this->assertFalse($factory->has('foo'));
+ $this->assertTrue($factory->has('Guzzle\\Service\\Command\\Factory\\MapFactory'));
+ $this->assertTrue($factory->has('Guzzle\\Service\\Command\\Factory\\CompositeFactory'));
+ }
+
+ public function testCreatesCommands()
+ {
+ $factory = new CompositeFactory();
+ $this->assertNull($factory->factory('foo'));
+
+ $f1 = $this->getFactory();
+ $mockCommand1 = $this->getMockForAbstractClass('Guzzle\\Service\\Command\\AbstractCommand');
+
+ $f1->expects($this->once())
+ ->method('factory')
+ ->with($this->equalTo('foo'))
+ ->will($this->returnValue($mockCommand1));
+
+ $factory = new CompositeFactory(array($f1));
+ $this->assertSame($mockCommand1, $factory->factory('foo'));
+ }
+
+ public function testAllowsRemovalOfFactories()
+ {
+ $f1 = $this->getFactory();
+ $f2 = $this->getFactory();
+ $f3 = $this->getFactory('Guzzle\\Service\\Command\\Factory\\CompositeFactory');
+ $factories = array($f1, $f2, $f3);
+ $factory = new CompositeFactory($factories);
+
+ $factory->remove('foo');
+ $this->assertEquals($factories, $factory->getIterator()->getArrayCopy());
+
+ $factory->remove($f1);
+ $this->assertEquals(array($f2, $f3), $factory->getIterator()->getArrayCopy());
+
+ $factory->remove('Guzzle\\Service\\Command\\Factory\\MapFactory');
+ $this->assertEquals(array($f3), $factory->getIterator()->getArrayCopy());
+
+ $factory->remove('Guzzle\\Service\\Command\\Factory\\CompositeFactory');
+ $this->assertEquals(array(), $factory->getIterator()->getArrayCopy());
+
+ $factory->remove('foo');
+ $this->assertEquals(array(), $factory->getIterator()->getArrayCopy());
+ }
+
+ public function testAddsFactoriesBeforeAndAtEnd()
+ {
+ $f1 = $this->getFactory();
+ $f2 = $this->getFactory();
+ $f3 = $this->getFactory('Guzzle\\Service\\Command\\Factory\\CompositeFactory');
+ $f4 = $this->getFactory();
+
+ $factory = new CompositeFactory();
+
+ $factory->add($f1);
+ $this->assertEquals(array($f1), $factory->getIterator()->getArrayCopy());
+
+ $factory->add($f2);
+ $this->assertEquals(array($f1, $f2), $factory->getIterator()->getArrayCopy());
+
+ $factory->add($f3, $f2);
+ $this->assertEquals(array($f1, $f3, $f2), $factory->getIterator()->getArrayCopy());
+
+ $factory->add($f4, 'Guzzle\\Service\\Command\\Factory\\CompositeFactory');
+ $this->assertEquals(array($f1, $f4, $f3, $f2), $factory->getIterator()->getArrayCopy());
+ }
+
+ public function testProvidesDefaultChainForClients()
+ {
+ $client = $this->getMock('Guzzle\\Service\\Client');
+ $chain = CompositeFactory::getDefaultChain($client);
+ $a = $chain->getIterator()->getArrayCopy();
+ $this->assertEquals(1, count($a));
+ $this->assertInstanceOf('Guzzle\\Service\\Command\\Factory\\ConcreteClassFactory', $a[0]);
+
+ $description = $this->getMock('Guzzle\\Service\\Description\\ServiceDescription');
+ $client->expects($this->once())
+ ->method('getDescription')
+ ->will($this->returnValue($description));
+ $chain = CompositeFactory::getDefaultChain($client);
+ $a = $chain->getIterator()->getArrayCopy();
+ $this->assertEquals(2, count($a));
+ $this->assertInstanceOf('Guzzle\\Service\\Command\\Factory\\ServiceDescriptionFactory', $a[0]);
+ $this->assertInstanceOf('Guzzle\\Service\\Command\\Factory\\ConcreteClassFactory', $a[1]);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ConcreteClassFactoryTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ConcreteClassFactoryTest.php
new file mode 100644
index 0000000..7664718
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ConcreteClassFactoryTest.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Tests\Service\Mock\MockClient;
+use Guzzle\Service\Command\Factory\ConcreteClassFactory;
+
+/**
+ * @covers Guzzle\Service\Command\Factory\ConcreteClassFactory
+ */
+class ConcreteClassFactoryTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testProvider()
+ {
+ return array(
+ array('foo', null, 'Guzzle\\Tests\\Service\\Mock\\Command\\'),
+ array('mock_command', 'Guzzle\Tests\Service\Mock\Command\MockCommand', 'Guzzle\\Tests\\Service\\Mock\\Command\\'),
+ array('other_command', 'Guzzle\Tests\Service\Mock\Command\OtherCommand', 'Guzzle\\Tests\\Service\\Mock\\Command\\'),
+ array('sub.sub', 'Guzzle\Tests\Service\Mock\Command\Sub\Sub', 'Guzzle\\Tests\\Service\\Mock\\Command\\'),
+ array('sub.sub', null, 'Guzzle\\Foo\\'),
+ array('foo', null, null),
+ array('mock_command', 'Guzzle\Tests\Service\Mock\Command\MockCommand', null),
+ array('other_command', 'Guzzle\Tests\Service\Mock\Command\OtherCommand', null),
+ array('sub.sub', 'Guzzle\Tests\Service\Mock\Command\Sub\Sub', null)
+ );
+ }
+
+ /**
+ * @dataProvider testProvider
+ */
+ public function testCreatesConcreteCommands($key, $result, $prefix)
+ {
+ if (!$prefix) {
+ $client = new MockClient();
+ } else {
+ $client = new MockClient('', array(
+ 'command.prefix' => $prefix
+ ));
+ }
+
+ $factory = new ConcreteClassFactory($client);
+
+ if (is_null($result)) {
+ $this->assertNull($factory->factory($key));
+ } else {
+ $this->assertInstanceof($result, $factory->factory($key));
+ }
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/MapFactoryTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/MapFactoryTest.php
new file mode 100644
index 0000000..ee720d1
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/MapFactoryTest.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Service\Command\Factory\MapFactory;
+
+/**
+ * @covers Guzzle\Service\Command\Factory\MapFactory
+ */
+class MapFactoryTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function mapProvider()
+ {
+ return array(
+ array('foo', null),
+ array('test', 'Guzzle\Tests\Service\Mock\Command\MockCommand'),
+ array('test1', 'Guzzle\Tests\Service\Mock\Command\OtherCommand')
+ );
+ }
+
+ /**
+ * @dataProvider mapProvider
+ */
+ public function testCreatesCommandsUsingMappings($key, $result)
+ {
+ $factory = new MapFactory(array(
+ 'test' => 'Guzzle\Tests\Service\Mock\Command\MockCommand',
+ 'test1' => 'Guzzle\Tests\Service\Mock\Command\OtherCommand'
+ ));
+
+ if (is_null($result)) {
+ $this->assertNull($factory->factory($key));
+ } else {
+ $this->assertInstanceof($result, $factory->factory($key));
+ }
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ServiceDescriptionFactoryTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ServiceDescriptionFactoryTest.php
new file mode 100644
index 0000000..3372634
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ServiceDescriptionFactoryTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Service\Description\ServiceDescription;
+use Guzzle\Service\Command\Factory\ServiceDescriptionFactory;
+use Guzzle\Inflection\Inflector;
+
+/**
+ * @covers Guzzle\Service\Command\Factory\ServiceDescriptionFactory
+ */
+class ServiceDescriptionFactoryTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testProvider()
+ {
+ return array(
+ array('foo', null),
+ array('jar_jar', 'Guzzle\Tests\Service\Mock\Command\MockCommand'),
+ array('binks', 'Guzzle\Tests\Service\Mock\Command\OtherCommand')
+ );
+ }
+
+ /**
+ * @dataProvider testProvider
+ */
+ public function testCreatesCommandsUsingServiceDescriptions($key, $result)
+ {
+ $d = $this->getDescription();
+
+ $factory = new ServiceDescriptionFactory($d);
+ $this->assertSame($d, $factory->getServiceDescription());
+
+ if (is_null($result)) {
+ $this->assertNull($factory->factory($key));
+ } else {
+ $this->assertInstanceof($result, $factory->factory($key));
+ }
+ }
+
+ public function testUsesUcFirstIfNoExactMatch()
+ {
+ $d = $this->getDescription();
+ $factory = new ServiceDescriptionFactory($d, new Inflector());
+ $this->assertInstanceof('Guzzle\Tests\Service\Mock\Command\OtherCommand', $factory->factory('Test'));
+ $this->assertInstanceof('Guzzle\Tests\Service\Mock\Command\OtherCommand', $factory->factory('test'));
+ }
+
+ public function testUsesInflectionIfNoExactMatch()
+ {
+ $d = $this->getDescription();
+ $factory = new ServiceDescriptionFactory($d, new Inflector());
+ $this->assertInstanceof('Guzzle\Tests\Service\Mock\Command\OtherCommand', $factory->factory('Binks'));
+ $this->assertInstanceof('Guzzle\Tests\Service\Mock\Command\OtherCommand', $factory->factory('binks'));
+ $this->assertInstanceof('Guzzle\Tests\Service\Mock\Command\MockCommand', $factory->factory('JarJar'));
+ $this->assertInstanceof('Guzzle\Tests\Service\Mock\Command\MockCommand', $factory->factory('jar_jar'));
+ }
+
+ protected function getDescription()
+ {
+ return ServiceDescription::factory(array(
+ 'operations' => array(
+ 'jar_jar' => array('class' => 'Guzzle\Tests\Service\Mock\Command\MockCommand'),
+ 'binks' => array('class' => 'Guzzle\Tests\Service\Mock\Command\OtherCommand'),
+ 'Test' => array('class' => 'Guzzle\Tests\Service\Mock\Command\OtherCommand')
+ )
+ ));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/AbstractVisitorTestCase.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/AbstractVisitorTestCase.php
new file mode 100644
index 0000000..46b472e
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/AbstractVisitorTestCase.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Request;
+
+use Guzzle\Http\Message\EntityEnclosingRequest;
+use Guzzle\Service\Description\Operation;
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Service\Description\SchemaValidator;
+use Guzzle\Service\Command\OperationCommand;
+use Guzzle\Tests\Service\Mock\Command\MockCommand;
+use Guzzle\Tests\Service\Mock\MockClient;
+
+abstract class AbstractVisitorTestCase extends \Guzzle\Tests\GuzzleTestCase
+{
+ protected $command;
+ protected $request;
+ protected $param;
+ protected $validator;
+
+ public function setUp()
+ {
+ $this->command = new MockCommand();
+ $this->request = new EntityEnclosingRequest('POST', 'http://www.test.com/some/path.php');
+ $this->validator = new SchemaValidator();
+ }
+
+ protected function getCommand($location)
+ {
+ $command = new OperationCommand(array(), $this->getNestedCommand($location));
+ $command->setClient(new MockClient());
+
+ return $command;
+ }
+
+ protected function getNestedCommand($location)
+ {
+ return new Operation(array(
+ 'httpMethod' => 'POST',
+ 'parameters' => array(
+ 'foo' => new Parameter(array(
+ 'type' => 'object',
+ 'location' => $location,
+ 'sentAs' => 'Foo',
+ 'required' => true,
+ 'properties' => array(
+ 'test' => array(
+ 'type' => 'object',
+ 'required' => true,
+ 'properties' => array(
+ 'baz' => array(
+ 'type' => 'boolean',
+ 'default' => true
+ ),
+ 'jenga' => array(
+ 'type' => 'string',
+ 'default' => 'hello',
+ 'sentAs' => 'Jenga_Yall!',
+ 'filters' => array('strtoupper')
+ )
+ )
+ ),
+ 'bar' => array('default' => 123)
+ ),
+ 'additionalProperties' => array(
+ 'type' => 'string',
+ 'filters' => array('strtoupper'),
+ 'location' => $location
+ )
+ )),
+ 'arr' => new Parameter(array(
+ 'type' => 'array',
+ 'location' => $location,
+ 'items' => array(
+ 'type' => 'string',
+ 'filters' => array('strtoupper')
+ )
+ )),
+ )
+ ));
+ }
+
+ protected function getCommandWithArrayParamAndFilters()
+ {
+ $operation = new Operation(array(
+ 'httpMethod' => 'POST',
+ 'parameters' => array(
+ 'foo' => new Parameter(array(
+ 'type' => 'string',
+ 'location' => 'query',
+ 'sentAs' => 'Foo',
+ 'required' => true,
+ 'default' => 'bar',
+ 'filters' => array('strtoupper')
+ )),
+ 'arr' => new Parameter(array(
+ 'type' => 'array',
+ 'location' => 'query',
+ 'sentAs' => 'Arr',
+ 'required' => true,
+ 'default' => array(123, 456, 789),
+ 'filters' => array(array('method' => 'implode', 'args' => array(',', '@value')))
+ ))
+ )
+ ));
+ $command = new OperationCommand(array(), $operation);
+ $command->setClient(new MockClient());
+
+ return $command;
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/BodyVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/BodyVisitorTest.php
new file mode 100644
index 0000000..2a95c45
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/BodyVisitorTest.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Request;
+
+use Guzzle\Http\EntityBody;
+use Guzzle\Service\Command\LocationVisitor\Request\BodyVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\BodyVisitor
+ */
+class BodyVisitorTest extends AbstractVisitorTestCase
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('body')->getParam('foo')->setSentAs('Foo');
+ $visitor->visit($this->command, $this->request, $param, '123');
+ $this->assertEquals('123', (string) $this->request->getBody());
+ $this->assertNull($this->request->getHeader('Expect'));
+ }
+
+ public function testAddsExpectHeaderWhenSetToTrue()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('body')->getParam('foo')->setSentAs('Foo');
+ $param->setData('expect_header', true);
+ $visitor->visit($this->command, $this->request, $param, '123');
+ $this->assertEquals('123', (string) $this->request->getBody());
+ }
+
+ public function testCanDisableExpectHeader()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('body')->getParam('foo')->setSentAs('Foo');
+ $param->setData('expect_header', false);
+ $visitor->visit($this->command, $this->request, $param, '123');
+ $this->assertNull($this->request->getHeader('Expect'));
+ }
+
+ public function testCanSetExpectHeaderBasedOnSize()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('body')->getParam('foo')->setSentAs('Foo');
+ // The body is less than the cutoff
+ $param->setData('expect_header', 5);
+ $visitor->visit($this->command, $this->request, $param, '123');
+ $this->assertNull($this->request->getHeader('Expect'));
+ // Now check when the body is greater than the cutoff
+ $param->setData('expect_header', 2);
+ $visitor->visit($this->command, $this->request, $param, '123');
+ $this->assertEquals('100-Continue', (string) $this->request->getHeader('Expect'));
+ }
+
+ public function testAddsContentEncodingWhenSetOnBody()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('body')->getParam('foo')->setSentAs('Foo');
+ $body = EntityBody::factory('foo');
+ $body->compress();
+ $visitor->visit($this->command, $this->request, $param, $body);
+ $this->assertEquals('gzip', (string) $this->request->getHeader('Content-Encoding'));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/HeaderVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/HeaderVisitorTest.php
new file mode 100644
index 0000000..7ea1ae9
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/HeaderVisitorTest.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Request;
+
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Service\Command\LocationVisitor\Request\HeaderVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\HeaderVisitor
+ */
+class HeaderVisitorTest extends AbstractVisitorTestCase
+{
+ /**
+ * @expectedException \Guzzle\Common\Exception\InvalidArgumentException
+ */
+ public function testValidatesHeaderMapsAreArrays()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('header')->getParam('foo')->setSentAs('test');
+ $param->setAdditionalProperties(new Parameter(array()));
+ $visitor->visit($this->command, $this->request, $param, 'test');
+ }
+
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('header')->getParam('foo')->setSentAs('test');
+ $param->setAdditionalProperties(false);
+ $visitor->visit($this->command, $this->request, $param, '123');
+ $this->assertEquals('123', (string) $this->request->getHeader('test'));
+ }
+
+ public function testVisitsMappedPrefixHeaders()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('header')->getParam('foo')->setSentAs('test');
+ $param->setSentAs('x-foo-');
+ $param->setAdditionalProperties(new Parameter(array(
+ 'type' => 'string'
+ )));
+ $visitor->visit($this->command, $this->request, $param, array(
+ 'bar' => 'test',
+ 'baz' => '123'
+ ));
+ $this->assertEquals('test', (string) $this->request->getHeader('x-foo-bar'));
+ $this->assertEquals('123', (string) $this->request->getHeader('x-foo-baz'));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/JsonVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/JsonVisitorTest.php
new file mode 100644
index 0000000..ea6782f
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/JsonVisitorTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Request;
+
+use Guzzle\Service\Command\LocationVisitor\Request\JsonVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\JsonVisitor
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\AbstractRequestVisitor::resolveRecursively
+ */
+class JsonVisitorTest extends AbstractVisitorTestCase
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ // Test after when no body query values were found
+ $visitor->after($this->command, $this->request);
+
+ $param = $this->getNestedCommand('json')->getParam('foo');
+ $visitor->visit($this->command, $this->request, $param->setSentAs('test'), '123');
+ $visitor->visit($this->command, $this->request, $param->setSentAs('test2'), 'abc');
+ $visitor->after($this->command, $this->request);
+ $this->assertEquals('{"test":"123","test2":"abc"}', (string) $this->request->getBody());
+ }
+
+ public function testAddsJsonHeader()
+ {
+ $visitor = new Visitor();
+ $visitor->setContentTypeHeader('application/json-foo');
+ $param = $this->getNestedCommand('json')->getParam('foo');
+ $visitor->visit($this->command, $this->request, $param->setSentAs('test'), '123');
+ $visitor->after($this->command, $this->request);
+ $this->assertEquals('application/json-foo', (string) $this->request->getHeader('Content-Type'));
+ }
+
+ public function testRecursivelyBuildsJsonBodies()
+ {
+ $command = $this->getCommand('json');
+ $request = $command->prepare();
+ $this->assertEquals('{"Foo":{"test":{"baz":true,"Jenga_Yall!":"HELLO"},"bar":123}}', (string) $request->getBody());
+ }
+
+ public function testAppliesFiltersToAdditionalProperties()
+ {
+ $command = $this->getCommand('json');
+ $command->set('foo', array('not_set' => 'abc'));
+ $request = $command->prepare();
+ $result = json_decode($request->getBody(), true);
+ $this->assertEquals('ABC', $result['Foo']['not_set']);
+ }
+
+ public function testAppliesFiltersToArrayItemValues()
+ {
+ $command = $this->getCommand('json');
+ $command->set('arr', array('a', 'b'));
+ $request = $command->prepare();
+ $result = json_decode($request->getBody(), true);
+ $this->assertEquals(array('A', 'B'), $result['arr']);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFieldVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFieldVisitorTest.php
new file mode 100644
index 0000000..540b410
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFieldVisitorTest.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Request;
+
+use Guzzle\Service\Command\LocationVisitor\Request\PostFieldVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\PostFieldVisitor
+ */
+class PostFieldVisitorTest extends AbstractVisitorTestCase
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('postField')->getParam('foo');
+ $visitor->visit($this->command, $this->request, $param->setSentAs('test'), '123');
+ $this->assertEquals('123', (string) $this->request->getPostField('test'));
+ }
+
+ public function testRecursivelyBuildsPostFields()
+ {
+ $command = $this->getCommand('postField');
+ $request = $command->prepare();
+ $visitor = new Visitor();
+ $param = $command->getOperation()->getParam('foo');
+ $visitor->visit($command, $request, $param, $command['foo']);
+ $visitor->after($command, $request);
+ $this->assertEquals(
+ 'Foo[test][baz]=1&Foo[test][Jenga_Yall!]=HELLO&Foo[bar]=123',
+ rawurldecode((string) $request->getPostFields())
+ );
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFileVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFileVisitorTest.php
new file mode 100644
index 0000000..21e3cec
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFileVisitorTest.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Request;
+
+use Guzzle\Service\Client;
+use Guzzle\Service\Description\ServiceDescription;
+use Guzzle\Http\Message\PostFile;
+use Guzzle\Service\Command\LocationVisitor\Request\PostFileVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\PostFileVisitor
+ */
+class PostFileVisitorTest extends AbstractVisitorTestCase
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('postFile')->getParam('foo');
+
+ // Test using a path to a file
+ $visitor->visit($this->command, $this->request, $param->setSentAs('test_3'), __FILE__);
+ $this->assertInternalType('array', $this->request->getPostFile('test_3'));
+
+ // Test with a PostFile
+ $visitor->visit($this->command, $this->request, $param->setSentAs(null), new PostFile('baz', __FILE__));
+ $this->assertInternalType('array', $this->request->getPostFile('baz'));
+ }
+
+ public function testVisitsLocationWithMultipleFiles()
+ {
+ $description = ServiceDescription::factory(array(
+ 'operations' => array(
+ 'DoPost' => array(
+ 'httpMethod' => 'POST',
+ 'parameters' => array(
+ 'foo' => array(
+ 'location' => 'postFile',
+ 'type' => array('string', 'array')
+ )
+ )
+ )
+ )
+ ));
+ $this->getServer()->flush();
+ $this->getServer()->enqueue(array("HTTP/1.1 200 OK\r\nContent-Length:0\r\n\r\n"));
+ $client = new Client($this->getServer()->getUrl());
+ $client->setDescription($description);
+ $command = $client->getCommand('DoPost', array('foo' => array(__FILE__, __FILE__)));
+ $command->execute();
+ $received = $this->getServer()->getReceivedRequests();
+ $this->assertContains('name="foo[0]";', $received[0]);
+ $this->assertContains('name="foo[1]";', $received[0]);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/QueryVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/QueryVisitorTest.php
new file mode 100644
index 0000000..607af76
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/QueryVisitorTest.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Request;
+
+use Guzzle\Service\Command\LocationVisitor\Request\QueryVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\QueryVisitor
+ */
+class QueryVisitorTest extends AbstractVisitorTestCase
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('query')->getParam('foo')->setSentAs('test');
+ $visitor->visit($this->command, $this->request, $param, '123');
+ $this->assertEquals('123', $this->request->getQuery()->get('test'));
+ }
+
+ /**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\QueryVisitor
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\AbstractRequestVisitor::resolveRecursively
+ */
+ public function testRecursivelyBuildsQueryStrings()
+ {
+ $command = $this->getCommand('query');
+ $command->getOperation()->getParam('foo')->setSentAs('Foo');
+ $request = $command->prepare();
+ $this->assertEquals(
+ 'Foo[test][baz]=1&Foo[test][Jenga_Yall!]=HELLO&Foo[bar]=123',
+ rawurldecode($request->getQuery())
+ );
+ }
+
+ /**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\AbstractRequestVisitor::resolveRecursively
+ */
+ public function testFiltersAreAppliedToArrayParamType()
+ {
+ $command = $this->getCommandWithArrayParamAndFilters();
+ $request = $command->prepare();
+ $query = $request->getQuery();
+ // param type 'string'
+ $this->assertEquals('BAR', $query->get('Foo'));
+ // param type 'array'
+ $this->assertEquals('123,456,789', $query->get('Arr'));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/ResponseBodyVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/ResponseBodyVisitorTest.php
new file mode 100644
index 0000000..ff8cec5
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/ResponseBodyVisitorTest.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Request;
+
+use Guzzle\Service\Command\LocationVisitor\Request\ResponseBodyVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\ResponseBodyVisitor
+ */
+class ResponseBodyVisitorTest extends AbstractVisitorTestCase
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = $this->getNestedCommand('response_body')->getParam('foo');
+ $visitor->visit($this->command, $this->request, $param, sys_get_temp_dir() . '/foo.txt');
+ $body = $this->readAttribute($this->request, 'responseBody');
+ $this->assertContains('/foo.txt', $body->getUri());
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/XmlVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/XmlVisitorTest.php
new file mode 100644
index 0000000..beb58b0
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/XmlVisitorTest.php
@@ -0,0 +1,558 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Request;
+
+use Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor;
+use Guzzle\Service\Client;
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Service\Description\Operation;
+use Guzzle\Http\Message\EntityEnclosingRequest;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor
+ */
+class XmlVisitorTest extends AbstractVisitorTestCase
+{
+ public function xmlProvider()
+ {
+ return array(
+ array(
+ array(
+ 'data' => array(
+ 'xmlRoot' => array(
+ 'name' => 'test',
+ 'namespaces' => 'http://foo.com'
+ )
+ ),
+ 'parameters' => array(
+ 'Foo' => array('location' => 'xml', 'type' => 'string'),
+ 'Baz' => array('location' => 'xml', 'type' => 'string')
+ )
+ ),
+ array('Foo' => 'test', 'Baz' => 'bar'),
+ '<test xmlns="http://foo.com"><Foo>test</Foo><Baz>bar</Baz></test>'
+ ),
+ // Ensure that the content-type is not added
+ array(array('parameters' => array('Foo' => array('location' => 'xml', 'type' => 'string'))), array(), ''),
+ // Test with adding attributes and no namespace
+ array(
+ array(
+ 'data' => array(
+ 'xmlRoot' => array(
+ 'name' => 'test'
+ )
+ ),
+ 'parameters' => array(
+ 'Foo' => array('location' => 'xml', 'type' => 'string', 'data' => array('xmlAttribute' => true))
+ )
+ ),
+ array('Foo' => 'test', 'Baz' => 'bar'),
+ '<test Foo="test"/>'
+ ),
+ // Test adding with an array
+ array(
+ array(
+ 'parameters' => array(
+ 'Foo' => array('location' => 'xml', 'type' => 'string'),
+ 'Baz' => array(
+ 'type' => 'array',
+ 'location' => 'xml',
+ 'items' => array(
+ 'type' => 'numeric',
+ 'sentAs' => 'Bar'
+ )
+ )
+ )
+ ),
+ array('Foo' => 'test', 'Baz' => array(1, 2)),
+ '<Request><Foo>test</Foo><Baz><Bar>1</Bar><Bar>2</Bar></Baz></Request>'
+ ),
+ // Test adding an object
+ array(
+ array(
+ 'parameters' => array(
+ 'Foo' => array('location' => 'xml', 'type' => 'string'),
+ 'Baz' => array(
+ 'type' => 'object',
+ 'location' => 'xml',
+ 'properties' => array(
+ 'Bar' => array('type' => 'string'),
+ 'Bam' => array()
+ )
+ )
+ )
+ ),
+ array('Foo' => 'test', 'Baz' => array('Bar' => 'abc', 'Bam' => 'foo')),
+ '<Request><Foo>test</Foo><Baz><Bar>abc</Bar><Bam>foo</Bam></Baz></Request>'
+ ),
+ // Add an array that contains an object
+ array(
+ array(
+ 'parameters' => array(
+ 'Baz' => array(
+ 'type' => 'array',
+ 'location' => 'xml',
+ 'items' => array(
+ 'type' => 'object',
+ 'sentAs' => 'Bar',
+ 'properties' => array('A' => array(), 'B' => array())
+ )
+ )
+ )
+ ),
+ array('Baz' => array(
+ array('A' => '1', 'B' => '2'),
+ array('A' => '3', 'B' => '4')
+ )),
+ '<Request><Baz><Bar><A>1</A><B>2</B></Bar><Bar><A>3</A><B>4</B></Bar></Baz></Request>'
+ ),
+ // Add an object of attributes
+ array(
+ array(
+ 'parameters' => array(
+ 'Foo' => array('location' => 'xml', 'type' => 'string'),
+ 'Baz' => array(
+ 'type' => 'object',
+ 'location' => 'xml',
+ 'properties' => array(
+ 'Bar' => array('type' => 'string', 'data' => array('xmlAttribute' => true)),
+ 'Bam' => array()
+ )
+ )
+ )
+ ),
+ array('Foo' => 'test', 'Baz' => array('Bar' => 'abc', 'Bam' => 'foo')),
+ '<Request><Foo>test</Foo><Baz Bar="abc"><Bam>foo</Bam></Baz></Request>'
+ ),
+ // Check order doesn't matter
+ array(
+ array(
+ 'parameters' => array(
+ 'Foo' => array('location' => 'xml', 'type' => 'string'),
+ 'Baz' => array(
+ 'type' => 'object',
+ 'location' => 'xml',
+ 'properties' => array(
+ 'Bar' => array('type' => 'string', 'data' => array('xmlAttribute' => true)),
+ 'Bam' => array()
+ )
+ )
+ )
+ ),
+ array('Foo' => 'test', 'Baz' => array('Bam' => 'foo', 'Bar' => 'abc')),
+ '<Request><Foo>test</Foo><Baz Bar="abc"><Bam>foo</Bam></Baz></Request>'
+ ),
+ // Add values with custom namespaces
+ array(
+ array(
+ 'parameters' => array(
+ 'Foo' => array(
+ 'location' => 'xml',
+ 'type' => 'string',
+ 'data' => array(
+ 'xmlNamespace' => 'http://foo.com'
+ )
+ )
+ )
+ ),
+ array('Foo' => 'test'),
+ '<Request><Foo xmlns="http://foo.com">test</Foo></Request>'
+ ),
+ // Add attributes with custom namespace prefix
+ array(
+ array(
+ 'parameters' => array(
+ 'Wrap' => array(
+ 'type' => 'object',
+ 'location' => 'xml',
+ 'properties' => array(
+ 'Foo' => array(
+ 'type' => 'string',
+ 'sentAs' => 'xsi:baz',
+ 'data' => array(
+ 'xmlNamespace' => 'http://foo.com',
+ 'xmlAttribute' => true
+ )
+ )
+ )
+ ),
+ )
+ ),
+ array('Wrap' => array(
+ 'Foo' => 'test'
+ )),
+ '<Request><Wrap xsi:baz="test" xmlns:xsi="http://foo.com"/></Request>'
+ ),
+ // Add nodes with custom namespace prefix
+ array(
+ array(
+ 'parameters' => array(
+ 'Wrap' => array(
+ 'type' => 'object',
+ 'location' => 'xml',
+ 'properties' => array(
+ 'Foo' => array(
+ 'type' => 'string',
+ 'sentAs' => 'xsi:Foo',
+ 'data' => array(
+ 'xmlNamespace' => 'http://foobar.com'
+ )
+ )
+ )
+ ),
+ )
+ ),
+ array('Wrap' => array(
+ 'Foo' => 'test'
+ )),
+ '<Request><Wrap><xsi:Foo xmlns:xsi="http://foobar.com">test</xsi:Foo></Wrap></Request>'
+ ),
+ array(
+ array(
+ 'parameters' => array(
+ 'Foo' => array(
+ 'location' => 'xml',
+ 'type' => 'string',
+ 'data' => array(
+ 'xmlNamespace' => 'http://foo.com'
+ )
+ )
+ )
+ ),
+ array('Foo' => '<h1>This is a title</h1>'),
+ '<Request><Foo xmlns="http://foo.com"><![CDATA[<h1>This is a title</h1>]]></Foo></Request>'
+ ),
+ // Flat array at top level
+ array(
+ array(
+ 'parameters' => array(
+ 'Bars' => array(
+ 'type' => 'array',
+ 'data' => array('xmlFlattened' => true),
+ 'location' => 'xml',
+ 'items' => array(
+ 'type' => 'object',
+ 'sentAs' => 'Bar',
+ 'properties' => array(
+ 'A' => array(),
+ 'B' => array()
+ )
+ )
+ ),
+ 'Boos' => array(
+ 'type' => 'array',
+ 'data' => array('xmlFlattened' => true),
+ 'location' => 'xml',
+ 'items' => array(
+ 'sentAs' => 'Boo',
+ 'type' => 'string'
+ )
+ )
+ )
+ ),
+ array(
+ 'Bars' => array(
+ array('A' => '1', 'B' => '2'),
+ array('A' => '3', 'B' => '4')
+ ),
+ 'Boos' => array('test', '123')
+ ),
+ '<Request><Bar><A>1</A><B>2</B></Bar><Bar><A>3</A><B>4</B></Bar><Boo>test</Boo><Boo>123</Boo></Request>'
+ ),
+ // Nested flat arrays
+ array(
+ array(
+ 'parameters' => array(
+ 'Delete' => array(
+ 'type' => 'object',
+ 'location' => 'xml',
+ 'properties' => array(
+ 'Items' => array(
+ 'type' => 'array',
+ 'data' => array('xmlFlattened' => true),
+ 'items' => array(
+ 'type' => 'object',
+ 'sentAs' => 'Item',
+ 'properties' => array(
+ 'A' => array(),
+ 'B' => array()
+ )
+ )
+ )
+ )
+ )
+ )
+ ),
+ array(
+ 'Delete' => array(
+ 'Items' => array(
+ array('A' => '1', 'B' => '2'),
+ array('A' => '3', 'B' => '4')
+ )
+ )
+ ),
+ '<Request><Delete><Item><A>1</A><B>2</B></Item><Item><A>3</A><B>4</B></Item></Delete></Request>'
+ )
+ );
+ }
+
+ /**
+ * @dataProvider xmlProvider
+ */
+ public function testSerializesXml(array $operation, array $input, $xml)
+ {
+ $operation = new Operation($operation);
+ $command = $this->getMockBuilder('Guzzle\Service\Command\OperationCommand')
+ ->setConstructorArgs(array($input, $operation))
+ ->getMockForAbstractClass();
+ $command->setClient(new Client('http://www.test.com/some/path.php'));
+ $request = $command->prepare();
+ if (!empty($input)) {
+ $this->assertEquals('application/xml', (string) $request->getHeader('Content-Type'));
+ } else {
+ $this->assertNull($request->getHeader('Content-Type'));
+ }
+ $body = str_replace(array("\n", "<?xml version=\"1.0\"?>"), '', (string) $request->getBody());
+ $this->assertEquals($xml, $body);
+ }
+
+ public function testAddsContentTypeAndTopLevelValues()
+ {
+ $operation = new Operation(array(
+ 'data' => array(
+ 'xmlRoot' => array(
+ 'name' => 'test',
+ 'namespaces' => array(
+ 'xsi' => 'http://foo.com'
+ )
+ )
+ ),
+ 'parameters' => array(
+ 'Foo' => array('location' => 'xml', 'type' => 'string'),
+ 'Baz' => array('location' => 'xml', 'type' => 'string')
+ )
+ ));
+
+ $command = $this->getMockBuilder('Guzzle\Service\Command\OperationCommand')
+ ->setConstructorArgs(array(array(
+ 'Foo' => 'test',
+ 'Baz' => 'bar'
+ ), $operation))
+ ->getMockForAbstractClass();
+
+ $command->setClient(new Client());
+ $request = $command->prepare();
+ $this->assertEquals('application/xml', (string) $request->getHeader('Content-Type'));
+ $this->assertEquals(
+ '<?xml version="1.0"?>' . "\n"
+ . '<test xmlns:xsi="http://foo.com"><Foo>test</Foo><Baz>bar</Baz></test>' . "\n",
+ (string) $request->getBody()
+ );
+ }
+
+ public function testCanChangeContentType()
+ {
+ $visitor = new XmlVisitor();
+ $visitor->setContentTypeHeader('application/foo');
+ $this->assertEquals('application/foo', $this->readAttribute($visitor, 'contentType'));
+ }
+
+ public function testCanAddArrayOfSimpleTypes()
+ {
+ $request = new EntityEnclosingRequest('POST', 'http://foo.com');
+ $visitor = new XmlVisitor();
+ $param = new Parameter(array(
+ 'type' => 'object',
+ 'location' => 'xml',
+ 'name' => 'Out',
+ 'properties' => array(
+ 'Nodes' => array(
+ 'required' => true,
+ 'type' => 'array',
+ 'min' => 1,
+ 'items' => array('type' => 'string', 'sentAs' => 'Node')
+ )
+ )
+ ));
+
+ $param->setParent(new Operation(array(
+ 'data' => array(
+ 'xmlRoot' => array(
+ 'name' => 'Test',
+ 'namespaces' => array(
+ 'https://foo/'
+ )
+ )
+ )
+ )));
+
+ $value = array('Nodes' => array('foo', 'baz'));
+ $this->assertTrue($this->validator->validate($param, $value));
+ $visitor->visit($this->command, $request, $param, $value);
+ $visitor->after($this->command, $request);
+
+ $this->assertEquals(
+ "<?xml version=\"1.0\"?>\n"
+ . "<Test xmlns=\"https://foo/\"><Out><Nodes><Node>foo</Node><Node>baz</Node></Nodes></Out></Test>\n",
+ (string) $request->getBody()
+ );
+ }
+
+ public function testCanAddMultipleNamespacesToRoot()
+ {
+ $operation = new Operation(array(
+ 'data' => array(
+ 'xmlRoot' => array(
+ 'name' => 'Hi',
+ 'namespaces' => array(
+ 'xsi' => 'http://foo.com',
+ 'foo' => 'http://foobar.com'
+ )
+ )
+ ),
+ 'parameters' => array(
+ 'Foo' => array('location' => 'xml', 'type' => 'string')
+ )
+ ));
+
+ $command = $this->getMockBuilder('Guzzle\Service\Command\OperationCommand')
+ ->setConstructorArgs(array(array(
+ 'Foo' => 'test'
+ ), $operation))
+ ->getMockForAbstractClass();
+
+ $command->setClient(new Client());
+ $request = $command->prepare();
+ $this->assertEquals('application/xml', (string) $request->getHeader('Content-Type'));
+ $this->assertEquals(
+ '<?xml version="1.0"?>' . "\n"
+ . '<Hi xmlns:xsi="http://foo.com" xmlns:foo="http://foobar.com"><Foo>test</Foo></Hi>' . "\n",
+ (string) $request->getBody()
+ );
+ }
+
+ public function testValuesAreFiltered()
+ {
+ $operation = new Operation(array(
+ 'parameters' => array(
+ 'Foo' => array(
+ 'location' => 'xml',
+ 'type' => 'string',
+ 'filters' => array('strtoupper')
+ ),
+ 'Bar' => array(
+ 'location' => 'xml',
+ 'type' => 'object',
+ 'properties' => array(
+ 'Baz' => array(
+ 'filters' => array('strtoupper')
+ )
+ )
+ )
+ )
+ ));
+
+ $command = $this->getMockBuilder('Guzzle\Service\Command\OperationCommand')
+ ->setConstructorArgs(array(array(
+ 'Foo' => 'test',
+ 'Bar' => array(
+ 'Baz' => 'abc'
+ )
+ ), $operation))
+ ->getMockForAbstractClass();
+
+ $command->setClient(new Client());
+ $request = $command->prepare();
+ $this->assertEquals(
+ '<?xml version="1.0"?>' . "\n"
+ . '<Request><Foo>TEST</Foo><Bar><Baz>ABC</Baz></Bar></Request>' . "\n",
+ (string) $request->getBody()
+ );
+ }
+
+ public function testSkipsNullValues()
+ {
+ $operation = new Operation(array(
+ 'parameters' => array(
+ 'Foo' => array(
+ 'location' => 'xml',
+ 'type' => 'string'
+ ),
+ 'Bar' => array(
+ 'location' => 'xml',
+ 'type' => 'object',
+ 'properties' => array(
+ 'Baz' => array(),
+ 'Bam' => array(),
+ )
+ ),
+ 'Arr' => array(
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'string'
+ )
+ )
+ )
+ ));
+
+ $command = $this->getMockBuilder('Guzzle\Service\Command\OperationCommand')
+ ->setConstructorArgs(array(array(
+ 'Foo' => null,
+ 'Bar' => array(
+ 'Bar' => null,
+ 'Bam' => 'test'
+ ),
+ 'Arr' => array(null)
+ ), $operation))
+ ->getMockForAbstractClass();
+
+ $command->setClient(new Client());
+ $request = $command->prepare();
+ $this->assertEquals(
+ '<?xml version="1.0"?>' . "\n"
+ . '<Request><Bar><Bam>test</Bam></Bar></Request>' . "\n",
+ (string) $request->getBody()
+ );
+ }
+
+ public function testAllowsXmlEncoding()
+ {
+ $operation = new Operation(array(
+ 'data' => array(
+ 'xmlEncoding' => 'UTF-8'
+ ),
+ 'parameters' => array(
+ 'Foo' => array('location' => 'xml')
+ )
+ ));
+ $command = $this->getMockBuilder('Guzzle\Service\Command\OperationCommand')
+ ->setConstructorArgs(array(array('Foo' => 'test'), $operation))
+ ->getMockForAbstractClass();
+ $command->setClient(new Client());
+ $request = $command->prepare();
+ $this->assertEquals(
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n"
+ . '<Request><Foo>test</Foo></Request>' . "\n",
+ (string) $request->getBody()
+ );
+ }
+
+ public function testAllowsSendingXmlPayloadIfNoXmlParamsWereSet()
+ {
+ $operation = new Operation(array(
+ 'httpMethod' => 'POST',
+ 'data' => array('xmlAllowEmpty' => true),
+ 'parameters' => array('Foo' => array('location' => 'xml'))
+ ));
+ $command = $this->getMockBuilder('Guzzle\Service\Command\OperationCommand')
+ ->setConstructorArgs(array(array(), $operation))
+ ->getMockForAbstractClass();
+ $command->setClient(new Client('http://foo.com'));
+ $request = $command->prepare();
+ $this->assertEquals(
+ '<?xml version="1.0"?>' . "\n"
+ . '<Request/>' . "\n",
+ (string) $request->getBody()
+ );
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/AbstractResponseVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/AbstractResponseVisitorTest.php
new file mode 100644
index 0000000..7b86003
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/AbstractResponseVisitorTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Response;
+
+use Guzzle\Tests\Service\Mock\Command\MockCommand;
+use Guzzle\Http\Message\Response;
+
+abstract class AbstractResponseVisitorTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ /** @var Response */
+ protected $response;
+
+ /** @var MockCommand */
+ protected $command;
+
+ /** @var array */
+ protected $value;
+
+ public function setUp()
+ {
+ $this->value = array();
+ $this->command = new MockCommand();
+ $this->response = new Response(200, array(
+ 'X-Foo' => 'bar',
+ 'Content-Length' => 3,
+ 'Content-Type' => 'text/plain'
+ ), 'Foo');
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/BodyVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/BodyVisitorTest.php
new file mode 100644
index 0000000..932e39b
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/BodyVisitorTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Response;
+
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Command\LocationVisitor\Response\BodyVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Response\BodyVisitor
+ */
+class BodyVisitorTest extends AbstractResponseVisitorTest
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array('location' => 'body', 'name' => 'foo'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals('Foo', (string) $this->value['foo']);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/HeaderVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/HeaderVisitorTest.php
new file mode 100644
index 0000000..db54b1a
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/HeaderVisitorTest.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Response;
+
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Command\LocationVisitor\Response\HeaderVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Response\HeaderVisitor
+ */
+class HeaderVisitorTest extends AbstractResponseVisitorTest
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'location' => 'header',
+ 'name' => 'ContentType',
+ 'sentAs' => 'Content-Type'
+ ));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals('text/plain', $this->value['ContentType']);
+ }
+
+ public function testVisitsLocationWithFilters()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'location' => 'header',
+ 'name' => 'Content-Type',
+ 'filters' => array('strtoupper')
+ ));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals('TEXT/PLAIN', $this->value['Content-Type']);
+ }
+
+ public function testVisitsMappedPrefixHeaders()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'location' => 'header',
+ 'name' => 'Metadata',
+ 'sentAs' => 'X-Baz-',
+ 'type' => 'object',
+ 'additionalProperties' => array(
+ 'type' => 'string'
+ )
+ ));
+ $response = new Response(200, array(
+ 'X-Baz-Test' => 'ABC',
+ 'X-Baz-Bar' => array('123', '456'),
+ 'Content-Length' => 3
+ ), 'Foo');
+ $visitor->visit($this->command, $response, $param, $this->value);
+ $this->assertEquals(array(
+ 'Metadata' => array(
+ 'Test' => 'ABC',
+ 'Bar' => array('123', '456')
+ )
+ ), $this->value);
+ }
+
+ /**
+ * @group issue-399
+ * @link https://github.com/guzzle/guzzle/issues/399
+ */
+ public function testDiscardingUnknownHeaders()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'location' => 'header',
+ 'name' => 'Content-Type',
+ 'additionalParameters' => false
+ ));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals('text/plain', $this->value['Content-Type']);
+ $this->assertArrayNotHasKey('X-Foo', $this->value);
+ }
+
+ /**
+ * @group issue-399
+ * @link https://github.com/guzzle/guzzle/issues/399
+ */
+ public function testDiscardingUnknownPropertiesWithAliasing()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'location' => 'header',
+ 'name' => 'ContentType',
+ 'sentAs' => 'Content-Type',
+ 'additionalParameters' => false
+ ));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals('text/plain', $this->value['ContentType']);
+ $this->assertArrayNotHasKey('X-Foo', $this->value);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/JsonVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/JsonVisitorTest.php
new file mode 100644
index 0000000..4f8d30b
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/JsonVisitorTest.php
@@ -0,0 +1,157 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Response;
+
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Command\LocationVisitor\Response\JsonVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Response\JsonVisitor
+ */
+class JsonVisitorTest extends AbstractResponseVisitorTest
+{
+ public function testBeforeMethodParsesXml()
+ {
+ $visitor = new Visitor();
+ $command = $this->getMockBuilder('Guzzle\Service\Command\AbstractCommand')
+ ->setMethods(array('getResponse'))
+ ->getMockForAbstractClass();
+ $command->expects($this->once())
+ ->method('getResponse')
+ ->will($this->returnValue(new Response(200, null, '{"foo":"bar"}')));
+ $result = array();
+ $visitor->before($command, $result);
+ $this->assertEquals(array('foo' => 'bar'), $result);
+ }
+
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'array',
+ 'items' => array(
+ 'filters' => 'strtoupper',
+ 'type' => 'string'
+ )
+ ));
+ $this->value = array('foo' => array('a', 'b', 'c'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals(array('A', 'B', 'C'), $this->value['foo']);
+ }
+
+ public function testRenamesTopLevelValues()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'sentAs' => 'Baz',
+ 'type' => 'string',
+ ));
+ $this->value = array('Baz' => 'test');
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals(array('foo' => 'test'), $this->value);
+ }
+
+ public function testRenamesDoesNotFailForNonExistentKey()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'properties' => array(
+ 'bar' => array(
+ 'name' => 'bar',
+ 'sentAs' => 'baz',
+ ),
+ ),
+ ));
+ $this->value = array('foo' => array('unknown' => 'Unknown'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals(array('foo' => array('unknown' => 'Unknown')), $this->value);
+ }
+
+ public function testTraversesObjectsAndAppliesFilters()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'properties' => array(
+ 'foo' => array('filters' => 'strtoupper'),
+ 'bar' => array('filters' => 'strtolower')
+ )
+ ));
+ $this->value = array('foo' => array('foo' => 'hello', 'bar' => 'THERE'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals(array('foo' => 'HELLO', 'bar' => 'there'), $this->value['foo']);
+ }
+
+ /**
+ * @group issue-399
+ * @link https://github.com/guzzle/guzzle/issues/399
+ */
+ public function testDiscardingUnknownProperties()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'additionalProperties' => false,
+ 'properties' => array(
+ 'bar' => array(
+ 'type' => 'string',
+ 'name' => 'bar',
+ ),
+ ),
+ ));
+ $this->value = array('foo' => array('bar' => 15, 'unknown' => 'Unknown'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals(array('foo' => array('bar' => 15)), $this->value);
+ }
+
+ /**
+ * @group issue-399
+ * @link https://github.com/guzzle/guzzle/issues/399
+ */
+ public function testDiscardingUnknownPropertiesWithAliasing()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'additionalProperties' => false,
+ 'properties' => array(
+ 'bar' => array(
+ 'name' => 'bar',
+ 'sentAs' => 'baz',
+ ),
+ ),
+ ));
+ $this->value = array('foo' => array('baz' => 15, 'unknown' => 'Unknown'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals(array('foo' => array('bar' => 15)), $this->value);
+ }
+
+ public function testWalksAdditionalProperties()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'additionalProperties' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'bar' => array(
+ 'type' => 'string',
+ 'filters' => array('base64_decode')
+ )
+ ),
+ ),
+ ));
+ $this->value = array('foo' => array('baz' => array('bar' => 'Zm9v')));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals('foo', $this->value['foo']['baz']['bar']);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/ReasonPhraseVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/ReasonPhraseVisitorTest.php
new file mode 100644
index 0000000..23cd40f
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/ReasonPhraseVisitorTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Response;
+
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Command\LocationVisitor\Response\ReasonPhraseVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Response\ReasonPhraseVisitor
+ */
+class ReasonPhraseVisitorTest extends AbstractResponseVisitorTest
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array('location' => 'reasonPhrase', 'name' => 'phrase'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals('OK', $this->value['phrase']);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/StatusCodeVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/StatusCodeVisitorTest.php
new file mode 100644
index 0000000..7211a58
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/StatusCodeVisitorTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Response;
+
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Command\LocationVisitor\Response\StatusCodeVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Response\StatusCodeVisitor
+ */
+class StatusCodeVisitorTest extends AbstractResponseVisitorTest
+{
+ public function testVisitsLocation()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array('location' => 'statusCode', 'name' => 'code'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals(200, $this->value['code']);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/XmlVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/XmlVisitorTest.php
new file mode 100644
index 0000000..f87cec7
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/XmlVisitorTest.php
@@ -0,0 +1,431 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command\LocationVisitor\Response;
+
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Command\LocationVisitor\Response\XmlVisitor as Visitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\Response\XmlVisitor
+ */
+class XmlVisitorTest extends AbstractResponseVisitorTest
+{
+ public function testBeforeMethodParsesXml()
+ {
+ $visitor = new Visitor();
+ $command = $this->getMockBuilder('Guzzle\Service\Command\AbstractCommand')
+ ->setMethods(array('getResponse'))
+ ->getMockForAbstractClass();
+ $command->expects($this->once())
+ ->method('getResponse')
+ ->will($this->returnValue(new Response(200, null, '<foo><Bar>test</Bar></foo>')));
+ $result = array();
+ $visitor->before($command, $result);
+ $this->assertEquals(array('Bar' => 'test'), $result);
+ }
+
+ public function testBeforeMethodParsesXmlWithNamespace()
+ {
+ $this->markTestSkipped("Response/XmlVisitor cannot accept 'xmlns' in response, see #368 (http://git.io/USa1mA).");
+
+ $visitor = new Visitor();
+ $command = $this->getMockBuilder('Guzzle\Service\Command\AbstractCommand')
+ ->setMethods(array('getResponse'))
+ ->getMockForAbstractClass();
+ $command->expects($this->once())
+ ->method('getResponse')
+ ->will($this->returnValue(new Response(200, null, '<foo xmlns="urn:foo"><bar:Bar xmlns:bar="urn:bar">test</bar:Bar></foo>')));
+ $result = array();
+ $visitor->before($command, $result);
+ $this->assertEquals(array('Bar' => 'test'), $result);
+ }
+
+ public function testBeforeMethodParsesNestedXml()
+ {
+ $visitor = new Visitor();
+ $command = $this->getMockBuilder('Guzzle\Service\Command\AbstractCommand')
+ ->setMethods(array('getResponse'))
+ ->getMockForAbstractClass();
+ $command->expects($this->once())
+ ->method('getResponse')
+ ->will($this->returnValue(new Response(200, null, '<foo><Items><Bar>test</Bar></Items></foo>')));
+ $result = array();
+ $visitor->before($command, $result);
+ $this->assertEquals(array('Items' => array('Bar' => 'test')), $result);
+ }
+
+ public function testCanExtractAndRenameTopLevelXmlValues()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'location' => 'xml',
+ 'name' => 'foo',
+ 'sentAs' => 'Bar'
+ ));
+ $value = array('Bar' => 'test');
+ $visitor->visit($this->command, $this->response, $param, $value);
+ $this->assertArrayHasKey('foo', $value);
+ $this->assertEquals('test', $value['foo']);
+ }
+
+ public function testEnsuresRepeatedArraysAreInCorrectLocations()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'location' => 'xml',
+ 'name' => 'foo',
+ 'sentAs' => 'Foo',
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'Bar' => array('type' => 'string'),
+ 'Baz' => array('type' => 'string'),
+ 'Bam' => array('type' => 'string')
+ )
+ )
+ ));
+
+ $xml = new \SimpleXMLElement('<Test><Foo><Bar>1</Bar><Baz>2</Baz></Foo></Test>');
+ $value = json_decode(json_encode($xml), true);
+ $visitor->visit($this->command, $this->response, $param, $value);
+ $this->assertEquals(array(
+ 'foo' => array(
+ array (
+ 'Bar' => '1',
+ 'Baz' => '2'
+ )
+ )
+ ), $value);
+ }
+
+ public function testEnsuresFlatArraysAreFlat()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'location' => 'xml',
+ 'name' => 'foo',
+ 'type' => 'array',
+ 'items' => array('type' => 'string')
+ ));
+
+ $value = array('foo' => array('bar', 'baz'));
+ $visitor->visit($this->command, $this->response, $param, $value);
+ $this->assertEquals(array('foo' => array('bar', 'baz')), $value);
+
+ $value = array('foo' => 'bar');
+ $visitor->visit($this->command, $this->response, $param, $value);
+ $this->assertEquals(array('foo' => array('bar')), $value);
+ }
+
+ public function xmlDataProvider()
+ {
+ $param = new Parameter(array(
+ 'location' => 'xml',
+ 'name' => 'Items',
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'object',
+ 'name' => 'Item',
+ 'properties' => array(
+ 'Bar' => array('type' => 'string'),
+ 'Baz' => array('type' => 'string')
+ )
+ )
+ ));
+
+ return array(
+ array($param, '<Test><Items><Item><Bar>1</Bar></Item><Item><Bar>2</Bar></Item></Items></Test>', array(
+ 'Items' => array(
+ array('Bar' => 1),
+ array('Bar' => 2)
+ )
+ )),
+ array($param, '<Test><Items><Item><Bar>1</Bar></Item></Items></Test>', array(
+ 'Items' => array(
+ array('Bar' => 1)
+ )
+ )),
+ array($param, '<Test><Items /></Test>', array(
+ 'Items' => array()
+ ))
+ );
+ }
+
+ /**
+ * @dataProvider xmlDataProvider
+ */
+ public function testEnsuresWrappedArraysAreInCorrectLocations($param, $xml, $result)
+ {
+ $visitor = new Visitor();
+ $xml = new \SimpleXMLElement($xml);
+ $value = json_decode(json_encode($xml), true);
+ $visitor->visit($this->command, $this->response, $param, $value);
+ $this->assertEquals($result, $value);
+ }
+
+ public function testCanRenameValues()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'TerminatingInstances',
+ 'type' => 'array',
+ 'location' => 'xml',
+ 'sentAs' => 'instancesSet',
+ 'items' => array(
+ 'name' => 'item',
+ 'type' => 'object',
+ 'sentAs' => 'item',
+ 'properties' => array(
+ 'InstanceId' => array(
+ 'type' => 'string',
+ 'sentAs' => 'instanceId',
+ ),
+ 'CurrentState' => array(
+ 'type' => 'object',
+ 'sentAs' => 'currentState',
+ 'properties' => array(
+ 'Code' => array(
+ 'type' => 'numeric',
+ 'sentAs' => 'code',
+ ),
+ 'Name' => array(
+ 'type' => 'string',
+ 'sentAs' => 'name',
+ ),
+ ),
+ ),
+ 'PreviousState' => array(
+ 'type' => 'object',
+ 'sentAs' => 'previousState',
+ 'properties' => array(
+ 'Code' => array(
+ 'type' => 'numeric',
+ 'sentAs' => 'code',
+ ),
+ 'Name' => array(
+ 'type' => 'string',
+ 'sentAs' => 'name',
+ ),
+ ),
+ ),
+ ),
+ )
+ ));
+
+ $value = array(
+ 'instancesSet' => array (
+ 'item' => array (
+ 'instanceId' => 'i-3ea74257',
+ 'currentState' => array(
+ 'code' => '32',
+ 'name' => 'shutting-down',
+ ),
+ 'previousState' => array(
+ 'code' => '16',
+ 'name' => 'running',
+ ),
+ ),
+ )
+ );
+
+ $visitor->visit($this->command, $this->response, $param, $value);
+
+ $this->assertEquals(array(
+ 'TerminatingInstances' => array(
+ array(
+ 'InstanceId' => 'i-3ea74257',
+ 'CurrentState' => array(
+ 'Code' => '32',
+ 'Name' => 'shutting-down',
+ ),
+ 'PreviousState' => array(
+ 'Code' => '16',
+ 'Name' => 'running',
+ )
+ )
+ )
+ ), $value);
+ }
+
+ public function testCanRenameAttributes()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'RunningQueues',
+ 'type' => 'array',
+ 'location' => 'xml',
+ 'items' => array(
+ 'type' => 'object',
+ 'sentAs' => 'item',
+ 'properties' => array(
+ 'QueueId' => array(
+ 'type' => 'string',
+ 'sentAs' => 'queue_id',
+ 'data' => array(
+ 'xmlAttribute' => true,
+ ),
+ ),
+ 'CurrentState' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'Code' => array(
+ 'type' => 'numeric',
+ 'sentAs' => 'code',
+ 'data' => array(
+ 'xmlAttribute' => true,
+ ),
+ ),
+ 'Name' => array(
+ 'sentAs' => 'name',
+ 'data' => array(
+ 'xmlAttribute' => true,
+ ),
+ ),
+ ),
+ ),
+ 'PreviousState' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'Code' => array(
+ 'type' => 'numeric',
+ 'sentAs' => 'code',
+ 'data' => array(
+ 'xmlAttribute' => true,
+ ),
+ ),
+ 'Name' => array(
+ 'sentAs' => 'name',
+ 'data' => array(
+ 'xmlAttribute' => true,
+ ),
+ ),
+ ),
+ ),
+ ),
+ )
+ ));
+
+ $xml = '<wrap><RunningQueues><item queue_id="q-3ea74257"><CurrentState code="32" name="processing" /><PreviousState code="16" name="wait" /></item></RunningQueues></wrap>';
+ $value = json_decode(json_encode(new \SimpleXMLElement($xml)), true);
+ $visitor->visit($this->command, $this->response, $param, $value);
+
+ $this->assertEquals(array(
+ 'RunningQueues' => array(
+ array(
+ 'QueueId' => 'q-3ea74257',
+ 'CurrentState' => array(
+ 'Code' => '32',
+ 'Name' => 'processing',
+ ),
+ 'PreviousState' => array(
+ 'Code' => '16',
+ 'Name' => 'wait',
+ ),
+ ),
+ )
+ ), $value);
+ }
+
+ public function testAddsEmptyArraysWhenValueIsMissing()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'Foo',
+ 'type' => 'array',
+ 'location' => 'xml',
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'Baz' => array('type' => 'array'),
+ 'Bar' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'Baz' => array('type' => 'array'),
+ )
+ )
+ )
+ )
+ ));
+
+ $value = array();
+ $visitor->visit($this->command, $this->response, $param, $value);
+
+ $value = array(
+ 'Foo' => array(
+ 'Bar' => array()
+ )
+ );
+ $visitor->visit($this->command, $this->response, $param, $value);
+ $this->assertEquals(array(
+ 'Foo' => array(
+ array(
+ 'Bar' => array()
+ )
+ )
+ ), $value);
+ }
+
+ /**
+ * @group issue-399
+ * @link https://github.com/guzzle/guzzle/issues/399
+ */
+ public function testDiscardingUnknownProperties()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'additionalProperties' => false,
+ 'properties' => array(
+ 'bar' => array(
+ 'type' => 'string',
+ 'name' => 'bar',
+ ),
+ ),
+ ));
+ $this->value = array('foo' => array('bar' => 15, 'unknown' => 'Unknown'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals(array('foo' => array('bar' => 15)), $this->value);
+ }
+
+ /**
+ * @group issue-399
+ * @link https://github.com/guzzle/guzzle/issues/399
+ */
+ public function testDiscardingUnknownPropertiesWithAliasing()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'additionalProperties' => false,
+ 'properties' => array(
+ 'bar' => array(
+ 'name' => 'bar',
+ 'sentAs' => 'baz',
+ ),
+ ),
+ ));
+ $this->value = array('foo' => array('baz' => 15, 'unknown' => 'Unknown'));
+ $visitor->visit($this->command, $this->response, $param, $this->value);
+ $this->assertEquals(array('foo' => array('bar' => 15)), $this->value);
+ }
+
+ public function testProperlyHandlesEmptyStringValues()
+ {
+ $visitor = new Visitor();
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'properties' => array(
+ 'bar' => array('type' => 'string')
+ ),
+ ));
+ $xml = '<wrapper><foo><bar /></foo></wrapper>';
+ $value = json_decode(json_encode(new \SimpleXMLElement($xml)), true);
+ $visitor->visit($this->command, $this->response, $param, $value);
+ $this->assertEquals(array('foo' => array('bar' => '')), $value);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/VisitorFlyweightTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/VisitorFlyweightTest.php
new file mode 100644
index 0000000..a252ffe
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/VisitorFlyweightTest.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Service\Command\LocationVisitor\VisitorFlyweight;
+use Guzzle\Service\Command\LocationVisitor\Request\JsonVisitor as JsonRequestVisitor;
+use Guzzle\Service\Command\LocationVisitor\Response\JsonVisitor as JsonResponseVisitor;
+
+/**
+ * @covers Guzzle\Service\Command\LocationVisitor\VisitorFlyweight
+ */
+class VisitorFlyweightTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testUsesDefaultMappingsWithGetInstance()
+ {
+ $f = VisitorFlyweight::getInstance();
+ $this->assertInstanceOf('Guzzle\Service\Command\LocationVisitor\Request\JsonVisitor', $f->getRequestVisitor('json'));
+ $this->assertInstanceOf('Guzzle\Service\Command\LocationVisitor\Response\JsonVisitor', $f->getResponseVisitor('json'));
+ }
+
+ public function testCanUseCustomMappings()
+ {
+ $f = new VisitorFlyweight(array());
+ $this->assertEquals(array(), $this->readAttribute($f, 'mappings'));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage No request visitor has been mapped for foo
+ */
+ public function testThrowsExceptionWhenRetrievingUnknownVisitor()
+ {
+ VisitorFlyweight::getInstance()->getRequestVisitor('foo');
+ }
+
+ public function testCachesVisitors()
+ {
+ $f = new VisitorFlyweight();
+ $v1 = $f->getRequestVisitor('json');
+ $this->assertSame($v1, $f->getRequestVisitor('json'));
+ }
+
+ public function testAllowsAddingVisitors()
+ {
+ $f = new VisitorFlyweight();
+ $j1 = new JsonRequestVisitor();
+ $j2 = new JsonResponseVisitor();
+ $f->addRequestVisitor('json', $j1);
+ $f->addResponseVisitor('json', $j2);
+ $this->assertSame($j1, $f->getRequestVisitor('json'));
+ $this->assertSame($j2, $f->getResponseVisitor('json'));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationCommandTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationCommandTest.php
new file mode 100644
index 0000000..95fb533
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationCommandTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Http\Message\EntityEnclosingRequest;
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Client;
+use Guzzle\Service\Command\OperationCommand;
+use Guzzle\Service\Description\Operation;
+use Guzzle\Service\Description\ServiceDescription;
+use Guzzle\Service\Command\DefaultRequestSerializer;
+use Guzzle\Service\Resource\Model;
+use Guzzle\Service\Command\LocationVisitor\VisitorFlyweight;
+
+/**
+ * @covers Guzzle\Service\Command\OperationCommand
+ */
+class OperationCommandTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testHasRequestSerializer()
+ {
+ $operation = new OperationCommand();
+ $a = $operation->getRequestSerializer();
+ $b = new DefaultRequestSerializer(VisitorFlyweight::getInstance());
+ $operation->setRequestSerializer($b);
+ $this->assertNotSame($a, $operation->getRequestSerializer());
+ }
+
+ public function testPreparesRequestUsingSerializer()
+ {
+ $op = new OperationCommand(array(), new Operation());
+ $op->setClient(new Client());
+ $s = $this->getMockBuilder('Guzzle\Service\Command\RequestSerializerInterface')
+ ->setMethods(array('prepare'))
+ ->getMockForAbstractClass();
+ $s->expects($this->once())
+ ->method('prepare')
+ ->will($this->returnValue(new EntityEnclosingRequest('POST', 'http://foo.com')));
+ $op->setRequestSerializer($s);
+ $op->prepare();
+ }
+
+ public function testParsesResponsesWithResponseParser()
+ {
+ $op = new OperationCommand(array(), new Operation());
+ $p = $this->getMockBuilder('Guzzle\Service\Command\ResponseParserInterface')
+ ->setMethods(array('parse'))
+ ->getMockForAbstractClass();
+ $p->expects($this->once())
+ ->method('parse')
+ ->will($this->returnValue(array('foo' => 'bar')));
+ $op->setResponseParser($p);
+ $op->setClient(new Client());
+ $request = $op->prepare();
+ $request->setResponse(new Response(200), true);
+ $this->assertEquals(array('foo' => 'bar'), $op->execute());
+ }
+
+ public function testParsesResponsesUsingModelParserWhenMatchingModelIsFound()
+ {
+ $description = ServiceDescription::factory(array(
+ 'operations' => array(
+ 'foo' => array('responseClass' => 'bar', 'responseType' => 'model')
+ ),
+ 'models' => array(
+ 'bar' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'Baz' => array('type' => 'string', 'location' => 'xml')
+ )
+ )
+ )
+ ));
+
+ $op = new OperationCommand(array(), $description->getOperation('foo'));
+ $op->setClient(new Client());
+ $request = $op->prepare();
+ $request->setResponse(new Response(200, array(
+ 'Content-Type' => 'application/xml'
+ ), '<Foo><Baz>Bar</Baz></Foo>'), true);
+ $result = $op->execute();
+ $this->assertEquals(new Model(array('Baz' => 'Bar')), $result);
+ }
+
+ public function testAllowsRawResponses()
+ {
+ $description = new ServiceDescription(array(
+ 'operations' => array('foo' => array('responseClass' => 'bar', 'responseType' => 'model')),
+ 'models' => array('bar' => array())
+ ));
+ $op = new OperationCommand(array(
+ OperationCommand::RESPONSE_PROCESSING => OperationCommand::TYPE_RAW
+ ), $description->getOperation('foo'));
+ $op->setClient(new Client());
+ $request = $op->prepare();
+ $response = new Response(200, array(
+ 'Content-Type' => 'application/xml'
+ ), '<Foo><Baz>Bar</Baz></Foo>');
+ $request->setResponse($response, true);
+ $this->assertSame($response, $op->execute());
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationResponseParserTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationResponseParserTest.php
new file mode 100644
index 0000000..69ba1fc
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationResponseParserTest.php
@@ -0,0 +1,335 @@
+<?php
+
+namespace Guzzle\Tests\Service\Command;
+
+use Guzzle\Http\Message\Response;
+use Guzzle\Service\Client;
+use Guzzle\Service\Command\OperationResponseParser;
+use Guzzle\Service\Command\OperationCommand;
+use Guzzle\Service\Description\Operation;
+use Guzzle\Service\Description\ServiceDescription;
+use Guzzle\Service\Command\LocationVisitor\Response\StatusCodeVisitor;
+use Guzzle\Service\Command\LocationVisitor\Response\ReasonPhraseVisitor;
+use Guzzle\Service\Command\LocationVisitor\Response\JsonVisitor;
+use Guzzle\Service\Command\LocationVisitor\Response\BodyVisitor;
+use Guzzle\Service\Command\LocationVisitor\VisitorFlyweight;
+
+/**
+ * @covers Guzzle\Service\Command\OperationResponseParser
+ * @covers Guzzle\Service\Command\CreateResponseClassEvent
+ */
+class OperationResponseParserTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testHasVisitors()
+ {
+ $p = new OperationResponseParser(new VisitorFlyweight(array()));
+ $visitor = new BodyVisitor();
+ $p->addVisitor('foo', $visitor);
+ $this->assertSame($visitor, $this->readAttribute($p, 'factory')->getResponseVisitor('foo'));
+ }
+
+ public function testUsesParentParser()
+ {
+ $p = new OperationResponseParser(new VisitorFlyweight());
+ $operation = new Operation();
+ $operation->setServiceDescription(new ServiceDescription());
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($p)->setClient(new Client());
+ $op->prepare()->setResponse(new Response(200, array('Content-Type' => 'application/xml'), '<F><B>C</B></F>'), true);
+ $this->assertInstanceOf('SimpleXMLElement', $op->execute());
+ }
+
+ public function testVisitsLocations()
+ {
+ $parser = new OperationResponseParser(new VisitorFlyweight(array()));
+ $parser->addVisitor('statusCode', new StatusCodeVisitor());
+ $parser->addVisitor('reasonPhrase', new ReasonPhraseVisitor());
+ $parser->addVisitor('json', new JsonVisitor());
+ $op = new OperationCommand(array(), $this->getDescription()->getOperation('test'));
+ $op->setResponseParser($parser)->setClient(new Client());
+ $op->prepare()->setResponse(new Response(201), true);
+ $result = $op->execute();
+ $this->assertEquals(201, $result['code']);
+ $this->assertEquals('Created', $result['phrase']);
+ }
+
+ public function testVisitsLocationsForJsonResponse()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $operation = $this->getDescription()->getOperation('test');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $op->prepare()->setResponse(new Response(200, array(
+ 'Content-Type' => 'application/json'
+ ), '{"baz":"bar","enigma":"123"}'), true);
+ $result = $op->execute();
+ $this->assertEquals(array(
+ 'baz' => 'bar',
+ 'enigma' => '123',
+ 'code' => 200,
+ 'phrase' => 'OK'
+ ), $result->toArray());
+ }
+
+ public function testSkipsUnkownModels()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $operation = $this->getDescription()->getOperation('test');
+ $operation->setResponseClass('Baz')->setResponseType('model');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $op->prepare()->setResponse(new Response(201), true);
+ $this->assertInstanceOf('Guzzle\Http\Message\Response', $op->execute());
+ }
+
+ public function testAllowsModelProcessingToBeDisabled()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $operation = $this->getDescription()->getOperation('test');
+ $op = new OperationCommand(array('command.response_processing' => 'native'), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $op->prepare()->setResponse(new Response(200, array(
+ 'Content-Type' => 'application/json'
+ ), '{"baz":"bar","enigma":"123"}'), true);
+ $result = $op->execute();
+ $this->assertInstanceOf('Guzzle\Service\Resource\Model', $result);
+ $this->assertEquals(array(
+ 'baz' => 'bar',
+ 'enigma' => '123'
+ ), $result->toArray());
+ }
+
+ public function testCanInjectModelSchemaIntoModels()
+ {
+ $parser = new OperationResponseParser(VisitorFlyweight::getInstance(), true);
+ $desc = $this->getDescription();
+ $operation = $desc->getOperation('test');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $op->prepare()->setResponse(new Response(200, array(
+ 'Content-Type' => 'application/json'
+ ), '{"baz":"bar","enigma":"123"}'), true);
+ $result = $op->execute();
+ $this->assertSame($result->getStructure(), $desc->getModel('Foo'));
+ }
+
+ public function testDoesNotParseXmlWhenNotUsingXmlVisitor()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $description = ServiceDescription::factory(array(
+ 'operations' => array('test' => array('responseClass' => 'Foo')),
+ 'models' => array(
+ 'Foo' => array(
+ 'type' => 'object',
+ 'properties' => array('baz' => array('location' => 'body'))
+ )
+ )
+ ));
+ $operation = $description->getOperation('test');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $brokenXml = '<broken><><><<xml>>>>>';
+ $op->prepare()->setResponse(new Response(200, array(
+ 'Content-Type' => 'application/xml'
+ ), $brokenXml), true);
+ $result = $op->execute();
+ $this->assertEquals(array('baz'), $result->getKeys());
+ $this->assertEquals($brokenXml, (string) $result['baz']);
+ }
+
+ public function testVisitsAdditionalProperties()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $description = ServiceDescription::factory(array(
+ 'operations' => array('test' => array('responseClass' => 'Foo')),
+ 'models' => array(
+ 'Foo' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'code' => array('location' => 'statusCode')
+ ),
+ 'additionalProperties' => array(
+ 'location' => 'json',
+ 'type' => 'object',
+ 'properties' => array(
+ 'a' => array(
+ 'type' => 'string',
+ 'filters' => 'strtoupper'
+ )
+ )
+ )
+ )
+ )
+ ));
+
+ $operation = $description->getOperation('test');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $json = '[{"a":"test"},{"a":"baz"}]';
+ $op->prepare()->setResponse(new Response(200, array('Content-Type' => 'application/json'), $json), true);
+ $result = $op->execute()->toArray();
+ $this->assertEquals(array(
+ 'code' => 200,
+ array('a' => 'TEST'),
+ array('a' => 'BAZ')
+ ), $result);
+ }
+
+ /**
+ * @group issue-399
+ * @link https://github.com/guzzle/guzzle/issues/399
+ */
+ public function testAdditionalPropertiesDisabledDiscardsData()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $description = ServiceDescription::factory(array(
+ 'operations' => array('test' => array('responseClass' => 'Foo')),
+ 'models' => array(
+ 'Foo' => array(
+ 'type' => 'object',
+ 'additionalProperties' => false,
+ 'properties' => array(
+ 'name' => array(
+ 'location' => 'json',
+ 'type' => 'string',
+ ),
+ 'nested' => array(
+ 'location' => 'json',
+ 'type' => 'object',
+ 'additionalProperties' => false,
+ 'properties' => array(
+ 'width' => array(
+ 'type' => 'integer'
+ )
+ ),
+ ),
+ 'code' => array('location' => 'statusCode')
+ ),
+
+ )
+ )
+ ));
+
+ $operation = $description->getOperation('test');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $json = '{"name":"test", "volume":2.0, "nested":{"width":10,"bogus":1}}';
+ $op->prepare()->setResponse(new Response(200, array('Content-Type' => 'application/json'), $json), true);
+ $result = $op->execute()->toArray();
+ $this->assertEquals(array(
+ 'name' => 'test',
+ 'nested' => array(
+ 'width' => 10,
+ ),
+ 'code' => 200
+ ), $result);
+ }
+
+ public function testCreatesCustomResponseClassInterface()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $description = ServiceDescription::factory(array(
+ 'operations' => array('test' => array('responseClass' => 'Guzzle\Tests\Mock\CustomResponseModel'))
+ ));
+ $operation = $description->getOperation('test');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $op->prepare()->setResponse(new Response(200, array('Content-Type' => 'application/json'), 'hi!'), true);
+ $result = $op->execute();
+ $this->assertInstanceOf('Guzzle\Tests\Mock\CustomResponseModel', $result);
+ $this->assertSame($op, $result->command);
+ }
+
+ /**
+ * @expectedException \Guzzle\Service\Exception\ResponseClassException
+ * @expectedExceptionMessage must exist
+ */
+ public function testEnsuresResponseClassExists()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $description = ServiceDescription::factory(array(
+ 'operations' => array('test' => array('responseClass' => 'Foo\Baz\Bar'))
+ ));
+ $operation = $description->getOperation('test');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $op->prepare()->setResponse(new Response(200, array('Content-Type' => 'application/json'), 'hi!'), true);
+ $op->execute();
+ }
+
+ /**
+ * @expectedException \Guzzle\Service\Exception\ResponseClassException
+ * @expectedExceptionMessage and implement
+ */
+ public function testEnsuresResponseClassImplementsResponseClassInterface()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $description = ServiceDescription::factory(array(
+ 'operations' => array('test' => array('responseClass' => __CLASS__))
+ ));
+ $operation = $description->getOperation('test');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $op->prepare()->setResponse(new Response(200, array('Content-Type' => 'application/json'), 'hi!'), true);
+ $op->execute();
+ }
+
+ protected function getDescription()
+ {
+ return ServiceDescription::factory(array(
+ 'operations' => array('test' => array('responseClass' => 'Foo')),
+ 'models' => array(
+ 'Foo' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'baz' => array('type' => 'string', 'location' => 'json'),
+ 'code' => array('location' => 'statusCode'),
+ 'phrase' => array('location' => 'reasonPhrase'),
+ )
+ )
+ )
+ ));
+ }
+
+ public function testCanAddListenerToParseDomainObjects()
+ {
+ $client = new Client();
+ $client->setDescription(ServiceDescription::factory(array(
+ 'operations' => array('test' => array('responseClass' => 'FooBazBar'))
+ )));
+ $foo = new \stdClass();
+ $client->getEventDispatcher()->addListener('command.parse_response', function ($e) use ($foo) {
+ $e['result'] = $foo;
+ });
+ $command = $client->getCommand('test');
+ $command->prepare()->setResponse(new Response(200), true);
+ $result = $command->execute();
+ $this->assertSame($result, $foo);
+ }
+
+ /**
+ * @group issue-399
+ * @link https://github.com/guzzle/guzzle/issues/501
+ */
+ public function testAdditionalPropertiesWithRefAreResolved()
+ {
+ $parser = OperationResponseParser::getInstance();
+ $description = ServiceDescription::factory(array(
+ 'operations' => array('test' => array('responseClass' => 'Foo')),
+ 'models' => array(
+ 'Baz' => array('type' => 'string'),
+ 'Foo' => array(
+ 'type' => 'object',
+ 'additionalProperties' => array('$ref' => 'Baz', 'location' => 'json')
+ )
+ )
+ ));
+ $operation = $description->getOperation('test');
+ $op = new OperationCommand(array(), $operation);
+ $op->setResponseParser($parser)->setClient(new Client());
+ $json = '{"a":"a","b":"b","c":"c"}';
+ $op->prepare()->setResponse(new Response(200, array('Content-Type' => 'application/json'), $json), true);
+ $result = $op->execute()->toArray();
+ $this->assertEquals(array('a' => 'a', 'b' => 'b', 'c' => 'c'), $result);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/OperationTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/OperationTest.php
new file mode 100644
index 0000000..ae33b69
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/OperationTest.php
@@ -0,0 +1,308 @@
+<?php
+
+namespace Guzzle\Tests\Service\Description;
+
+use Guzzle\Service\Description\Operation;
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Service\Description\ServiceDescription;
+
+/**
+ * @covers Guzzle\Service\Description\Operation
+ */
+class OperationTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public static function strtoupper($string)
+ {
+ return strtoupper($string);
+ }
+
+ public function testOperationIsDataObject()
+ {
+ $c = new Operation(array(
+ 'name' => 'test',
+ 'summary' => 'doc',
+ 'notes' => 'notes',
+ 'documentationUrl' => 'http://www.example.com',
+ 'httpMethod' => 'POST',
+ 'uri' => '/api/v1',
+ 'responseClass' => 'array',
+ 'responseNotes' => 'returns the json_decoded response',
+ 'deprecated' => true,
+ 'parameters' => array(
+ 'key' => array(
+ 'required' => true,
+ 'type' => 'string',
+ 'maxLength' => 10
+ ),
+ 'key_2' => array(
+ 'required' => true,
+ 'type' => 'integer',
+ 'default' => 10
+ )
+ )
+ ));
+
+ $this->assertEquals('test', $c->getName());
+ $this->assertEquals('doc', $c->getSummary());
+ $this->assertEquals('http://www.example.com', $c->getDocumentationUrl());
+ $this->assertEquals('POST', $c->getHttpMethod());
+ $this->assertEquals('/api/v1', $c->getUri());
+ $this->assertEquals('array', $c->getResponseClass());
+ $this->assertEquals('returns the json_decoded response', $c->getResponseNotes());
+ $this->assertTrue($c->getDeprecated());
+ $this->assertEquals('Guzzle\\Service\\Command\\OperationCommand', $c->getClass());
+ $this->assertEquals(array(
+ 'key' => new Parameter(array(
+ 'name' => 'key',
+ 'required' => true,
+ 'type' => 'string',
+ 'maxLength' => 10,
+ 'parent' => $c
+ )),
+ 'key_2' => new Parameter(array(
+ 'name' => 'key_2',
+ 'required' => true,
+ 'type' => 'integer',
+ 'default' => 10,
+ 'parent' => $c
+ ))
+ ), $c->getParams());
+
+ $this->assertEquals(new Parameter(array(
+ 'name' => 'key_2',
+ 'required' => true,
+ 'type' => 'integer',
+ 'default' => 10,
+ 'parent' => $c
+ )), $c->getParam('key_2'));
+
+ $this->assertNull($c->getParam('afefwef'));
+ $this->assertArrayNotHasKey('parent', $c->getParam('key_2')->toArray());
+ }
+
+ public function testAllowsConcreteCommands()
+ {
+ $c = new Operation(array(
+ 'name' => 'test',
+ 'class' => 'Guzzle\\Service\\Command\ClosureCommand',
+ 'parameters' => array(
+ 'p' => new Parameter(array(
+ 'name' => 'foo'
+ ))
+ )
+ ));
+ $this->assertEquals('Guzzle\\Service\\Command\ClosureCommand', $c->getClass());
+ }
+
+ public function testConvertsToArray()
+ {
+ $data = array(
+ 'name' => 'test',
+ 'class' => 'Guzzle\\Service\\Command\ClosureCommand',
+ 'summary' => 'test',
+ 'documentationUrl' => 'http://www.example.com',
+ 'httpMethod' => 'PUT',
+ 'uri' => '/',
+ 'parameters' => array('p' => array('name' => 'foo'))
+ );
+ $c = new Operation($data);
+ $toArray = $c->toArray();
+ unset($data['name']);
+ $this->assertArrayHasKey('parameters', $toArray);
+ $this->assertInternalType('array', $toArray['parameters']);
+
+ // Normalize the array
+ unset($data['parameters']);
+ unset($toArray['parameters']);
+
+ $data['responseType'] = 'primitive';
+ $data['responseClass'] = 'array';
+ $this->assertEquals($data, $toArray);
+ }
+
+ public function testDeterminesIfHasParam()
+ {
+ $command = $this->getTestCommand();
+ $this->assertTrue($command->hasParam('data'));
+ $this->assertFalse($command->hasParam('baz'));
+ }
+
+ public function testReturnsParamNames()
+ {
+ $command = $this->getTestCommand();
+ $this->assertEquals(array('data'), $command->getParamNames());
+ }
+
+ protected function getTestCommand()
+ {
+ return new Operation(array(
+ 'parameters' => array(
+ 'data' => new Parameter(array(
+ 'type' => 'string'
+ ))
+ )
+ ));
+ }
+
+ public function testCanBuildUpCommands()
+ {
+ $c = new Operation(array());
+ $c->setName('foo')
+ ->setClass('Baz')
+ ->setDeprecated(false)
+ ->setSummary('summary')
+ ->setDocumentationUrl('http://www.foo.com')
+ ->setHttpMethod('PUT')
+ ->setResponseNotes('oh')
+ ->setResponseClass('string')
+ ->setUri('/foo/bar')
+ ->addParam(new Parameter(array(
+ 'name' => 'test'
+ )));
+
+ $this->assertEquals('foo', $c->getName());
+ $this->assertEquals('Baz', $c->getClass());
+ $this->assertEquals(false, $c->getDeprecated());
+ $this->assertEquals('summary', $c->getSummary());
+ $this->assertEquals('http://www.foo.com', $c->getDocumentationUrl());
+ $this->assertEquals('PUT', $c->getHttpMethod());
+ $this->assertEquals('oh', $c->getResponseNotes());
+ $this->assertEquals('string', $c->getResponseClass());
+ $this->assertEquals('/foo/bar', $c->getUri());
+ $this->assertEquals(array('test'), $c->getParamNames());
+ }
+
+ public function testCanRemoveParams()
+ {
+ $c = new Operation(array());
+ $c->addParam(new Parameter(array('name' => 'foo')));
+ $this->assertTrue($c->hasParam('foo'));
+ $c->removeParam('foo');
+ $this->assertFalse($c->hasParam('foo'));
+ }
+
+ public function testAddsNameToParametersIfNeeded()
+ {
+ $command = new Operation(array('parameters' => array('foo' => new Parameter(array()))));
+ $this->assertEquals('foo', $command->getParam('foo')->getName());
+ }
+
+ public function testContainsApiErrorInformation()
+ {
+ $command = $this->getOperation();
+ $this->assertEquals(1, count($command->getErrorResponses()));
+ $arr = $command->toArray();
+ $this->assertEquals(1, count($arr['errorResponses']));
+ $command->addErrorResponse(400, 'Foo', 'Baz\\Bar');
+ $this->assertEquals(2, count($command->getErrorResponses()));
+ $command->setErrorResponses(array());
+ $this->assertEquals(0, count($command->getErrorResponses()));
+ }
+
+ public function testHasNotes()
+ {
+ $o = new Operation(array('notes' => 'foo'));
+ $this->assertEquals('foo', $o->getNotes());
+ $o->setNotes('bar');
+ $this->assertEquals('bar', $o->getNotes());
+ }
+
+ public function testHasData()
+ {
+ $o = new Operation(array('data' => array('foo' => 'baz', 'bar' => 123)));
+ $o->setData('test', false);
+ $this->assertEquals('baz', $o->getData('foo'));
+ $this->assertEquals(123, $o->getData('bar'));
+ $this->assertNull($o->getData('wfefwe'));
+ $this->assertEquals(array(
+ 'parameters' => array(),
+ 'class' => 'Guzzle\Service\Command\OperationCommand',
+ 'data' => array('foo' => 'baz', 'bar' => 123, 'test' => false),
+ 'responseClass' => 'array',
+ 'responseType' => 'primitive'
+ ), $o->toArray());
+ }
+
+ public function testHasServiceDescription()
+ {
+ $s = new ServiceDescription();
+ $o = new Operation(array(), $s);
+ $this->assertSame($s, $o->getServiceDescription());
+ }
+
+ /**
+ * @expectedException Guzzle\Common\Exception\InvalidArgumentException
+ */
+ public function testValidatesResponseType()
+ {
+ $o = new Operation(array('responseClass' => 'array', 'responseType' => 'foo'));
+ }
+
+ public function testInfersResponseType()
+ {
+ $o = $this->getOperation();
+ $o->setServiceDescription(new ServiceDescription(array('models' => array('Foo' => array()))));
+ $this->assertEquals('primitive', $o->getResponseType());
+ $this->assertEquals('primitive', $o->setResponseClass('boolean')->getResponseType());
+ $this->assertEquals('primitive', $o->setResponseClass('array')->getResponseType());
+ $this->assertEquals('primitive', $o->setResponseClass('integer')->getResponseType());
+ $this->assertEquals('primitive', $o->setResponseClass('string')->getResponseType());
+ $this->assertEquals('class', $o->setResponseClass('foo')->getResponseType());
+ $this->assertEquals('class', $o->setResponseClass(__CLASS__)->getResponseType());
+ $this->assertEquals('model', $o->setResponseClass('Foo')->getResponseType());
+ }
+
+ public function testHasResponseType()
+ {
+ // infers in the constructor
+ $o = new Operation(array('responseClass' => 'array'));
+ $this->assertEquals('primitive', $o->getResponseType());
+ // Infers when set
+ $o = new Operation();
+ $this->assertEquals('primitive', $o->getResponseType());
+ $this->assertEquals('model', $o->setResponseType('model')->getResponseType());
+ }
+
+ public function testHasAdditionalParameters()
+ {
+ $o = new Operation(array(
+ 'additionalParameters' => array(
+ 'type' => 'string', 'name' => 'binks'
+ ),
+ 'parameters' => array(
+ 'foo' => array('type' => 'integer')
+ )
+ ));
+ $this->assertEquals('string', $o->getAdditionalParameters()->getType());
+ $arr = $o->toArray();
+ $this->assertEquals(array(
+ 'type' => 'string'
+ ), $arr['additionalParameters']);
+ }
+
+ /**
+ * @return Operation
+ */
+ protected function getOperation()
+ {
+ return new Operation(array(
+ 'name' => 'OperationTest',
+ 'class' => get_class($this),
+ 'parameters' => array(
+ 'test' => array('type' => 'object'),
+ 'bool_1' => array('default' => true, 'type' => 'boolean'),
+ 'bool_2' => array('default' => false),
+ 'float' => array('type' => 'numeric'),
+ 'int' => array('type' => 'integer'),
+ 'date' => array('type' => 'string'),
+ 'timestamp' => array('type' => 'string'),
+ 'string' => array('type' => 'string'),
+ 'username' => array('type' => 'string', 'required' => true, 'filters' => 'strtolower'),
+ 'test_function' => array('type' => 'string', 'filters' => __CLASS__ . '::strtoupper')
+ ),
+ 'errorResponses' => array(
+ array('code' => 503, 'reason' => 'InsufficientCapacity', 'class' => 'Guzzle\\Exception\\RuntimeException')
+ )
+ ));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ParameterTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ParameterTest.php
new file mode 100644
index 0000000..b9c162a
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ParameterTest.php
@@ -0,0 +1,411 @@
+<?php
+
+namespace Guzzle\Tests\Service\Description;
+
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Service\Description\ServiceDescription;
+
+/**
+ * @covers Guzzle\Service\Description\Parameter
+ */
+class ParameterTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ protected $data = array(
+ 'name' => 'foo',
+ 'type' => 'bar',
+ 'required' => true,
+ 'default' => '123',
+ 'description' => '456',
+ 'minLength' => 2,
+ 'maxLength' => 5,
+ 'location' => 'body',
+ 'static' => 'static!',
+ 'filters' => array('trim', 'json_encode')
+ );
+
+ public function testCreatesParamFromArray()
+ {
+ $p = new Parameter($this->data);
+ $this->assertEquals('foo', $p->getName());
+ $this->assertEquals('bar', $p->getType());
+ $this->assertEquals(true, $p->getRequired());
+ $this->assertEquals('123', $p->getDefault());
+ $this->assertEquals('456', $p->getDescription());
+ $this->assertEquals(2, $p->getMinLength());
+ $this->assertEquals(5, $p->getMaxLength());
+ $this->assertEquals('body', $p->getLocation());
+ $this->assertEquals('static!', $p->getStatic());
+ $this->assertEquals(array('trim', 'json_encode'), $p->getFilters());
+ }
+
+ public function testCanConvertToArray()
+ {
+ $p = new Parameter($this->data);
+ unset($this->data['name']);
+ $this->assertEquals($this->data, $p->toArray());
+ }
+
+ public function testUsesStatic()
+ {
+ $d = $this->data;
+ $d['default'] = 'booboo';
+ $d['static'] = true;
+ $p = new Parameter($d);
+ $this->assertEquals('booboo', $p->getValue('bar'));
+ }
+
+ public function testUsesDefault()
+ {
+ $d = $this->data;
+ $d['default'] = 'foo';
+ $d['static'] = null;
+ $p = new Parameter($d);
+ $this->assertEquals('foo', $p->getValue(null));
+ }
+
+ public function testReturnsYourValue()
+ {
+ $d = $this->data;
+ $d['static'] = null;
+ $p = new Parameter($d);
+ $this->assertEquals('foo', $p->getValue('foo'));
+ }
+
+ public function testZeroValueDoesNotCauseDefaultToBeReturned()
+ {
+ $d = $this->data;
+ $d['default'] = '1';
+ $d['static'] = null;
+ $p = new Parameter($d);
+ $this->assertEquals('0', $p->getValue('0'));
+ }
+
+ public function testFiltersValues()
+ {
+ $d = $this->data;
+ $d['static'] = null;
+ $d['filters'] = 'strtoupper';
+ $p = new Parameter($d);
+ $this->assertEquals('FOO', $p->filter('foo'));
+ }
+
+ public function testConvertsBooleans()
+ {
+ $p = new Parameter(array('type' => 'boolean'));
+ $this->assertEquals(true, $p->filter('true'));
+ $this->assertEquals(false, $p->filter('false'));
+ }
+
+ public function testUsesArrayByDefaultForFilters()
+ {
+ $d = $this->data;
+ $d['filters'] = null;
+ $p = new Parameter($d);
+ $this->assertEquals(array(), $p->getFilters());
+ }
+
+ public function testAllowsSimpleLocationValue()
+ {
+ $p = new Parameter(array('name' => 'myname', 'location' => 'foo', 'sentAs' => 'Hello'));
+ $this->assertEquals('foo', $p->getLocation());
+ $this->assertEquals('Hello', $p->getSentAs());
+ }
+
+ public function testParsesTypeValues()
+ {
+ $p = new Parameter(array('type' => 'foo'));
+ $this->assertEquals('foo', $p->getType());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ * @expectedExceptionMessage A [method] value must be specified for each complex filter
+ */
+ public function testValidatesComplexFilters()
+ {
+ $p = new Parameter(array('filters' => array(array('args' => 'foo'))));
+ }
+
+ public function testCanBuildUpParams()
+ {
+ $p = new Parameter(array());
+ $p->setName('foo')
+ ->setDescription('c')
+ ->setFilters(array('d'))
+ ->setLocation('e')
+ ->setSentAs('f')
+ ->setMaxLength(1)
+ ->setMinLength(1)
+ ->setMinimum(2)
+ ->setMaximum(2)
+ ->setMinItems(3)
+ ->setMaxItems(3)
+ ->setRequired(true)
+ ->setStatic(true)
+ ->setDefault('h')
+ ->setType('i');
+
+ $p->addFilter('foo');
+
+ $this->assertEquals('foo', $p->getName());
+ $this->assertEquals('h', $p->getDefault());
+ $this->assertEquals('c', $p->getDescription());
+ $this->assertEquals(array('d', 'foo'), $p->getFilters());
+ $this->assertEquals('e', $p->getLocation());
+ $this->assertEquals('f', $p->getSentAs());
+ $this->assertEquals(1, $p->getMaxLength());
+ $this->assertEquals(1, $p->getMinLength());
+ $this->assertEquals(2, $p->getMaximum());
+ $this->assertEquals(2, $p->getMinimum());
+ $this->assertEquals(3, $p->getMaxItems());
+ $this->assertEquals(3, $p->getMinItems());
+ $this->assertEquals(true, $p->getRequired());
+ $this->assertEquals(true, $p->getStatic());
+ $this->assertEquals('i', $p->getType());
+ }
+
+ public function testAllowsNestedShape()
+ {
+ $command = $this->getServiceBuilder()->get('mock')->getCommand('mock_command')->getOperation();
+ $param = new Parameter(array(
+ 'parent' => $command,
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'location' => 'query',
+ 'properties' => array(
+ 'foo' => array(
+ 'type' => 'object',
+ 'required' => true,
+ 'properties' => array(
+ 'baz' => array(
+ 'name' => 'baz',
+ 'type' => 'bool',
+ )
+ )
+ ),
+ 'bar' => array(
+ 'name' => 'bar',
+ 'default' => '123'
+ )
+ )
+ ));
+
+ $this->assertSame($command, $param->getParent());
+ $this->assertNotEmpty($param->getProperties());
+ $this->assertInstanceOf('Guzzle\Service\Description\Parameter', $param->getProperty('foo'));
+ $this->assertSame($param, $param->getProperty('foo')->getParent());
+ $this->assertSame($param->getProperty('foo'), $param->getProperty('foo')->getProperty('baz')->getParent());
+ $this->assertInstanceOf('Guzzle\Service\Description\Parameter', $param->getProperty('bar'));
+ $this->assertSame($param, $param->getProperty('bar')->getParent());
+
+ $array = $param->toArray();
+ $this->assertInternalType('array', $array['properties']);
+ $this->assertArrayHasKey('foo', $array['properties']);
+ $this->assertArrayHasKey('bar', $array['properties']);
+ }
+
+ public function testAllowsComplexFilters()
+ {
+ $that = $this;
+ $param = new Parameter(array());
+ $param->setFilters(array(array('method' => function ($a, $b, $c, $d) use ($that, $param) {
+ $that->assertEquals('test', $a);
+ $that->assertEquals('my_value!', $b);
+ $that->assertEquals('bar', $c);
+ $that->assertSame($param, $d);
+ return 'abc' . $b;
+ }, 'args' => array('test', '@value', 'bar', '@api'))));
+ $this->assertEquals('abcmy_value!', $param->filter('my_value!'));
+ }
+
+ public function testCanChangeParentOfNestedParameter()
+ {
+ $param1 = new Parameter(array('name' => 'parent'));
+ $param2 = new Parameter(array('name' => 'child'));
+ $param2->setParent($param1);
+ $this->assertSame($param1, $param2->getParent());
+ }
+
+ public function testCanRemoveFromNestedStructure()
+ {
+ $param1 = new Parameter(array('name' => 'parent'));
+ $param2 = new Parameter(array('name' => 'child'));
+ $param1->addProperty($param2);
+ $this->assertSame($param1, $param2->getParent());
+ $this->assertSame($param2, $param1->getProperty('child'));
+
+ // Remove a single child from the structure
+ $param1->removeProperty('child');
+ $this->assertNull($param1->getProperty('child'));
+ // Remove the entire structure
+ $param1->addProperty($param2);
+ $param1->removeProperty('child');
+ $this->assertNull($param1->getProperty('child'));
+ }
+
+ public function testAddsAdditionalProperties()
+ {
+ $p = new Parameter(array(
+ 'type' => 'object',
+ 'additionalProperties' => array('type' => 'string')
+ ));
+ $this->assertInstanceOf('Guzzle\Service\Description\Parameter', $p->getAdditionalProperties());
+ $this->assertNull($p->getAdditionalProperties()->getAdditionalProperties());
+ $p = new Parameter(array('type' => 'object'));
+ $this->assertTrue($p->getAdditionalProperties());
+ }
+
+ public function testAddsItems()
+ {
+ $p = new Parameter(array(
+ 'type' => 'array',
+ 'items' => array('type' => 'string')
+ ));
+ $this->assertInstanceOf('Guzzle\Service\Description\Parameter', $p->getItems());
+ $out = $p->toArray();
+ $this->assertEquals('array', $out['type']);
+ $this->assertInternalType('array', $out['items']);
+ }
+
+ public function testHasExtraProperties()
+ {
+ $p = new Parameter();
+ $this->assertEquals(array(), $p->getData());
+ $p->setData(array('foo' => 'bar'));
+ $this->assertEquals('bar', $p->getData('foo'));
+ $p->setData('baz', 'boo');
+ $this->assertEquals(array('foo' => 'bar', 'baz' => 'boo'), $p->getData());
+ }
+
+ public function testCanRetrieveKnownPropertiesUsingDataMethod()
+ {
+ $p = new Parameter();
+ $this->assertEquals(null, $p->getData('foo'));
+ $p->setName('test');
+ $this->assertEquals('test', $p->getData('name'));
+ }
+
+ public function testHasInstanceOf()
+ {
+ $p = new Parameter();
+ $this->assertNull($p->getInstanceOf());
+ $p->setInstanceOf('Foo');
+ $this->assertEquals('Foo', $p->getInstanceOf());
+ }
+
+ public function testHasPattern()
+ {
+ $p = new Parameter();
+ $this->assertNull($p->getPattern());
+ $p->setPattern('/[0-9]+/');
+ $this->assertEquals('/[0-9]+/', $p->getPattern());
+ }
+
+ public function testHasEnum()
+ {
+ $p = new Parameter();
+ $this->assertNull($p->getEnum());
+ $p->setEnum(array('foo', 'bar'));
+ $this->assertEquals(array('foo', 'bar'), $p->getEnum());
+ }
+
+ public function testSerializesItems()
+ {
+ $p = new Parameter(array(
+ 'type' => 'object',
+ 'additionalProperties' => array('type' => 'string')
+ ));
+ $this->assertEquals(array(
+ 'type' => 'object',
+ 'additionalProperties' => array('type' => 'string')
+ ), $p->toArray());
+ }
+
+ public function testResolvesRefKeysRecursively()
+ {
+ $description = new ServiceDescription(array(
+ 'models' => array(
+ 'JarJar' => array('type' => 'string', 'default' => 'Mesa address tha senate!'),
+ 'Anakin' => array('type' => 'array', 'items' => array('$ref' => 'JarJar'))
+ )
+ ));
+ $p = new Parameter(array('$ref' => 'Anakin', 'description' => 'added'), $description);
+ $this->assertEquals(array(
+ 'type' => 'array',
+ 'items' => array('type' => 'string', 'default' => 'Mesa address tha senate!'),
+ 'description' => 'added'
+ ), $p->toArray());
+ }
+
+ public function testResolvesExtendsRecursively()
+ {
+ $jarJar = array('type' => 'string', 'default' => 'Mesa address tha senate!', 'description' => 'a');
+ $anakin = array('type' => 'array', 'items' => array('extends' => 'JarJar', 'description' => 'b'));
+ $description = new ServiceDescription(array(
+ 'models' => array('JarJar' => $jarJar, 'Anakin' => $anakin)
+ ));
+ // Description attribute will be updated, and format added
+ $p = new Parameter(array('extends' => 'Anakin', 'format' => 'date'), $description);
+ $this->assertEquals(array(
+ 'type' => 'array',
+ 'format' => 'date',
+ 'items' => array(
+ 'type' => 'string',
+ 'default' => 'Mesa address tha senate!',
+ 'description' => 'b'
+ )
+ ), $p->toArray());
+ }
+
+ public function testHasKeyMethod()
+ {
+ $p = new Parameter(array('name' => 'foo', 'sentAs' => 'bar'));
+ $this->assertEquals('bar', $p->getWireName());
+ $p->setSentAs(null);
+ $this->assertEquals('foo', $p->getWireName());
+ }
+
+ public function testIncludesNameInToArrayWhenItemsAttributeHasName()
+ {
+ $p = new Parameter(array(
+ 'type' => 'array',
+ 'name' => 'Abc',
+ 'items' => array(
+ 'name' => 'Foo',
+ 'type' => 'object'
+ )
+ ));
+ $result = $p->toArray();
+ $this->assertEquals(array(
+ 'type' => 'array',
+ 'items' => array(
+ 'name' => 'Foo',
+ 'type' => 'object',
+ 'additionalProperties' => true
+ )
+ ), $result);
+ }
+
+ public function dateTimeProvider()
+ {
+ $d = 'October 13, 2012 16:15:46 UTC';
+
+ return array(
+ array($d, 'date-time', '2012-10-13T16:15:46Z'),
+ array($d, 'date', '2012-10-13'),
+ array($d, 'timestamp', strtotime($d)),
+ array(new \DateTime($d), 'timestamp', strtotime($d))
+ );
+ }
+
+ /**
+ * @dataProvider dateTimeProvider
+ */
+ public function testAppliesFormat($d, $format, $result)
+ {
+ $p = new Parameter();
+ $p->setFormat($format);
+ $this->assertEquals($format, $p->getFormat());
+ $this->assertEquals($result, $p->filter($d));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaFormatterTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaFormatterTest.php
new file mode 100644
index 0000000..eb3619b
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaFormatterTest.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Guzzle\Tests\Service\Description;
+
+use Guzzle\Service\Description\SchemaFormatter;
+
+/**
+ * @covers Guzzle\Service\Description\SchemaFormatter
+ */
+class SchemaFormatterTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function dateTimeProvider()
+ {
+ $dateUtc = 'October 13, 2012 16:15:46 UTC';
+ $dateOffset = 'October 13, 2012 10:15:46 -06:00';
+ $expectedDateTime = '2012-10-13T16:15:46Z';
+
+ return array(
+ array('foo', 'does-not-exist', 'foo'),
+ array($dateUtc, 'date-time', $expectedDateTime),
+ array($dateUtc, 'date-time-http', 'Sat, 13 Oct 2012 16:15:46 GMT'),
+ array($dateUtc, 'date', '2012-10-13'),
+ array($dateUtc, 'timestamp', strtotime($dateUtc)),
+ array(new \DateTime($dateUtc), 'timestamp', strtotime($dateUtc)),
+ array($dateUtc, 'time', '16:15:46'),
+ array(strtotime($dateUtc), 'time', '16:15:46'),
+ array(strtotime($dateUtc), 'timestamp', strtotime($dateUtc)),
+ array('true', 'boolean-string', 'true'),
+ array(true, 'boolean-string', 'true'),
+ array('false', 'boolean-string', 'false'),
+ array(false, 'boolean-string', 'false'),
+ array('1350144946', 'date-time', $expectedDateTime),
+ array(1350144946, 'date-time', $expectedDateTime),
+ array($dateOffset, 'date-time', $expectedDateTime)
+ );
+ }
+
+ /**
+ * @dataProvider dateTimeProvider
+ */
+ public function testFilters($value, $format, $result)
+ {
+ $this->assertEquals($result, SchemaFormatter::format($format, $value));
+ }
+
+ /**
+ * @expectedException \Guzzle\Common\Exception\InvalidArgumentException
+ */
+ public function testValidatesDateTimeInput()
+ {
+ SchemaFormatter::format('date-time', false);
+ }
+
+ public function testEnsuresTimestampsAreIntegers()
+ {
+ $t = time();
+ $result = SchemaFormatter::format('timestamp', $t);
+ $this->assertSame($t, $result);
+ $this->assertInternalType('int', $result);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaValidatorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaValidatorTest.php
new file mode 100644
index 0000000..4d6cc87
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaValidatorTest.php
@@ -0,0 +1,326 @@
+<?php
+
+namespace Guzzle\Tests\Service\Description;
+
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Service\Description\SchemaValidator;
+
+/**
+ * @covers Guzzle\Service\Description\SchemaValidator
+ */
+class SchemaValidatorTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ /** @var SchemaValidator */
+ protected $validator;
+
+ public function setUp()
+ {
+ $this->validator = new SchemaValidator();
+ }
+
+ public function testValidatesArrayListsAreNumericallyIndexed()
+ {
+ $value = array(array(1));
+ $this->assertFalse($this->validator->validate($this->getComplexParam(), $value));
+ $this->assertEquals(
+ array('[Foo][0] must be an array of properties. Got a numerically indexed array.'),
+ $this->validator->getErrors()
+ );
+ }
+
+ public function testValidatesArrayListsContainProperItems()
+ {
+ $value = array(true);
+ $this->assertFalse($this->validator->validate($this->getComplexParam(), $value));
+ $this->assertEquals(
+ array('[Foo][0] must be of type object'),
+ $this->validator->getErrors()
+ );
+ }
+
+ public function testAddsDefaultValuesInLists()
+ {
+ $value = array(array());
+ $this->assertTrue($this->validator->validate($this->getComplexParam(), $value));
+ $this->assertEquals(array(array('Bar' => true)), $value);
+ }
+
+ public function testMergesDefaultValuesInLists()
+ {
+ $value = array(
+ array('Baz' => 'hello!'),
+ array('Bar' => false)
+ );
+ $this->assertTrue($this->validator->validate($this->getComplexParam(), $value));
+ $this->assertEquals(array(
+ array(
+ 'Baz' => 'hello!',
+ 'Bar' => true
+ ),
+ array('Bar' => false)
+ ), $value);
+ }
+
+ public function testCorrectlyConvertsParametersToArrayWhenArraysArePresent()
+ {
+ $param = $this->getComplexParam();
+ $result = $param->toArray();
+ $this->assertInternalType('array', $result['items']);
+ $this->assertEquals('array', $result['type']);
+ $this->assertInstanceOf('Guzzle\Service\Description\Parameter', $param->getItems());
+ }
+
+ public function testAllowsInstanceOf()
+ {
+ $p = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'instanceOf' => get_class($this)
+ ));
+ $this->assertTrue($this->validator->validate($p, $this));
+ $this->assertFalse($this->validator->validate($p, $p));
+ $this->assertEquals(array('[foo] must be an instance of ' . __CLASS__), $this->validator->getErrors());
+ }
+
+ public function testEnforcesInstanceOfOnlyWhenObject()
+ {
+ $p = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => array('object', 'string'),
+ 'instanceOf' => get_class($this)
+ ));
+ $this->assertTrue($this->validator->validate($p, $this));
+ $s = 'test';
+ $this->assertTrue($this->validator->validate($p, $s));
+ }
+
+ public function testConvertsObjectsToArraysWhenToArrayInterface()
+ {
+ $o = $this->getMockBuilder('Guzzle\Common\ToArrayInterface')
+ ->setMethods(array('toArray'))
+ ->getMockForAbstractClass();
+ $o->expects($this->once())
+ ->method('toArray')
+ ->will($this->returnValue(array(
+ 'foo' => 'bar'
+ )));
+ $p = new Parameter(array(
+ 'name' => 'test',
+ 'type' => 'object',
+ 'properties' => array(
+ 'foo' => array('required' => 'true')
+ )
+ ));
+ $this->assertTrue($this->validator->validate($p, $o));
+ }
+
+ public function testMergesValidationErrorsInPropertiesWithParent()
+ {
+ $p = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'properties' => array(
+ 'bar' => array('type' => 'string', 'required' => true, 'description' => 'This is what it does'),
+ 'test' => array('type' => 'string', 'minLength' => 2, 'maxLength' => 5),
+ 'test2' => array('type' => 'string', 'minLength' => 2, 'maxLength' => 2),
+ 'test3' => array('type' => 'integer', 'minimum' => 100),
+ 'test4' => array('type' => 'integer', 'maximum' => 10),
+ 'test5' => array('type' => 'array', 'maxItems' => 2),
+ 'test6' => array('type' => 'string', 'enum' => array('a', 'bc')),
+ 'test7' => array('type' => 'string', 'pattern' => '/[0-9]+/'),
+ 'test8' => array('type' => 'number'),
+ 'baz' => array(
+ 'type' => 'array',
+ 'minItems' => 2,
+ 'required' => true,
+ "items" => array("type" => "string")
+ )
+ )
+ ));
+
+ $value = array(
+ 'test' => 'a',
+ 'test2' => 'abc',
+ 'baz' => array(false),
+ 'test3' => 10,
+ 'test4' => 100,
+ 'test5' => array(1, 3, 4),
+ 'test6' => 'Foo',
+ 'test7' => 'abc',
+ 'test8' => 'abc'
+ );
+
+ $this->assertFalse($this->validator->validate($p, $value));
+ $this->assertEquals(array (
+ '[foo][bar] is a required string: This is what it does',
+ '[foo][baz] must contain 2 or more elements',
+ '[foo][baz][0] must be of type string',
+ '[foo][test2] length must be less than or equal to 2',
+ '[foo][test3] must be greater than or equal to 100',
+ '[foo][test4] must be less than or equal to 10',
+ '[foo][test5] must contain 2 or fewer elements',
+ '[foo][test6] must be one of "a" or "bc"',
+ '[foo][test7] must match the following regular expression: /[0-9]+/',
+ '[foo][test8] must be of type number',
+ '[foo][test] length must be greater than or equal to 2',
+ ), $this->validator->getErrors());
+ }
+
+ public function testHandlesNullValuesInArraysWithDefaults()
+ {
+ $p = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'required' => true,
+ 'properties' => array(
+ 'bar' => array(
+ 'type' => 'object',
+ 'required' => true,
+ 'properties' => array(
+ 'foo' => array('default' => 'hi')
+ )
+ )
+ )
+ ));
+ $value = array();
+ $this->assertTrue($this->validator->validate($p, $value));
+ $this->assertEquals(array('bar' => array('foo' => 'hi')), $value);
+ }
+
+ public function testFailsWhenNullValuesInArraysWithNoDefaults()
+ {
+ $p = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'required' => true,
+ 'properties' => array(
+ 'bar' => array(
+ 'type' => 'object',
+ 'required' => true,
+ 'properties' => array('foo' => array('type' => 'string'))
+ )
+ )
+ ));
+ $value = array();
+ $this->assertFalse($this->validator->validate($p, $value));
+ $this->assertEquals(array('[foo][bar] is a required object'), $this->validator->getErrors());
+ }
+
+ public function testChecksTypes()
+ {
+ $p = new SchemaValidator();
+ $r = new \ReflectionMethod($p, 'determineType');
+ $r->setAccessible(true);
+ $this->assertEquals('any', $r->invoke($p, 'any', 'hello'));
+ $this->assertEquals(false, $r->invoke($p, 'foo', 'foo'));
+ $this->assertEquals('string', $r->invoke($p, 'string', 'hello'));
+ $this->assertEquals(false, $r->invoke($p, 'string', false));
+ $this->assertEquals('integer', $r->invoke($p, 'integer', 1));
+ $this->assertEquals(false, $r->invoke($p, 'integer', 'abc'));
+ $this->assertEquals('numeric', $r->invoke($p, 'numeric', 1));
+ $this->assertEquals('numeric', $r->invoke($p, 'numeric', '1'));
+ $this->assertEquals('number', $r->invoke($p, 'number', 1));
+ $this->assertEquals('number', $r->invoke($p, 'number', '1'));
+ $this->assertEquals(false, $r->invoke($p, 'numeric', 'a'));
+ $this->assertEquals('boolean', $r->invoke($p, 'boolean', true));
+ $this->assertEquals('boolean', $r->invoke($p, 'boolean', false));
+ $this->assertEquals(false, $r->invoke($p, 'boolean', 'false'));
+ $this->assertEquals('null', $r->invoke($p, 'null', null));
+ $this->assertEquals(false, $r->invoke($p, 'null', 'abc'));
+ $this->assertEquals('array', $r->invoke($p, 'array', array()));
+ $this->assertEquals(false, $r->invoke($p, 'array', 'foo'));
+ }
+
+ public function testValidatesFalseAdditionalProperties()
+ {
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'properties' => array('bar' => array('type' => 'string')),
+ 'additionalProperties' => false
+ ));
+ $value = array('test' => '123');
+ $this->assertFalse($this->validator->validate($param, $value));
+ $this->assertEquals(array('[foo][test] is not an allowed property'), $this->validator->getErrors());
+ $value = array('bar' => '123');
+ $this->assertTrue($this->validator->validate($param, $value));
+ }
+
+ public function testAllowsUndefinedAdditionalProperties()
+ {
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'properties' => array('bar' => array('type' => 'string'))
+ ));
+ $value = array('test' => '123');
+ $this->assertTrue($this->validator->validate($param, $value));
+ }
+
+ public function testValidatesAdditionalProperties()
+ {
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'properties' => array('bar' => array('type' => 'string')),
+ 'additionalProperties' => array('type' => 'integer')
+ ));
+ $value = array('test' => 'foo');
+ $this->assertFalse($this->validator->validate($param, $value));
+ $this->assertEquals(array('[foo][test] must be of type integer'), $this->validator->getErrors());
+ }
+
+ public function testValidatesAdditionalPropertiesThatArrayArrays()
+ {
+ $param = new Parameter(array(
+ 'name' => 'foo',
+ 'type' => 'object',
+ 'additionalProperties' => array(
+ 'type' => 'array',
+ 'items' => array('type' => 'string')
+ )
+ ));
+ $value = array('test' => array(true));
+ $this->assertFalse($this->validator->validate($param, $value));
+ $this->assertEquals(array('[foo][test][0] must be of type string'), $this->validator->getErrors());
+ }
+
+ public function testIntegersCastToStringWhenTypeMismatch()
+ {
+ $param = new Parameter(array('name' => 'test', 'type' => 'string'));
+ $value = 12;
+ $this->assertTrue($this->validator->validate($param, $value));
+ $this->assertEquals('12', $value);
+ }
+
+ public function testRequiredMessageIncludesType()
+ {
+ $param = new Parameter(array('name' => 'test', 'type' => array('string', 'boolean'), 'required' => true));
+ $value = null;
+ $this->assertFalse($this->validator->validate($param, $value));
+ $this->assertEquals(array('[test] is a required string or boolean'), $this->validator->getErrors());
+ }
+
+ protected function getComplexParam()
+ {
+ return new Parameter(array(
+ 'name' => 'Foo',
+ 'type' => 'array',
+ 'required' => true,
+ 'min' => 1,
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'Baz' => array(
+ 'type' => 'string',
+ ),
+ 'Bar' => array(
+ 'required' => true,
+ 'type' => 'boolean',
+ 'default' => true
+ )
+ )
+ )
+ ));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionLoaderTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionLoaderTest.php
new file mode 100644
index 0000000..bbfd1d6
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionLoaderTest.php
@@ -0,0 +1,177 @@
+<?php
+
+namespace Guzzle\Tests\Service\Description;
+
+use Guzzle\Service\Description\ServiceDescription;
+use Guzzle\Service\Description\ServiceDescriptionLoader;
+
+/**
+ * @covers Guzzle\Service\Description\ServiceDescriptionLoader
+ */
+class ServiceDescriptionLoaderTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testAllowsExtraData()
+ {
+ $d = ServiceDescription::factory(array(
+ 'foo' => true,
+ 'baz' => array('bar'),
+ 'apiVersion' => '123',
+ 'operations' => array()
+ ));
+
+ $this->assertEquals(true, $d->getData('foo'));
+ $this->assertEquals(array('bar'), $d->getData('baz'));
+ $this->assertEquals('123', $d->getApiVersion());
+ }
+
+ public function testAllowsDeepNestedInheritance()
+ {
+ $d = ServiceDescription::factory(array(
+ 'operations' => array(
+ 'abstract' => array(
+ 'httpMethod' => 'HEAD',
+ 'parameters' => array(
+ 'test' => array('type' => 'string', 'required' => true)
+ )
+ ),
+ 'abstract2' => array('uri' => '/test', 'extends' => 'abstract'),
+ 'concrete' => array('extends' => 'abstract2'),
+ 'override' => array('extends' => 'abstract', 'httpMethod' => 'PUT'),
+ 'override2' => array('extends' => 'override', 'httpMethod' => 'POST', 'uri' => '/')
+ )
+ ));
+
+ $c = $d->getOperation('concrete');
+ $this->assertEquals('/test', $c->getUri());
+ $this->assertEquals('HEAD', $c->getHttpMethod());
+ $params = $c->getParams();
+ $param = $params['test'];
+ $this->assertEquals('string', $param->getType());
+ $this->assertTrue($param->getRequired());
+
+ // Ensure that merging HTTP method does not make an array
+ $this->assertEquals('PUT', $d->getOperation('override')->getHttpMethod());
+ $this->assertEquals('POST', $d->getOperation('override2')->getHttpMethod());
+ $this->assertEquals('/', $d->getOperation('override2')->getUri());
+ }
+
+ /**
+ * @expectedException RuntimeException
+ */
+ public function testThrowsExceptionWhenExtendingMissingCommand()
+ {
+ ServiceDescription::factory(array(
+ 'operations' => array(
+ 'concrete' => array(
+ 'extends' => 'missing'
+ )
+ )
+ ));
+ }
+
+ public function testAllowsMultipleInheritance()
+ {
+ $description = ServiceDescription::factory(array(
+ 'operations' => array(
+ 'a' => array(
+ 'httpMethod' => 'GET',
+ 'parameters' => array(
+ 'a1' => array(
+ 'default' => 'foo',
+ 'required' => true,
+ 'prepend' => 'hi'
+ )
+ )
+ ),
+ 'b' => array(
+ 'extends' => 'a',
+ 'parameters' => array(
+ 'b2' => array()
+ )
+ ),
+ 'c' => array(
+ 'parameters' => array(
+ 'a1' => array(
+ 'default' => 'bar',
+ 'required' => true,
+ 'description' => 'test'
+ ),
+ 'c3' => array()
+ )
+ ),
+ 'd' => array(
+ 'httpMethod' => 'DELETE',
+ 'extends' => array('b', 'c'),
+ 'parameters' => array(
+ 'test' => array()
+ )
+ )
+ )
+ ));
+
+ $command = $description->getOperation('d');
+ $this->assertEquals('DELETE', $command->getHttpMethod());
+ $this->assertContains('a1', $command->getParamNames());
+ $this->assertContains('b2', $command->getParamNames());
+ $this->assertContains('c3', $command->getParamNames());
+ $this->assertContains('test', $command->getParamNames());
+
+ $this->assertTrue($command->getParam('a1')->getRequired());
+ $this->assertEquals('bar', $command->getParam('a1')->getDefault());
+ $this->assertEquals('test', $command->getParam('a1')->getDescription());
+ }
+
+ public function testAddsOtherFields()
+ {
+ $description = ServiceDescription::factory(array(
+ 'operations' => array(),
+ 'description' => 'Foo',
+ 'apiVersion' => 'bar'
+ ));
+ $this->assertEquals('Foo', $description->getDescription());
+ $this->assertEquals('bar', $description->getApiVersion());
+ }
+
+ public function testCanLoadNestedExtends()
+ {
+ $description = ServiceDescription::factory(array(
+ 'operations' => array(
+ 'root' => array(
+ 'class' => 'foo'
+ ),
+ 'foo' => array(
+ 'extends' => 'root',
+ 'parameters' => array(
+ 'baz' => array('type' => 'string')
+ )
+ ),
+ 'foo_2' => array(
+ 'extends' => 'foo',
+ 'parameters' => array(
+ 'bar' => array('type' => 'string')
+ )
+ ),
+ 'foo_3' => array(
+ 'class' => 'bar',
+ 'parameters' => array(
+ 'bar2' => array('type' => 'string')
+ )
+ ),
+ 'foo_4' => array(
+ 'extends' => array('foo_2', 'foo_3'),
+ 'parameters' => array(
+ 'bar3' => array('type' => 'string')
+ )
+ )
+ )
+ ));
+
+ $this->assertTrue($description->hasOperation('foo_4'));
+ $foo4 = $description->getOperation('foo_4');
+ $this->assertTrue($foo4->hasParam('baz'));
+ $this->assertTrue($foo4->hasParam('bar'));
+ $this->assertTrue($foo4->hasParam('bar2'));
+ $this->assertTrue($foo4->hasParam('bar3'));
+ $this->assertEquals('bar', $foo4->getClass());
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionTest.php
new file mode 100644
index 0000000..ff25452
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionTest.php
@@ -0,0 +1,240 @@
+<?php
+
+namespace Guzzle\Tests\Service\Description;
+
+use Guzzle\Service\Description\ServiceDescription;
+use Guzzle\Service\Description\Operation;
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Service\Client;
+
+/**
+ * @covers Guzzle\Service\Description\ServiceDescription
+ */
+class ServiceDescriptionTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ protected $serviceData;
+
+ public function setup()
+ {
+ $this->serviceData = array(
+ 'test_command' => new Operation(array(
+ 'name' => 'test_command',
+ 'description' => 'documentationForCommand',
+ 'httpMethod' => 'DELETE',
+ 'class' => 'Guzzle\\Tests\\Service\\Mock\\Command\\MockCommand',
+ 'parameters' => array(
+ 'bucket' => array('required' => true),
+ 'key' => array('required' => true)
+ )
+ ))
+ );
+ }
+
+ /**
+ * @covers Guzzle\Service\Description\ServiceDescription::factory
+ * @covers Guzzle\Service\Description\ServiceDescriptionLoader::build
+ */
+ public function testFactoryDelegatesToConcreteFactories()
+ {
+ $jsonFile = __DIR__ . '/../../TestData/test_service.json';
+ $this->assertInstanceOf('Guzzle\Service\Description\ServiceDescription', ServiceDescription::factory($jsonFile));
+ }
+
+ public function testConstructor()
+ {
+ $service = new ServiceDescription(array('operations' => $this->serviceData));
+ $this->assertEquals(1, count($service->getOperations()));
+ $this->assertFalse($service->hasOperation('foobar'));
+ $this->assertTrue($service->hasOperation('test_command'));
+ }
+
+ public function testIsSerializable()
+ {
+ $service = new ServiceDescription(array('operations' => $this->serviceData));
+ $data = serialize($service);
+ $d2 = unserialize($data);
+ $this->assertEquals(serialize($service), serialize($d2));
+ }
+
+ public function testSerializesParameters()
+ {
+ $service = new ServiceDescription(array(
+ 'operations' => array(
+ 'foo' => new Operation(array('parameters' => array('foo' => array('type' => 'string'))))
+ )
+ ));
+ $serialized = serialize($service);
+ $this->assertContains('"parameters":{"foo":', $serialized);
+ $service = unserialize($serialized);
+ $this->assertTrue($service->getOperation('foo')->hasParam('foo'));
+ }
+
+ public function testAllowsForJsonBasedArrayParamsFunctionalTest()
+ {
+ $description = new ServiceDescription(array(
+ 'operations' => array(
+ 'test' => new Operation(array(
+ 'httpMethod' => 'PUT',
+ 'parameters' => array(
+ 'data' => array(
+ 'required' => true,
+ 'filters' => 'json_encode',
+ 'location' => 'body'
+ )
+ )
+ ))
+ )
+ ));
+ $client = new Client();
+ $client->setDescription($description);
+ $command = $client->getCommand('test', array(
+ 'data' => array(
+ 'foo' => 'bar'
+ )
+ ));
+
+ $request = $command->prepare();
+ $this->assertEquals('{"foo":"bar"}', (string) $request->getBody());
+ }
+
+ public function testContainsModels()
+ {
+ $d = new ServiceDescription(array(
+ 'operations' => array('foo' => array()),
+ 'models' => array(
+ 'Tag' => array('type' => 'object'),
+ 'Person' => array('type' => 'object')
+ )
+ ));
+ $this->assertTrue($d->hasModel('Tag'));
+ $this->assertTrue($d->hasModel('Person'));
+ $this->assertFalse($d->hasModel('Foo'));
+ $this->assertInstanceOf('Guzzle\Service\Description\Parameter', $d->getModel('Tag'));
+ $this->assertNull($d->getModel('Foo'));
+ $this->assertContains('"models":{', serialize($d));
+ $this->assertEquals(array('Tag', 'Person'), array_keys($d->getModels()));
+ }
+
+ public function testCanAddModels()
+ {
+ $d = new ServiceDescription(array());
+ $this->assertFalse($d->hasModel('Foo'));
+ $d->addModel(new Parameter(array('name' => 'Foo')));
+ $this->assertTrue($d->hasModel('Foo'));
+ }
+
+ public function testHasAttributes()
+ {
+ $d = new ServiceDescription(array(
+ 'operations' => array(),
+ 'name' => 'Name',
+ 'description' => 'Description',
+ 'apiVersion' => '1.24'
+ ));
+
+ $this->assertEquals('Name', $d->getName());
+ $this->assertEquals('Description', $d->getDescription());
+ $this->assertEquals('1.24', $d->getApiVersion());
+
+ $s = serialize($d);
+ $this->assertContains('"name":"Name"', $s);
+ $this->assertContains('"description":"Description"', $s);
+ $this->assertContains('"apiVersion":"1.24"', $s);
+
+ $d = unserialize($s);
+ $this->assertEquals('Name', $d->getName());
+ $this->assertEquals('Description', $d->getDescription());
+ $this->assertEquals('1.24', $d->getApiVersion());
+ }
+
+ public function testPersistsCustomAttributes()
+ {
+ $data = array(
+ 'operations' => array('foo' => array('class' => 'foo', 'parameters' => array())),
+ 'name' => 'Name',
+ 'description' => 'Test',
+ 'apiVersion' => '1.24',
+ 'auth' => 'foo',
+ 'keyParam' => 'bar'
+ );
+ $d = new ServiceDescription($data);
+ $d->setData('hello', 'baz');
+ $this->assertEquals('foo', $d->getData('auth'));
+ $this->assertEquals('baz', $d->getData('hello'));
+ $this->assertEquals('bar', $d->getData('keyParam'));
+ // responseClass and responseType are added by default
+ $data['operations']['foo']['responseClass'] = 'array';
+ $data['operations']['foo']['responseType'] = 'primitive';
+ $this->assertEquals($data + array('hello' => 'baz'), json_decode($d->serialize(), true));
+ }
+
+ public function testHasToArray()
+ {
+ $data = array(
+ 'operations' => array(),
+ 'name' => 'Name',
+ 'description' => 'Test'
+ );
+ $d = new ServiceDescription($data);
+ $arr = $d->toArray();
+ $this->assertEquals('Name', $arr['name']);
+ $this->assertEquals('Test', $arr['description']);
+ }
+
+ public function testReturnsNullWhenRetrievingMissingOperation()
+ {
+ $s = new ServiceDescription(array());
+ $this->assertNull($s->getOperation('foo'));
+ }
+
+ public function testCanAddOperations()
+ {
+ $s = new ServiceDescription(array());
+ $this->assertFalse($s->hasOperation('Foo'));
+ $s->addOperation(new Operation(array('name' => 'Foo')));
+ $this->assertTrue($s->hasOperation('Foo'));
+ }
+
+ /**
+ * @expectedException Guzzle\Common\Exception\InvalidArgumentException
+ */
+ public function testValidatesOperationTypes()
+ {
+ $s = new ServiceDescription(array(
+ 'operations' => array('foo' => new \stdClass())
+ ));
+ }
+
+ public function testHasBaseUrl()
+ {
+ $description = new ServiceDescription(array('baseUrl' => 'http://foo.com'));
+ $this->assertEquals('http://foo.com', $description->getBaseUrl());
+ $description->setBaseUrl('http://foobar.com');
+ $this->assertEquals('http://foobar.com', $description->getBaseUrl());
+ }
+
+ public function testCanUseBasePath()
+ {
+ $description = new ServiceDescription(array('basePath' => 'http://foo.com'));
+ $this->assertEquals('http://foo.com', $description->getBaseUrl());
+ }
+
+ public function testModelsHaveNames()
+ {
+ $desc = array(
+ 'models' => array(
+ 'date' => array('type' => 'string'),
+ 'user'=> array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'dob' => array('$ref' => 'date')
+ )
+ )
+ )
+ );
+
+ $s = ServiceDescription::factory($desc);
+ $this->assertEquals('date', $s->getModel('date')->getName());
+ $this->assertEquals('dob', $s->getModel('user')->getProperty('dob')->getName());
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/CommandTransferExceptionTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/CommandTransferExceptionTest.php
new file mode 100644
index 0000000..be0d4ac
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/CommandTransferExceptionTest.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Guzzle\Tests\Service\Exception;
+
+use Guzzle\Http\Exception\MultiTransferException;
+use Guzzle\Http\Message\Request;
+use Guzzle\Service\Exception\CommandTransferException;
+use Guzzle\Tests\Service\Mock\Command\MockCommand;
+
+/**
+ * @covers Guzzle\Service\Exception\CommandTransferException
+ */
+class CommandTransferExceptionTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testStoresCommands()
+ {
+ $c1 = new MockCommand();
+ $c2 = new MockCommand();
+ $e = new CommandTransferException('Test');
+ $e->addSuccessfulCommand($c1)->addFailedCommand($c2);
+ $this->assertSame(array($c1), $e->getSuccessfulCommands());
+ $this->assertSame(array($c2), $e->getFailedCommands());
+ $this->assertSame(array($c1, $c2), $e->getAllCommands());
+ }
+
+ public function testConvertsMultiExceptionIntoCommandTransfer()
+ {
+ $r1 = new Request('GET', 'http://foo.com');
+ $r2 = new Request('GET', 'http://foobaz.com');
+ $e = new MultiTransferException('Test', 123);
+ $e->addSuccessfulRequest($r1)->addFailedRequest($r2);
+ $ce = CommandTransferException::fromMultiTransferException($e);
+
+ $this->assertInstanceOf('Guzzle\Service\Exception\CommandTransferException', $ce);
+ $this->assertEquals('Test', $ce->getMessage());
+ $this->assertEquals(123, $ce->getCode());
+ $this->assertSame(array($r1), $ce->getSuccessfulRequests());
+ $this->assertSame(array($r2), $ce->getFailedRequests());
+ }
+
+ public function testCanRetrieveExceptionForCommand()
+ {
+ $r1 = new Request('GET', 'http://foo.com');
+ $e1 = new \Exception('foo');
+ $c1 = $this->getMockBuilder('Guzzle\Tests\Service\Mock\Command\MockCommand')
+ ->setMethods(array('getRequest'))
+ ->getMock();
+ $c1->expects($this->once())->method('getRequest')->will($this->returnValue($r1));
+
+ $e = new MultiTransferException('Test', 123);
+ $e->addFailedRequestWithException($r1, $e1);
+ $ce = CommandTransferException::fromMultiTransferException($e);
+ $ce->addFailedCommand($c1);
+
+ $this->assertSame($e1, $ce->getExceptionForFailedCommand($c1));
+ }
+
+ public function testAddsNonRequestExceptions()
+ {
+ $e = new MultiTransferException();
+ $e->add(new \Exception('bar'));
+ $e->addFailedRequestWithException(new Request('GET', 'http://www.foo.com'), new \Exception('foo'));
+ $ce = CommandTransferException::fromMultiTransferException($e);
+ $this->assertEquals(2, count($ce));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/InconsistentClientTransferExceptionTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/InconsistentClientTransferExceptionTest.php
new file mode 100644
index 0000000..6455295
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/InconsistentClientTransferExceptionTest.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Guzzle\Tests\Service\Exception;
+
+use Guzzle\Service\Exception\InconsistentClientTransferException;
+
+class InconsistentClientTransferExceptionTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testStoresCommands()
+ {
+ $items = array('foo', 'bar');
+ $e = new InconsistentClientTransferException($items);
+ $this->assertEquals($items, $e->getCommands());
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/ValidationExceptionTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/ValidationExceptionTest.php
new file mode 100644
index 0000000..ef789d8
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/ValidationExceptionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Guzzle\Tests\Service\Exception;
+
+use Guzzle\Service\Exception\ValidationException;
+
+class ValidationExceptionTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testCanSetAndRetrieveErrors()
+ {
+ $errors = array('foo', 'bar');
+
+ $e = new ValidationException('Foo');
+ $e->setErrors($errors);
+ $this->assertEquals($errors, $e->getErrors());
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/IterableCommand.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/IterableCommand.php
new file mode 100644
index 0000000..4ab423e
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/IterableCommand.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Guzzle\Tests\Service\Mock\Command;
+
+use Guzzle\Service\Description\Operation;
+
+class IterableCommand extends MockCommand
+{
+ protected function createOperation()
+ {
+ return new Operation(array(
+ 'name' => 'iterable_command',
+ 'parameters' => array(
+ 'page_size' => array('type' => 'integer'),
+ 'next_token' => array('type' => 'string')
+ )
+ ));
+ }
+
+ protected function build()
+ {
+ $this->request = $this->client->createRequest('GET');
+
+ // Add the next token and page size query string values
+ $this->request->getQuery()->set('next_token', $this->get('next_token'));
+
+ if ($this->get('page_size')) {
+ $this->request->getQuery()->set('page_size', $this->get('page_size'));
+ }
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/MockCommand.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/MockCommand.php
new file mode 100644
index 0000000..831a7e7
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/MockCommand.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Guzzle\Tests\Service\Mock\Command;
+
+use Guzzle\Service\Description\Operation;
+
+class MockCommand extends \Guzzle\Service\Command\AbstractCommand
+{
+ protected function createOperation()
+ {
+ return new Operation(array(
+ 'name' => get_called_class() == __CLASS__ ? 'mock_command' : 'sub.sub',
+ 'httpMethod' => 'POST',
+ 'parameters' => array(
+ 'test' => array(
+ 'default' => 123,
+ 'required' => true,
+ 'doc' => 'Test argument'
+ ),
+ '_internal' => array(
+ 'default' => 'abc'
+ ),
+ 'foo' => array('filters' => array('strtoupper'))
+ )
+ ));
+ }
+
+ protected function build()
+ {
+ $this->request = $this->client->createRequest();
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/OtherCommand.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/OtherCommand.php
new file mode 100644
index 0000000..72ae1f6
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/OtherCommand.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Guzzle\Tests\Service\Mock\Command;
+
+use Guzzle\Service\Description\Operation;
+
+class OtherCommand extends MockCommand
+{
+ protected function createOperation()
+ {
+ return new Operation(array(
+ 'name' => 'other_command',
+ 'parameters' => array(
+ 'test' => array(
+ 'default' => '123',
+ 'required' => true,
+ 'doc' => 'Test argument'
+ ),
+ 'other' => array(),
+ 'arg' => array('type' => 'string'),
+ 'static' => array('static' => true, 'default' => 'this is static')
+ )
+ ));
+ }
+
+ protected function build()
+ {
+ $this->request = $this->client->getRequest('HEAD');
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/Sub/Sub.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/Sub/Sub.php
new file mode 100644
index 0000000..d348480
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/Sub/Sub.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace Guzzle\Tests\Service\Mock\Command\Sub;
+
+use Guzzle\Tests\Service\Mock\Command\MockCommand;
+
+class Sub extends MockCommand {}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/MockClient.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/MockClient.php
new file mode 100644
index 0000000..6b9f55a
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/MockClient.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Guzzle\Tests\Service\Mock;
+
+use Guzzle\Common\Collection;
+use Guzzle\Service\Client;
+
+/**
+ * Mock Guzzle Service
+ */
+class MockClient extends Client
+{
+ /**
+ * Factory method to create a new mock client
+ *
+ * @param array|Collection $config Configuration data. Array keys:
+ * base_url - Base URL of web service
+ * api_version - API version
+ * scheme - URI scheme: http or https
+ * * username - API username
+ * * password - API password
+ * * subdomain - Unfuddle account subdomain
+ *
+ * @return MockClient
+ */
+ public static function factory($config = array())
+ {
+ $config = Collection::fromConfig($config, array(
+ 'base_url' => '{scheme}://127.0.0.1:8124/{api_version}/{subdomain}',
+ 'scheme' => 'http',
+ 'api_version' => 'v1'
+ ), array('username', 'password', 'subdomain'));
+
+ return new self($config->get('base_url'), $config);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Model/MockCommandIterator.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Model/MockCommandIterator.php
new file mode 100644
index 0000000..8faf412
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Model/MockCommandIterator.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Guzzle\Tests\Service\Mock\Model;
+
+use Guzzle\Service\Resource\ResourceIterator;
+
+class MockCommandIterator extends ResourceIterator
+{
+ public $calledNext = 0;
+
+ protected function sendRequest()
+ {
+ if ($this->nextToken) {
+ $this->command->set('next_token', $this->nextToken);
+ }
+
+ $this->command->set('page_size', (int) $this->calculatePageSize());
+ $this->command->execute();
+
+ $data = json_decode($this->command->getResponse()->getBody(true), true);
+
+ $this->nextToken = $data['next_token'];
+
+ return $data['resources'];
+ }
+
+ public function next()
+ {
+ $this->calledNext++;
+ parent::next();
+ }
+
+ public function getResources()
+ {
+ return $this->resources;
+ }
+
+ public function getIteratedCount()
+ {
+ return $this->iteratedCount;
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/CompositeResourceIteratorFactoryTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/CompositeResourceIteratorFactoryTest.php
new file mode 100644
index 0000000..41c2073
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/CompositeResourceIteratorFactoryTest.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Guzzle\Tests\Service\Resource;
+
+use Guzzle\Service\Resource\CompositeResourceIteratorFactory;
+use Guzzle\Service\Resource\ResourceIteratorClassFactory;
+use Guzzle\Tests\Service\Mock\Command\MockCommand;
+
+/**
+ * @covers Guzzle\Service\Resource\CompositeResourceIteratorFactory
+ */
+class CompositeResourceIteratorFactoryTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Iterator was not found for mock_command
+ */
+ public function testEnsuresIteratorClassExists()
+ {
+ $factory = new CompositeResourceIteratorFactory(array(
+ new ResourceIteratorClassFactory(array('Foo', 'Bar'))
+ ));
+ $cmd = new MockCommand();
+ $this->assertFalse($factory->canBuild($cmd));
+ $factory->build($cmd);
+ }
+
+ public function testBuildsResourceIterators()
+ {
+ $f1 = new ResourceIteratorClassFactory('Guzzle\Tests\Service\Mock\Model');
+ $factory = new CompositeResourceIteratorFactory(array());
+ $factory->addFactory($f1);
+ $command = new MockCommand();
+ $iterator = $factory->build($command, array('client.namespace' => 'Guzzle\Tests\Service\Mock'));
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\Model\MockCommandIterator', $iterator);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/MapResourceIteratorFactoryTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/MapResourceIteratorFactoryTest.php
new file mode 100644
index 0000000..d166e92
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/MapResourceIteratorFactoryTest.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Guzzle\Tests\Service\Resource;
+
+use Guzzle\Service\Resource\MapResourceIteratorFactory;
+use Guzzle\Tests\Service\Mock\Command\MockCommand;
+
+/**
+ * @covers Guzzle\Service\Resource\MapResourceIteratorFactory
+ */
+class MapResourceIteratorFactoryTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ /**
+ * @expectedException InvalidArgumentException
+ * @expectedExceptionMessage Iterator was not found for mock_command
+ */
+ public function testEnsuresIteratorClassExists()
+ {
+ $factory = new MapResourceIteratorFactory(array('Foo', 'Bar'));
+ $factory->build(new MockCommand());
+ }
+
+ public function testBuildsResourceIterators()
+ {
+ $factory = new MapResourceIteratorFactory(array(
+ 'mock_command' => 'Guzzle\Tests\Service\Mock\Model\MockCommandIterator'
+ ));
+ $iterator = $factory->build(new MockCommand());
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\Model\MockCommandIterator', $iterator);
+ }
+
+ public function testUsesWildcardMappings()
+ {
+ $factory = new MapResourceIteratorFactory(array(
+ '*' => 'Guzzle\Tests\Service\Mock\Model\MockCommandIterator'
+ ));
+ $iterator = $factory->build(new MockCommand());
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\Model\MockCommandIterator', $iterator);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ModelTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ModelTest.php
new file mode 100644
index 0000000..7214133
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ModelTest.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Guzzle\Tests\Service\Resource;
+
+use Guzzle\Service\Resource\Model;
+use Guzzle\Service\Description\Parameter;
+use Guzzle\Common\Collection;
+
+/**
+ * @covers Guzzle\Service\Resource\Model
+ */
+class ModelTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testOwnsStructure()
+ {
+ $param = new Parameter(array('type' => 'object'));
+ $model = new Model(array('foo' => 'bar'), $param);
+ $this->assertSame($param, $model->getStructure());
+ $this->assertEquals('bar', $model->get('foo'));
+ $this->assertEquals('bar', $model['foo']);
+ }
+
+ public function testCanBeUsedWithoutStructure()
+ {
+ $model = new Model(array(
+ 'Foo' => 'baz',
+ 'Bar' => array(
+ 'Boo' => 'Bam'
+ )
+ ));
+ $transform = function ($key, $value) {
+ return ($value && is_array($value)) ? new Collection($value) : $value;
+ };
+ $model = $model->map($transform);
+ $this->assertInstanceOf('Guzzle\Common\Collection', $model->getPath('Bar'));
+ }
+
+ public function testAllowsFiltering()
+ {
+ $model = new Model(array(
+ 'Foo' => 'baz',
+ 'Bar' => 'a'
+ ));
+ $model = $model->filter(function ($i, $v) {
+ return $v[0] == 'a';
+ });
+ $this->assertEquals(array('Bar' => 'a'), $model->toArray());
+ }
+
+ public function testDoesNotIncludeEmptyStructureInString()
+ {
+ $model = new Model(array('Foo' => 'baz'));
+ $str = (string) $model;
+ $this->assertContains('Debug output of model', $str);
+ $this->assertNotContains('Model structure', $str);
+ }
+
+ public function testDoesIncludeModelStructureInString()
+ {
+ $model = new Model(array('Foo' => 'baz'), new Parameter(array('name' => 'Foo')));
+ $str = (string) $model;
+ $this->assertContains('Debug output of Foo model', $str);
+ $this->assertContains('Model structure', $str);
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorClassFactoryTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorClassFactoryTest.php
new file mode 100644
index 0000000..7b061b5
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorClassFactoryTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Guzzle\Tests\Service\Resource;
+
+use Guzzle\Service\Resource\ResourceIteratorClassFactory;
+use Guzzle\Tests\Service\Mock\Command\MockCommand;
+
+/**
+ * @covers Guzzle\Service\Resource\ResourceIteratorClassFactory
+ * @covers Guzzle\Service\Resource\AbstractResourceIteratorFactory
+ */
+class ResourceIteratorClassFactoryTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Iterator was not found for mock_command
+ */
+ public function testEnsuresIteratorClassExists()
+ {
+ $factory = new ResourceIteratorClassFactory(array('Foo', 'Bar'));
+ $factory->registerNamespace('Baz');
+ $command = new MockCommand();
+ $factory->build($command);
+ }
+
+ public function testBuildsResourceIterators()
+ {
+ $factory = new ResourceIteratorClassFactory('Guzzle\Tests\Service\Mock\Model');
+ $command = new MockCommand();
+ $iterator = $factory->build($command, array('client.namespace' => 'Guzzle\Tests\Service\Mock'));
+ $this->assertInstanceOf('Guzzle\Tests\Service\Mock\Model\MockCommandIterator', $iterator);
+ }
+
+ public function testChecksIfCanBuild()
+ {
+ $factory = new ResourceIteratorClassFactory('Guzzle\Tests\Service');
+ $this->assertFalse($factory->canBuild(new MockCommand()));
+ $factory = new ResourceIteratorClassFactory('Guzzle\Tests\Service\Mock\Model');
+ $this->assertTrue($factory->canBuild(new MockCommand()));
+ }
+}
diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorTest.php
new file mode 100644
index 0000000..573fb6d
--- /dev/null
+++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorTest.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace Guzzle\Tests\Service\Resource;
+
+use Guzzle\Service\Resource\ResourceIterator;
+use Guzzle\Tests\Service\Mock\Model\MockCommandIterator;
+
+/**
+ * @group server
+ * @covers Guzzle\Service\Resource\ResourceIterator
+ */
+class ResourceIteratorTest extends \Guzzle\Tests\GuzzleTestCase
+{
+ public function testDescribesEvents()
+ {
+ $this->assertInternalType('array', ResourceIterator::getAllEvents());
+ }
+
+ public function testConstructorConfiguresDefaults()
+ {
+ $ri = $this->getMockForAbstractClass('Guzzle\\Service\\Resource\\ResourceIterator', array(
+ $this->getServiceBuilder()->get('mock')->getCommand('iterable_command'),
+ array(
+ 'limit' => 10,
+ 'page_size' => 3
+ )
+ ), 'MockIterator');
+
+ $this->assertEquals(false, $ri->getNextToken());
+ $this->assertEquals(false, $ri->current());
+ }
+
+ public function testSendsRequestsForNextSetOfResources()
+ {
+ // Queue up an array of responses for iterating
+ $this->getServer()->flush();
+ $this->getServer()->enqueue(array(
+ "HTTP/1.1 200 OK\r\nContent-Length: 52\r\n\r\n{ \"next_token\": \"g\", \"resources\": [\"d\", \"e\", \"f\"] }",
+ "HTTP/1.1 200 OK\r\nContent-Length: 52\r\n\r\n{ \"next_token\": \"j\", \"resources\": [\"g\", \"h\", \"i\"] }",
+ "HTTP/1.1 200 OK\r\nContent-Length: 41\r\n\r\n{ \"next_token\": \"\", \"resources\": [\"j\"] }"
+ ));
+
+ // Create a new resource iterator using the IterableCommand mock
+ $ri = new MockCommandIterator($this->getServiceBuilder()->get('mock')->getCommand('iterable_command'), array(
+ 'page_size' => 3
+ ));
+
+ // Ensure that no requests have been sent yet
+ $this->assertEquals(0, count($this->getServer()->getReceivedRequests(false)));
+
+ //$this->assertEquals(array('d', 'e', 'f', 'g', 'h', 'i', 'j'), $ri->toArray());
+ $ri->toArray();
+ $requests = $this->getServer()->getReceivedRequests(true);
+ $this->assertEquals(3, count($requests));
+
+ $this->assertEquals(3, $requests[0]->getQuery()->get('page_size'));
+ $this->assertEquals(3, $requests[1]->getQuery()->get('page_size'));
+ $this->assertEquals(3, $requests[2]->getQuery()->get('page_size'));
+
+ // Reset and resend
+ $this->getServer()->flush();
+ $this->getServer()->enqueue(array(
+ "HTTP/1.1 200 OK\r\nContent-Length: 52\r\n\r\n{ \"next_token\": \"g\", \"resources\": [\"d\", \"e\", \"f\"] }",
+ "HTTP/1.1 200 OK\r\nContent-Length: 52\r\n\r\n{ \"next_token\": \"j\", \"resources\": [\"g\", \"h\", \"i\"] }",
+ "HTTP/1.1 200 OK\r\nContent-Length: 41\r\n\r\n{ \"next_token\": \"\", \"resources\": [\"j\"] }",
+ ));
+
+ $d = array();
+ foreach ($ri as $data) {
+ $d[] = $data;
+ }
+ $this->assertEquals(array('d', 'e', 'f', 'g', 'h', 'i', 'j'), $d);
+ }
+
+ public function testCalculatesPageSize()
+ {
+ $this->getServer()->flush();
+ $this->getServer()->enqueue(array(
+ "HTTP/1.1 200 OK\r\nContent-Length: 52\r\n\r\n{ \"next_token\": \"g\", \"resources\": [\"d\", \"e\", \"f\"] }",
+ "HTTP/1.1 200 OK\r\nContent-Length: 52\r\n\r\n{ \"next_token\": \"j\", \"resources\": [\"g\", \"h\", \"i\"] }",
+ "HTTP/1.1 200 OK\r\nContent-Length: 52\r\n\r\n{ \"next_token\": \"j\", \"resources\": [\"j\", \"k\"] }"
+ ));
+
+ $ri = new MockCommandIterator($this->getServiceBuilder()->get('mock')->getCommand('iterable_command'), array(
+ 'page_size' => 3,
+ 'limit' => 7
+ ));
+
+ $this->assertEquals(array('d', 'e', 'f', 'g', 'h', 'i', 'j'), $ri->toArray());
+ $requests = $this->getServer()->getReceivedRequests(true);
+ $this->assertEquals(3, count($requests));
+ $this->assertEquals(3, $requests[0]->getQuery()->get('page_size'));
+ $this->assertEquals(3, $requests[1]->getQuery()->get('page_size'));
+ $this->assertEquals(1, $requests[2]->getQuery()->get('page_size'));
+ }
+
+ public function testUseAsArray()
+ {
+ $this->getServer()->flush();
+ $this->getServer()->enqueue(array(
+ "HTTP/1.1 200 OK\r\nContent-Length: 52\r\n\r\n{ \"next_token\": \"g\", \"resources\": [\"d\", \"e\", \"f\"] }",
+ "HTTP/1.1 200 OK\r\nContent-Length: 52\r\n\r\n{ \"next_token\": \"\", \"resources\": [\"g\", \"h\", \"i\"] }"
+ ));
+
+ $ri = new MockCommandIterator($this->getServiceBuilder()->get('mock')->getCommand('iterable_command'));
+
+ // Ensure that the key is never < 0
+ $this->assertEquals(0, $ri->key());
+ $this->assertEquals(0, count($ri));
+
+ // Ensure that the iterator can be used as KVP array
+ $data = array();
+ foreach ($ri as $key => $value) {
+ $data[$key] = $value;
+ }
+
+ // Ensure that the iterate is countable
+ $this->assertEquals(6, count($ri));
+ $this->assertEquals(array('d', 'e', 'f', 'g', 'h', 'i'), $data);
+ }
+
+ public function testBailsWhenSendReturnsNoResults()
+ {
+ $this->getServer()->flush();
+ $this->getServer()->enqueue(array(
+ "HTTP/1.1 200 OK\r\n\r\n{ \"next_token\": \"g\", \"resources\": [\"d\", \"e\", \"f\"] }",
+ "HTTP/1.1 200 OK\r\n\r\n{ \"next_token\": \"\", \"resources\": [] }"
+ ));
+
+ $ri = new MockCommandIterator($this->getServiceBuilder()->get('mock')->getCommand('iterable_command'));
+
+ // Ensure that the iterator can be used as KVP array
+ $data = $ri->toArray();
+
+ // Ensure that the iterate is countable
+ $this->assertEquals(3, count($ri));
+ $this->assertEquals(array('d', 'e', 'f'), $data);
+
+ $this->assertEquals(2, $ri->getRequestCount());
+ }
+
+ public function testHoldsDataOptions()
+ {
+ $ri = new MockCommandIterator($this->getServiceBuilder()->get('mock')->getCommand('iterable_command'));
+ $this->assertNull($ri->get('foo'));
+ $this->assertSame($ri, $ri->set('foo', 'bar'));
+ $this->assertEquals('bar', $ri->get('foo'));
+ }
+
+ public function testSettingLimitOrPageSizeClearsData()
+ {
+ $this->getServer()->flush();
+ $this->getServer()->enqueue(array(
+ "HTTP/1.1 200 OK\r\n\r\n{ \"next_token\": \"\", \"resources\": [\"d\", \"e\", \"f\"] }",
+ "HTTP/1.1 200 OK\r\n\r\n{ \"next_token\": \"\", \"resources\": [\"d\", \"e\", \"f\"] }",
+ "HTTP/1.1 200 OK\r\n\r\n{ \"next_token\": \"\", \"resources\": [\"d\", \"e\", \"f\"] }"
+ ));
+
+ $ri = new MockCommandIterator($this->getServiceBuilder()->get('mock')->getCommand('iterable_command'));
+ $ri->toArray();
+ $this->assertNotEmpty($this->readAttribute($ri, 'resources'));
+
+ $ri->setLimit(10);
+ $this->assertEmpty($this->readAttribute($ri, 'resources'));
+
+ $ri->toArray();
+ $this->assertNotEmpty($this->readAttribute($ri, 'resources'));
+ $ri->setPageSize(10);
+ $this->assertEmpty($this->readAttribute($ri, 'resources'));
+ }
+
+ public function testWorksWithCustomAppendIterator()
+ {
+ $this->getServer()->flush();
+ $this->getServer()->enqueue(array(
+ "HTTP/1.1 200 OK\r\n\r\n{ \"next_token\": \"\", \"resources\": [\"d\", \"e\", \"f\"] }"
+ ));
+ $ri = new MockCommandIterator($this->getServiceBuilder()->get('mock')->getCommand('iterable_command'));
+ $a = new \Guzzle\Iterator\AppendIterator();
+ $a->append($ri);
+ $results = iterator_to_array($a, false);
+ $this->assertEquals(4, $ri->calledNext);
+ }
+}