Skip to content

Commit

Permalink
Fixes issue for lazily created interfaces webonyx#38
Browse files Browse the repository at this point in the history
  • Loading branch information
ivome committed May 3, 2016
1 parent 7916c54 commit 53928c9
Show file tree
Hide file tree
Showing 2 changed files with 134 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/Type/Definition/InterfaceType.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,15 @@ public function getField($name)
}

/**
* Returns possible types, loads implementations if they were not loaded previously
*
* @return array<GraphQLObjectType>
*/
public function getPossibleTypes()
{
if (self::$_lazyLoadImplementations) {
self::loadImplementationToInterfaces();
}
return $this->_implementations;
}

Expand Down
129 changes: 129 additions & 0 deletions tests/Executor/LazyInterfaceTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
<?php
/**
* @author: Ivo Meißner
* Date: 03.05.16
* Time: 13:14
*/
namespace GraphQL\Tests\Executor;

use GraphQL\Executor\Executor;
use GraphQL\Language\Parser;
use GraphQL\Schema;
use GraphQL\Type\Definition\InterfaceType;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;

class LazyInterfaceTest extends \PHPUnit_Framework_TestCase
{
/**
* @var Schema
*/
protected $schema;

/**
* @var InterfaceType
*/
protected $lazyInterface;

/**
* @var ObjectType
*/
protected $testObject;

/**
* Setup schema
*/
protected function setUp()
{
$query = new ObjectType([
'name' => 'query',
'fields' => function () {
return [
'lazyInterface' => [
'type' => $this->getLazyInterfaceType(),
'resolve' => function() {
return [];
}
],
'testObject' => [
'type' => $this->getTestObjectType()
]
];
}
]);

$this->schema = new Schema($query);
}

/**
* Returns the LazyInterface
*
* @return InterfaceType
*/
protected function getLazyInterfaceType()
{
if (!$this->lazyInterface) {
$this->lazyInterface = new InterfaceType([
'name' => 'LazyInterface',
'resolveType' => function() {
return $this->getTestObjectType();
},
'resolve' => function() {
return [];
}
]);
}

return $this->lazyInterface;
}

/**
* Returns the test ObjectType
* @return ObjectType
*/
protected function getTestObjectType()
{
if (!$this->testObject) {
$this->testObject = new ObjectType([
'name' => 'TestObject',
'fields' => [
'name' => [
'type' => Type::string(),
'resolve' => function() {
return 'testname';
}
]
],
'interfaces' => [$this->getLazyInterfaceType()]
]);
}

return $this->testObject;
}

/**
* Handles execution of a lazily created interface
*/
public function testReturnsFragmentsWithLazyCreatedInterface()
{
$request = '
{
lazyInterface {
... on TestObject {
name
}
}
}
';

$expected = [
'data' => [
'lazyInterface' => [
'name' => 'testname'
]
]
];

$this->assertEquals($expected, Executor::execute($this->schema, Parser::parse($request))->toArray());
}
}

0 comments on commit 53928c9

Please sign in to comment.