Convert error to warning for non-compliant usage of __ in names

This commit is contained in:
Vladimir Razuvaev 2017-07-04 00:28:17 +07:00
parent 34bd378c7e
commit c5484ae6f9
3 changed files with 50 additions and 3 deletions

24
src/Error/Warning.php Normal file
View File

@ -0,0 +1,24 @@
<?php
namespace GraphQL\Error;
final class Warning
{
static $supressWarnings = false;
static $warned = [];
static function supress($set = true)
{
self::$supressWarnings = $set;
}
static function warnOnce($errorMessage, $errorId = null)
{
$errorId = $errorId ?: $errorMessage;
if (!self::$supressWarnings && !isset(self::$warned[$errorId])) {
self::$warned[$errorId] = true;
trigger_error($errorMessage, E_USER_WARNING);
}
}
}

View File

@ -2,6 +2,7 @@
namespace GraphQL; namespace GraphQL;
use GraphQL\Error\InvariantViolation; use GraphQL\Error\InvariantViolation;
use GraphQL\Error\Warning;
use GraphQL\Type\Definition\Type; use GraphQL\Type\Definition\Type;
use GraphQL\Type\Definition\WrappingType; use GraphQL\Type\Definition\WrappingType;
use GraphQL\Utils\SchemaUtils; use GraphQL\Utils\SchemaUtils;
@ -351,9 +352,10 @@ class Utils
} }
if (!$isIntrospection && isset($name[1]) && $name[0] === '_' && $name[1] === '_') { if (!$isIntrospection && isset($name[1]) && $name[0] === '_' && $name[1] === '_') {
throw new InvariantViolation( Warning::warnOnce(
'Name "'.$name.'" must not begin with "__", which is reserved by ' . 'Name "'.$name.'" must not begin with "__", which is reserved by ' .
'GraphQL introspection.' 'GraphQL introspection.',
'warnAboutDunder'
); );
} }

View File

@ -34,7 +34,7 @@ class ValidationTest extends \PHPUnit_Framework_TestCase
public function testRejectsAnObjectTypeWithReservedName() public function testRejectsAnObjectTypeWithReservedName()
{ {
$this->assertEachCallableThrows([ $this->assertWarnsOnce([
function() { function() {
return new ObjectType([ return new ObjectType([
'name' => '__ReservedName', 'name' => '__ReservedName',
@ -53,6 +53,7 @@ class ValidationTest extends \PHPUnit_Framework_TestCase
function() { function() {
return new UnionType([ return new UnionType([
'name' => '__ReservedName', 'name' => '__ReservedName',
'types' => [new ObjectType(['name' => 'Test'])]
]); ]);
}, },
function() { function() {
@ -268,6 +269,26 @@ class ValidationTest extends \PHPUnit_Framework_TestCase
} }
} }
private function assertWarnsOnce($closures, $expectedError)
{
$warned = false;
foreach ($closures as $index => $factory) {
if (!$warned) {
try {
$factory();
$this->fail('Expected exception not thrown for entry ' . $index);
} catch (\PHPUnit_Framework_Error_Warning $e) {
$warned = true;
$this->assertEquals($expectedError, $e->getMessage(), 'Error in callable #' . $index);
}
} else {
// Should not throw
$factory();
}
}
}
private function schemaWithFieldType($type) private function schemaWithFieldType($type)
{ {
return new Schema([ return new Schema([