assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery('{ a, b }')); } public function testWorksOnScalars() { // if true includes scalar $this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery('{ a, b @if:true }')); // if false omits on scalar $this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery('{ a, b @if:false }')); // unless false includes scalar $this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery('{ a, b @unless:false }')); // unless true omits scalar $this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery('{ a, b @unless:true }')); } public function testWorksOnFragmentSpreads() { // if false omits fragment spread $q = ' query Q { a ...Frag @if:false } fragment Frag on TestType { b } '; $this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q)); // if true includes fragment spread $q = ' query Q { a ...Frag @if:true } fragment Frag on TestType { b } '; $this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q)); // unless false includes fragment spread $q = ' query Q { a ...Frag @unless:false } fragment Frag on TestType { b } '; $this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q)); // unless true omits fragment spread $q = ' query Q { a ...Frag @unless:true } fragment Frag on TestType { b } '; $this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q)); } public function testWorksOnInlineFragment() { // if false omits inline fragment $q = ' query Q { a ... on TestType @if:false { b } } fragment Frag on TestType { b } '; $this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q)); // if true includes inline fragment $q = ' query Q { a ... on TestType @if:true { b } } fragment Frag on TestType { b } '; $this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q)); // unless false includes inline fragment $q = ' query Q { a ... on TestType @unless:false { b } } fragment Frag on TestType { b } '; $this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q)); // unless true includes inline fragment $q = ' query Q { a ... on TestType @unless:true { b } } fragment Frag on TestType { b } '; $this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q)); } public function testWorksOnFragment() { // if false omits fragment $q = ' query Q { a ...Frag } fragment Frag on TestType @if:false { b } '; $this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q)); // if true includes fragment $q = ' query Q { a ...Frag } fragment Frag on TestType @if:true { b } '; $this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q)); // unless false includes fragment $q = ' query Q { a ...Frag } fragment Frag on TestType @unless:false { b } '; $this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q)); // unless true omits fragment $q = ' query Q { a ...Frag } fragment Frag on TestType @unless:true { b } '; $this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q)); } private static $schema; private static $data; private static function getSchema() { return self::$schema ?: (self::$schema = new Schema(new ObjectType([ 'name' => 'TestType', 'fields' => [ 'a' => ['type' => Type::string()], 'b' => ['type' => Type::string()] ] ]))); } private static function getData() { return self::$data ?: (self::$data = [ 'a' => function() { return 'a'; }, 'b' => function() { return 'b'; } ]); } private function executeTestQuery($doc) { return Executor::execute(self::getSchema(), self::getData(), Parser::parse($doc)); } }