'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)); } }