diff --git a/tests/Executor/LazyInterfaceTest.php b/tests/Executor/LazyInterfaceTest.php new file mode 100644 index 0000000..81d4c4c --- /dev/null +++ b/tests/Executor/LazyInterfaceTest.php @@ -0,0 +1,129 @@ + 'query', + 'fields' => function () { + return [ + 'lazyInterface' => [ + 'type' => $this->getLazyInterfaceType(), + 'resolve' => function() { + return []; + } + ], + 'testObject' => [ + 'type' => $this->getTestObjectType() + ] + ]; + } + ]); + + $this->schema = new Schema(['query' => $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()); + } +}