Skip to content

Commit

Permalink
Merge pull request #210 from enumag/patch-1
Browse files Browse the repository at this point in the history
Allow objects with __toString in IDType
  • Loading branch information
vladar committed Dec 12, 2017
2 parents 3536280 + 9e2c1da commit bb75586
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/Type/Definition/IDType.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public function serialize($value)
if ($value === 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));
}
return (string) $value;
Expand Down
23 changes: 23 additions & 0 deletions tests/Type/ObjectIdStub.php
Original file line number Diff line number Diff line change
@@ -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;
}
}
21 changes: 21 additions & 0 deletions tests/Type/ScalarSerializationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -178,4 +178,25 @@ public function testSerializesOutputBoolean()

// 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());
}
}
}

0 comments on commit bb75586

Please sign in to comment.