1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412:
<?php
namespace Guzzle\Tests\Service\Description;
use Guzzle\Service\Description\Parameter;
use Guzzle\Service\Description\ServiceDescription;
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());
}
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'));
$param1->removeProperty('child');
$this->assertNull($param1->getProperty('child'));
$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)
));
$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))
);
}
public function testAppliesFormat($d, $format, $result)
{
$p = new Parameter();
$p->setFormat($format);
$this->assertEquals($format, $p->getFormat());
$this->assertEquals($result, $p->filter($d));
}
}