Merge pull request #210 from enumag/patch-1

Allow objects with __toString in IDType
This commit is contained in:
Vladimir Razuvaev 2017-12-12 16:02:09 +07:00 committed by GitHub
commit bb75586aa5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 1 deletions

View File

@ -43,7 +43,7 @@ When expected as an input type, any string (such as `"4"`) or integer
if ($value === null) { if ($value === null) {
return 'null'; return 'null';
} }
if (!is_scalar($value)) { if (!is_scalar($value) && (!is_object($value) || !method_exists($value, '__toString'))) {
throw new InvariantViolation("ID type cannot represent non scalar value: " . Utils::printSafe($value)); throw new InvariantViolation("ID type cannot represent non scalar value: " . Utils::printSafe($value));
} }
return (string) $value; return (string) $value;

View File

@ -0,0 +1,23 @@
<?php
namespace GraphQL\Tests\Type;
class ObjectIdStub
{
/**
* @var int
*/
private $id;
/**
* @param int $id
*/
public function __construct($id)
{
$this->id = $id;
}
public function __toString()
{
return (string) $this->id;
}
}

View File

@ -178,4 +178,25 @@ class ScalarSerializationTest extends \PHPUnit_Framework_TestCase
// TODO: how should it behave on '0'? // TODO: how should it behave on '0'?
} }
public function testSerializesOutputID()
{
$idType = Type::id();
$this->assertSame('string', $idType->serialize('string'));
$this->assertSame('', $idType->serialize(''));
$this->assertSame('1', $idType->serialize('1'));
$this->assertSame('1', $idType->serialize(1));
$this->assertSame('0', $idType->serialize(0));
$this->assertSame('true', $idType->serialize(true));
$this->assertSame('false', $idType->serialize(false));
$this->assertSame('2', $idType->serialize(new ObjectIdStub(2)));
try {
$idType->serialize(new \stdClass());
$this->fail('Expected exception was not thrown');
} catch (InvariantViolation $e) {
$this->assertEquals('ID type cannot represent non scalar value: instance of stdClass', $e->getMessage());
}
}
} }