Skip to content

Commit 148e680

Browse files
committed
Disallow "true", "false", and "null" as enum values
Replicates graphql/graphql-js@af878f3
1 parent 9e53cb4 commit 148e680

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/graphql/language/parser.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ def parse_enum_value_definition(self) -> EnumValueDefinitionNode:
820820
"""EnumValueDefinition: Description? EnumValue Directives[Const]?"""
821821
start = self._lexer.token
822822
description = self.parse_description()
823-
name = self.parse_name()
823+
name = self.parse_enum_value_name()
824824
directives = self.parse_const_directives()
825825
return EnumValueDefinitionNode(
826826
description=description,
@@ -829,6 +829,17 @@ def parse_enum_value_definition(self) -> EnumValueDefinitionNode:
829829
loc=self.loc(start),
830830
)
831831

832+
def parse_enum_value_name(self) -> NameNode:
833+
"""EnumValue: Name but not ``true``, ``false`` or ``null``"""
834+
if self._lexer.token.value in ("true", "false", "null"):
835+
raise GraphQLSyntaxError(
836+
self._lexer.source,
837+
self._lexer.token.start,
838+
f"{get_token_desc(self._lexer.token)} is reserved"
839+
" and cannot be used for an enum value.",
840+
)
841+
return self.parse_name()
842+
832843
def parse_input_object_type_definition(self) -> InputObjectTypeDefinitionNode:
833844
"""InputObjectTypeDefinition"""
834845
start = self._lexer.token

tests/language/test_parser.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,23 @@ def does_not_accept_fragments_named_on():
112112
def does_not_accept_fragments_spread_of_on():
113113
assert_syntax_error("{ ...on }", "Expected Name, found '}'.", (1, 9))
114114

115+
def does_not_allow_true_false_or_null_as_enum_value():
116+
assert_syntax_error(
117+
"enum Test { VALID, true }",
118+
"Name 'true' is reserved and cannot be used for an enum value.",
119+
(1, 20),
120+
)
121+
assert_syntax_error(
122+
"enum Test { VALID, false }",
123+
"Name 'false' is reserved and cannot be used for an enum value.",
124+
(1, 20),
125+
)
126+
assert_syntax_error(
127+
"enum Test { VALID, null }",
128+
"Name 'null' is reserved and cannot be used for an enum value.",
129+
(1, 20),
130+
)
131+
115132
def parses_multi_byte_characters():
116133
# Note: \u0A0A could be naively interpreted as two line-feed chars.
117134
doc = parse(

0 commit comments

Comments
 (0)