You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
379 lines
12 KiB
379 lines
12 KiB
9 months ago
|
<?php
|
||
|
namespace Guzzle\Tests\Service\Description;
|
||
|
|
||
|
use GuzzleHttp\Command\Guzzle\Description;
|
||
|
use GuzzleHttp\Command\Guzzle\Parameter;
|
||
|
|
||
|
/**
|
||
|
* @covers \GuzzleHttp\Command\Guzzle\Parameter
|
||
|
*/
|
||
|
class ParameterTest extends \PHPUnit_Framework_TestCase
|
||
|
{
|
||
|
protected $data = [
|
||
|
'name' => 'foo',
|
||
|
'type' => 'bar',
|
||
|
'required' => true,
|
||
|
'default' => '123',
|
||
|
'description' => '456',
|
||
|
'minLength' => 2,
|
||
|
'maxLength' => 5,
|
||
|
'location' => 'body',
|
||
|
'static' => true,
|
||
|
'filters' => ['trim', 'json_encode']
|
||
|
];
|
||
|
|
||
|
public function testCreatesParamFromArray()
|
||
|
{
|
||
|
$p = new Parameter($this->data);
|
||
|
$this->assertEquals('foo', $p->getName());
|
||
|
$this->assertEquals('bar', $p->getType());
|
||
|
$this->assertTrue($p->isRequired());
|
||
|
$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->assertTrue($p->isStatic());
|
||
|
$this->assertEquals(['trim', 'json_encode'], $p->getFilters());
|
||
|
$p->setName('abc');
|
||
|
$this->assertEquals('abc', $p->getName());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @expectedException \InvalidArgumentException
|
||
|
*/
|
||
|
public function testValidatesDescription()
|
||
|
{
|
||
|
new Parameter($this->data, ['description' => 'foo']);
|
||
|
}
|
||
|
|
||
|
public function testCanConvertToArray()
|
||
|
{
|
||
|
$p = new Parameter($this->data);
|
||
|
$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'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @expectedException \RuntimeException
|
||
|
* @expectedExceptionMessage No service description
|
||
|
*/
|
||
|
public function testRequiresServiceDescriptionForFormatting()
|
||
|
{
|
||
|
$d = $this->data;
|
||
|
$d['format'] = 'foo';
|
||
|
$p = new Parameter($d);
|
||
|
$p->filter('bar');
|
||
|
}
|
||
|
|
||
|
public function testConvertsBooleans()
|
||
|
{
|
||
|
$p = new Parameter(['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([], $p->getFilters());
|
||
|
}
|
||
|
|
||
|
public function testAllowsSimpleLocationValue()
|
||
|
{
|
||
|
$p = new Parameter(['name' => 'myname', 'location' => 'foo', 'sentAs' => 'Hello']);
|
||
|
$this->assertEquals('foo', $p->getLocation());
|
||
|
$this->assertEquals('Hello', $p->getSentAs());
|
||
|
}
|
||
|
|
||
|
public function testParsesTypeValues()
|
||
|
{
|
||
|
$p = new Parameter(['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(['filters' => [['args' => 'foo']]]);
|
||
|
}
|
||
|
|
||
|
public function testAllowsComplexFilters()
|
||
|
{
|
||
|
$that = $this;
|
||
|
$param = new Parameter([
|
||
|
'filters' => [
|
||
|
[
|
||
|
'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' => ['test', '@value', 'bar', '@api']
|
||
|
]
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$this->assertEquals('abcmy_value!', $param->filter('my_value!'));
|
||
|
}
|
||
|
|
||
|
public function testAddsAdditionalProperties()
|
||
|
{
|
||
|
$p = new Parameter([
|
||
|
'type' => 'object',
|
||
|
'additionalProperties' => ['type' => 'string']
|
||
|
]);
|
||
|
$this->assertInstanceOf('GuzzleHttp\Command\Guzzle\Parameter', $p->getAdditionalProperties());
|
||
|
$this->assertNull($p->getAdditionalProperties()->getAdditionalProperties());
|
||
|
$p = new Parameter(['type' => 'object']);
|
||
|
$this->assertTrue($p->getAdditionalProperties());
|
||
|
}
|
||
|
|
||
|
public function testAddsItems()
|
||
|
{
|
||
|
$p = new Parameter([
|
||
|
'type' => 'array',
|
||
|
'items' => ['type' => 'string']
|
||
|
]);
|
||
|
$this->assertInstanceOf('GuzzleHttp\Command\Guzzle\Parameter', $p->getItems());
|
||
|
$out = $p->toArray();
|
||
|
$this->assertEquals('array', $out['type']);
|
||
|
$this->assertInternalType('array', $out['items']);
|
||
|
}
|
||
|
|
||
|
public function testCanRetrieveKnownPropertiesUsingDataMethod()
|
||
|
{
|
||
|
$p = new Parameter(['data' => ['name' => 'test'], 'extra' => 'hi!']);
|
||
|
$this->assertEquals('test', $p->getData('name'));
|
||
|
$this->assertEquals(['name' => 'test'], $p->getData());
|
||
|
$this->assertNull($p->getData('fjnweefe'));
|
||
|
$this->assertEquals('hi!', $p->getData('extra'));
|
||
|
}
|
||
|
|
||
|
public function testHasPattern()
|
||
|
{
|
||
|
$p = new Parameter(['pattern' => '/[0-9]+/']);
|
||
|
$this->assertEquals('/[0-9]+/', $p->getPattern());
|
||
|
}
|
||
|
|
||
|
public function testHasEnum()
|
||
|
{
|
||
|
$p = new Parameter(['enum' => ['foo', 'bar']]);
|
||
|
$this->assertEquals(['foo', 'bar'], $p->getEnum());
|
||
|
}
|
||
|
|
||
|
public function testSerializesItems()
|
||
|
{
|
||
|
$p = new Parameter([
|
||
|
'type' => 'object',
|
||
|
'additionalProperties' => ['type' => 'string']
|
||
|
]);
|
||
|
$this->assertEquals([
|
||
|
'type' => 'object',
|
||
|
'additionalProperties' => ['type' => 'string']
|
||
|
], $p->toArray());
|
||
|
}
|
||
|
|
||
|
public function testResolvesRefKeysRecursively()
|
||
|
{
|
||
|
$description = new Description([
|
||
|
'models' => [
|
||
|
'JarJar' => ['type' => 'string', 'default' => 'Mesa address tha senate!'],
|
||
|
'Anakin' => ['type' => 'array', 'items' => ['$ref' => 'JarJar']]
|
||
|
],
|
||
|
]);
|
||
|
$p = new Parameter(['$ref' => 'Anakin', 'description' => 'added'], ['description' => $description]);
|
||
|
$this->assertEquals([
|
||
|
'description' => 'added',
|
||
|
'$ref' => 'Anakin'
|
||
|
], $p->toArray());
|
||
|
}
|
||
|
|
||
|
public function testResolvesExtendsRecursively()
|
||
|
{
|
||
|
$jarJar = ['type' => 'string', 'default' => 'Mesa address tha senate!', 'description' => 'a'];
|
||
|
$anakin = ['type' => 'array', 'items' => ['extends' => 'JarJar', 'description' => 'b']];
|
||
|
$description = new Description([
|
||
|
'models' => ['JarJar' => $jarJar, 'Anakin' => $anakin]
|
||
|
]);
|
||
|
// Description attribute will be updated, and format added
|
||
|
$p = new Parameter(['extends' => 'Anakin', 'format' => 'date'], ['description' => $description]);
|
||
|
$this->assertEquals([
|
||
|
'format' => 'date',
|
||
|
'extends' => 'Anakin'
|
||
|
], $p->toArray());
|
||
|
}
|
||
|
|
||
|
public function testHasKeyMethod()
|
||
|
{
|
||
|
$p = new Parameter(['name' => 'foo', 'sentAs' => 'bar']);
|
||
|
$this->assertEquals('bar', $p->getWireName());
|
||
|
}
|
||
|
|
||
|
public function testIncludesNameInToArrayWhenItemsAttributeHasName()
|
||
|
{
|
||
|
$p = new Parameter([
|
||
|
'type' => 'array',
|
||
|
'name' => 'Abc',
|
||
|
'items' => [
|
||
|
'name' => 'Foo',
|
||
|
'type' => 'object'
|
||
|
]
|
||
|
]);
|
||
|
$result = $p->toArray();
|
||
|
$this->assertEquals([
|
||
|
'type' => 'array',
|
||
|
'name' => 'Abc',
|
||
|
'items' => [
|
||
|
'name' => 'Foo',
|
||
|
'type' => 'object'
|
||
|
]
|
||
|
], $result);
|
||
|
}
|
||
|
|
||
|
public function dateTimeProvider()
|
||
|
{
|
||
|
$d = 'October 13, 2012 16:15:46 UTC';
|
||
|
|
||
|
return [
|
||
|
[$d, 'date-time', '2012-10-13T16:15:46Z'],
|
||
|
[$d, 'date', '2012-10-13'],
|
||
|
[$d, 'timestamp', strtotime($d)],
|
||
|
[new \DateTime($d), 'timestamp', strtotime($d)]
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dataProvider dateTimeProvider
|
||
|
*/
|
||
|
public function testAppliesFormat($d, $format, $result)
|
||
|
{
|
||
|
$p = new Parameter(['format' => $format], ['description' => new Description([])]);
|
||
|
$this->assertEquals($format, $p->getFormat());
|
||
|
$this->assertEquals($result, $p->filter($d));
|
||
|
}
|
||
|
|
||
|
public function testHasMinAndMax()
|
||
|
{
|
||
|
$p = new Parameter([
|
||
|
'minimum' => 2,
|
||
|
'maximum' => 3,
|
||
|
'minItems' => 4,
|
||
|
'maxItems' => 5,
|
||
|
]);
|
||
|
$this->assertEquals(2, $p->getMinimum());
|
||
|
$this->assertEquals(3, $p->getMaximum());
|
||
|
$this->assertEquals(4, $p->getMinItems());
|
||
|
$this->assertEquals(5, $p->getMaxItems());
|
||
|
}
|
||
|
|
||
|
public function testHasProperties()
|
||
|
{
|
||
|
$data = [
|
||
|
'type' => 'object',
|
||
|
'properties' => [
|
||
|
'foo' => ['type' => 'string'],
|
||
|
'bar' => ['type' => 'string'],
|
||
|
]
|
||
|
];
|
||
|
$p = new Parameter($data);
|
||
|
$this->assertInstanceOf('GuzzleHttp\\Command\\Guzzle\\Parameter', $p->getProperty('foo'));
|
||
|
$this->assertSame($p->getProperty('foo'), $p->getProperty('foo'));
|
||
|
$this->assertNull($p->getProperty('wefwe'));
|
||
|
|
||
|
$properties = $p->getProperties();
|
||
|
$this->assertInternalType('array', $properties);
|
||
|
foreach ($properties as $prop) {
|
||
|
$this->assertInstanceOf('GuzzleHttp\\Command\\Guzzle\\Parameter', $prop);
|
||
|
}
|
||
|
|
||
|
$this->assertEquals($data, $p->toArray());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @expectedException \InvalidArgumentException
|
||
|
* @expectedExceptionMessage Expected a string. Got: array
|
||
|
*/
|
||
|
public function testThrowsWhenNotPassString()
|
||
|
{
|
||
|
$emptyParam = new Parameter();
|
||
|
$this->assertFalse($emptyParam->has([]));
|
||
|
$this->assertFalse($emptyParam->has(new \stdClass()));
|
||
|
$this->assertFalse($emptyParam->has('1'));
|
||
|
$this->assertFalse($emptyParam->has(1));
|
||
|
}
|
||
|
|
||
|
public function testHasReturnsFalseForWrongOrEmptyValues()
|
||
|
{
|
||
|
$emptyParam = new Parameter();
|
||
|
$this->assertFalse($emptyParam->has(''));
|
||
|
$this->assertFalse($emptyParam->has('description'));
|
||
|
$this->assertFalse($emptyParam->has('noExisting'));
|
||
|
}
|
||
|
|
||
|
public function testHasReturnsTrueForCorrectValues()
|
||
|
{
|
||
|
$p = new Parameter([
|
||
|
'minimum' => 2,
|
||
|
'maximum' => 3,
|
||
|
'minItems' => 4,
|
||
|
'maxItems' => 5,
|
||
|
]);
|
||
|
|
||
|
$this->assertTrue($p->has('minimum'));
|
||
|
$this->assertTrue($p->has('maximum'));
|
||
|
$this->assertTrue($p->has('minItems'));
|
||
|
$this->assertTrue($p->has('maxItems'));
|
||
|
}
|
||
|
}
|