validationErrors($query); $this->assertEquals(true, empty($errors)); } /** * @see it('Notes that non-existent fields are invalid') */ public function testThatNonExistentFieldsAreInvalid() { $query = ' query HeroSpaceshipQuery { hero { favoriteSpaceship } } '; $errors = $this->validationErrors($query); $this->assertEquals(false, empty($errors)); } /** * @see it('Requires fields on objects') */ public function testRequiresFieldsOnObjects() { $query = ' query HeroNoFieldsQuery { hero } '; $errors = $this->validationErrors($query); $this->assertEquals(false, empty($errors)); } /** * @see it('Disallows fields on scalars') */ public function testDisallowsFieldsOnScalars() { $query = ' query HeroFieldsOnScalarQuery { hero { name { firstCharacterOfName } } } '; $errors = $this->validationErrors($query); $this->assertEquals(false, empty($errors)); } /** * @see it('Disallows object fields on interfaces') */ public function testDisallowsObjectFieldsOnInterfaces() { $query = ' query DroidFieldOnCharacter { hero { name primaryFunction } } '; $errors = $this->validationErrors($query); $this->assertEquals(false, empty($errors)); } /** * @see it('Allows object fields in fragments') */ public function testAllowsObjectFieldsInFragments() { $query = ' query DroidFieldInFragment { hero { name ...DroidFields } } fragment DroidFields on Droid { primaryFunction } '; $errors = $this->validationErrors($query); $this->assertEquals(true, empty($errors)); } /** * @see it('Allows object fields in inline fragments') */ public function testAllowsObjectFieldsInInlineFragments() { $query = ' query DroidFieldInFragment { hero { name ... on Droid { primaryFunction } } } '; $errors = $this->validationErrors($query); $this->assertEquals(true, empty($errors)); } /** * Helper function to test a query and the expected response. */ private function validationErrors($query) { $ast = Parser::parse($query); return DocumentValidator::validate(StarWarsSchema::build(), $ast); } }