Fix astFromValue to correctly handle integers and strings

This commit is contained in:
Vladimir Razuvaev 2018-08-08 14:57:44 +07:00
parent 49ec89b28f
commit fcb9c24bb5
3 changed files with 119 additions and 24 deletions

View File

@ -39,6 +39,8 @@ use GraphQL\Type\Schema;
*/
class AST
{
public static $integerStringRegExp = '/^-?(0|[1-9][0-9]*)$/';
/**
* Convert representation of AST as an associative array to instance of GraphQL\Language\AST\Node.
*
@ -250,7 +252,7 @@ class AST
// Use json_encode, which uses the same string encoding as GraphQL,
// then remove the quotes.
return new StringValueNode([
'value' => substr(json_encode($serialized), 1, -1)
'value' => $serialized
]);
}

View File

@ -40,6 +40,7 @@ class AstFromValueTest extends TestCase
*/
public function testConvertsIntValuesToASTs()
{
$this->assertEquals(new IntValueNode(['value' => '-1']), AST::astFromValue(-1, Type::int()));
$this->assertEquals(new IntValueNode(['value' => '123']), AST::astFromValue(123.0, Type::int()));
$this->assertEquals(new IntValueNode(['value' => '10000']), AST::astFromValue(1e4, Type::int()));
$this->assertEquals(new IntValueNode(['value' => '0']), AST::astFromValue(0e4, Type::int()));
@ -66,6 +67,7 @@ class AstFromValueTest extends TestCase
*/
public function testConvertsFloatValuesToIntOrFloatASTs()
{
$this->assertEquals(new IntValueNode(['value' => '-1']), AST::astFromValue(-1, Type::float()));
$this->assertEquals(new IntValueNode(['value' => '123']), AST::astFromValue(123, Type::float()));
$this->assertEquals(new IntValueNode(['value' => '123']), AST::astFromValue(123.0, Type::float()));
$this->assertEquals(new FloatValueNode(['value' => '123.5']), AST::astFromValue(123.5, Type::float()));
@ -81,7 +83,7 @@ class AstFromValueTest extends TestCase
{
$this->assertEquals(new StringValueNode(['value' => 'hello']), AST::astFromValue('hello', Type::string()));
$this->assertEquals(new StringValueNode(['value' => 'VALUE']), AST::astFromValue('VALUE', Type::string()));
$this->assertEquals(new StringValueNode(['value' => 'VA\\nLUE']), AST::astFromValue("VA\nLUE", Type::string()));
$this->assertEquals(new StringValueNode(['value' => "VA\nLUE"]), AST::astFromValue("VA\nLUE", Type::string()));
$this->assertEquals(new StringValueNode(['value' => '123']), AST::astFromValue(123, Type::string()));
$this->assertEquals(new StringValueNode(['value' => 'false']), AST::astFromValue(false, Type::string()));
$this->assertEquals(new NullValueNode([]), AST::astFromValue(null, Type::string()));
@ -95,8 +97,11 @@ class AstFromValueTest extends TestCase
{
$this->assertEquals(new StringValueNode(['value' => 'hello']), AST::astFromValue('hello', Type::id()));
$this->assertEquals(new StringValueNode(['value' => 'VALUE']), AST::astFromValue('VALUE', Type::id()));
$this->assertEquals(new StringValueNode(['value' => 'VA\\nLUE']), AST::astFromValue("VA\nLUE", Type::id()));
$this->assertEquals(new StringValueNode(['value' => "VA\nLUE"]), AST::astFromValue("VA\nLUE", Type::id()));
$this->assertEquals(new IntValueNode(['value' => '-1']), AST::astFromValue(-1, Type::id()));
$this->assertEquals(new IntValueNode(['value' => '123']), AST::astFromValue(123, Type::id()));
$this->assertEquals(new IntValueNode(['value' => '123']), AST::astFromValue('123', Type::id()));
$this->assertEquals(new StringValueNode(['value' => '01']), AST::astFromValue('01', Type::id()));
$this->assertEquals(new StringValueNode(['value' => 'false']), AST::astFromValue(false, Type::id()));
$this->assertEquals(new NullValueNode([]), AST::astFromValue(null, Type::id()));
$this->assertEquals(null, AST::astFromValue(null, Type::nonNull(Type::id())));

View File

@ -27,7 +27,7 @@ class SchemaPrinterTest extends TestCase
private function printSingleFieldSchema($fieldConfig)
{
$query = new ObjectType([
'name' => 'Query',
'name' => 'Root',
'fields' => [
'singleField' => $fieldConfig
]
@ -44,7 +44,11 @@ class SchemaPrinterTest extends TestCase
'type' => Type::string()
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField: String
}
', $output);
@ -59,7 +63,11 @@ type Query {
'type' => Type::listOf(Type::string())
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField: [String]
}
', $output);
@ -74,7 +82,11 @@ type Query {
'type' => Type::nonNull(Type::string())
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField: String!
}
', $output);
@ -89,7 +101,11 @@ type Query {
'type' => Type::nonNull(Type::listOf(Type::string()))
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField: [String]!
}
', $output);
@ -104,7 +120,11 @@ type Query {
'type' => Type::listOf(Type::nonNull(Type::string()))
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField: [String!]
}
', $output);
@ -119,7 +139,11 @@ type Query {
'type' => Type::nonNull(Type::listOf(Type::nonNull(Type::string())))
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField: [String!]!
}
', $output);
@ -167,7 +191,11 @@ type Root {
'args' => ['argOne' => ['type' => Type::int()]]
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField(argOne: Int): String
}
', $output);
@ -183,12 +211,36 @@ type Query {
'args' => ['argOne' => ['type' => Type::int(), 'defaultValue' => 2]]
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField(argOne: Int = 2): String
}
', $output);
}
/**
* @it Prints String Field With String Arg With Default
*/
public function testPrintsStringFieldWithStringArgWithDefault()
{
$output = $this->printSingleFieldSchema([
'type' => Type::string(),
'args' => ['argOne' => ['type' => Type::string(), 'defaultValue' => "tes\t de\fault"]],
]);
$this->assertEquals('
schema {
query: Root
}
type Root {
singleField(argOne: String = "tes\t de\fault"): String
}
', $output);
}
/**
* @it Prints String Field With Int Arg With Default Null
*/
@ -199,7 +251,11 @@ type Query {
'args' => ['argOne' => ['type' => Type::int(), 'defaultValue' => null]]
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField(argOne: Int = null): String
}
', $output);
@ -215,7 +271,11 @@ type Query {
'args' => ['argOne' => ['type' => Type::nonNull(Type::int())]]
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField(argOne: Int!): String
}
', $output);
@ -234,7 +294,11 @@ type Query {
]
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField(argOne: Int, argTwo: String): String
}
', $output);
@ -254,7 +318,11 @@ type Query {
]
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField(argOne: Int = 1, argTwo: String, argThree: Boolean): String
}
', $output);
@ -274,7 +342,11 @@ type Query {
]
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField(argOne: Int, argTwo: String = "foo", argThree: Boolean): String
}
', $output);
@ -294,7 +366,11 @@ type Query {
]
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
singleField(argOne: Int, argTwo: String, argThree: Boolean = false): String
}
', $output);
@ -619,13 +695,17 @@ type Query {
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
"""This field is awesome"""
singleField: String
}
', $output);
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Query'];
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Root'];
$recreatedField = $recreatedRoot->getFields()['singleField'];
$this->assertEquals($description, $recreatedField->description);
}
@ -642,7 +722,11 @@ type Query {
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
"""
This field is "awesome"
"""
@ -650,7 +734,7 @@ type Query {
}
', $output);
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Query'];
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Root'];
$recreatedField = $recreatedRoot->getFields()['singleField'];
$this->assertEquals($description, $recreatedField->description);
}
@ -667,14 +751,18 @@ type Query {
]);
$this->assertEquals('
type Query {
schema {
query: Root
}
type Root {
""" This field is "awesome"
"""
singleField: String
}
', $output);
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Query'];
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Root'];
$recreatedField = $recreatedRoot->getFields()['singleField'];
$this->assertEquals($description, $recreatedField->description);
}