aboutsummaryrefslogtreecommitdiff
path: root/tests/Language/GraphQL/Validate/RulesSpec.hs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Language/GraphQL/Validate/RulesSpec.hs')
-rw-r--r--tests/Language/GraphQL/Validate/RulesSpec.hs48
1 files changed, 30 insertions, 18 deletions
diff --git a/tests/Language/GraphQL/Validate/RulesSpec.hs b/tests/Language/GraphQL/Validate/RulesSpec.hs
index c48b329..9ec74c3 100644
--- a/tests/Language/GraphQL/Validate/RulesSpec.hs
+++ b/tests/Language/GraphQL/Validate/RulesSpec.hs
@@ -94,7 +94,7 @@ dogType = ObjectType "Dog" Nothing [petType] $ HashMap.fromList
, ("nickname", nicknameResolver)
, ("barkVolume", barkVolumeResolver)
, ("doesKnowCommand", doesKnowCommandResolver)
- , ("isHousetrained", isHousetrainedResolver)
+ , ("isHouseTrained", isHouseTrainedResolver)
, ("owner", ownerResolver)
]
where
@@ -105,10 +105,10 @@ dogType = ObjectType "Dog" Nothing [petType] $ HashMap.fromList
$ In.Argument Nothing (In.NonNullEnumType dogCommandType) Nothing
doesKnowCommandResolver = ValueResolver doesKnowCommandField
$ pure $ Boolean True
- isHousetrainedField = Field Nothing (Out.NonNullScalarType boolean)
+ isHouseTrainedField = Field Nothing (Out.NonNullScalarType boolean)
$ HashMap.singleton "atOtherHomes"
$ In.Argument Nothing (In.NamedScalarType boolean) Nothing
- isHousetrainedResolver = ValueResolver isHousetrainedField
+ isHouseTrainedResolver = ValueResolver isHouseTrainedField
$ pure $ Boolean True
ownerField = Field Nothing (Out.NamedObjectType humanType) mempty
ownerResolver = ValueResolver ownerField $ pure Null
@@ -206,6 +206,18 @@ spec =
}
in validate queryString `shouldContain` [expected]
+ it "rejects an introspection field as the subscription root" $
+ let queryString = "subscription sub {\n\
+ \ __typename\n\
+ \}"
+ expected = Error
+ { message =
+ "Subscription \"sub\" must select exactly one top \
+ \level field, which must not be an introspection field."
+ , locations = [AST.Location 1 1]
+ }
+ in validate queryString `shouldContain` [expected]
+
it "rejects multiple subscription root fields coming from a fragment" $
let queryString = "subscription sub {\n\
\ ...multipleSubscriptions\n\
@@ -455,7 +467,7 @@ spec =
it "rejects duplicate field arguments" $
let queryString = "{\n\
\ dog {\n\
- \ isHousetrained(atOtherHomes: true, atOtherHomes: true)\n\
+ \ isHouseTrained(atOtherHomes: true, atOtherHomes: true)\n\
\ }\n\
\}"
expected = Error
@@ -492,7 +504,7 @@ spec =
it "rejects duplicate variables" $
let queryString = "query houseTrainedQuery($atOtherHomes: Boolean, $atOtherHomes: Boolean) {\n\
\ dog {\n\
- \ isHousetrained(atOtherHomes: $atOtherHomes)\n\
+ \ isHouseTrained(atOtherHomes: $atOtherHomes)\n\
\ }\n\
\}"
expected = Error
@@ -507,7 +519,7 @@ spec =
it "rejects non-input types as variables" $
let queryString = "query takesDogBang($dog: Dog!) {\n\
\ dog {\n\
- \ isHousetrained(atOtherHomes: $dog)\n\
+ \ isHouseTrained(atOtherHomes: $dog)\n\
\ }\n\
\}"
expected = Error
@@ -522,12 +534,12 @@ spec =
it "rejects undefined variables" $
let queryString = "query variableIsNotDefinedUsedInSingleFragment {\n\
\ dog {\n\
- \ ...isHousetrainedFragment\n\
+ \ ...isHouseTrainedFragment\n\
\ }\n\
\}\n\
\\n\
- \fragment isHousetrainedFragment on Dog {\n\
- \ isHousetrained(atOtherHomes: $atOtherHomes)\n\
+ \fragment isHouseTrainedFragment on Dog {\n\
+ \ isHouseTrained(atOtherHomes: $atOtherHomes)\n\
\}"
expected = Error
{ message =
@@ -566,7 +578,7 @@ spec =
it "rejects unused variables" $
let queryString = "query variableUnused($atOtherHomes: Boolean) {\n\
\ dog {\n\
- \ isHousetrained\n\
+ \ isHouseTrained\n\
\ }\n\
\}"
expected = Error
@@ -648,7 +660,7 @@ spec =
it "rejects directive arguments missing in the definition" $
let queryString = "{\n\
\ dog {\n\
- \ isHousetrained(atOtherHomes: true) @include(unless: false, if: true)\n\
+ \ isHouseTrained(atOtherHomes: true) @include(unless: false, if: true)\n\
\ }\n\
\}"
expected = Error
@@ -663,7 +675,7 @@ spec =
it "rejects undefined directives" $
let queryString = "{\n\
\ dog {\n\
- \ isHousetrained(atOtherHomes: true) @ignore(if: true)\n\
+ \ isHouseTrained(atOtherHomes: true) @ignore(if: true)\n\
\ }\n\
\}"
expected = Error
@@ -740,13 +752,13 @@ spec =
let queryString = "{\n\
\ dog {\n\
\ doesKnowCommand(dogCommand: SIT)\n\
- \ doesKnowCommand: isHousetrained(atOtherHomes: true)\n\
+ \ doesKnowCommand: isHouseTrained(atOtherHomes: true)\n\
\ }\n\
\}"
expected = Error
{ message =
"Fields \"doesKnowCommand\" conflict because \
- \\"doesKnowCommand\" and \"isHousetrained\" are \
+ \\"doesKnowCommand\" and \"isHouseTrained\" are \
\different fields. Use different aliases on the \
\fields to fetch both if this was intentional."
, locations = [AST.Location 3 5, AST.Location 4 5]
@@ -761,13 +773,13 @@ spec =
\ }\n\
\ dog {\n\
\ name\n\
- \ doesKnowCommand: isHousetrained(atOtherHomes: true)\n\
+ \ doesKnowCommand: isHouseTrained(atOtherHomes: true)\n\
\ }\n\
\}"
expected = Error
{ message =
"Fields \"doesKnowCommand\" conflict because \
- \\"doesKnowCommand\" and \"isHousetrained\" are \
+ \\"doesKnowCommand\" and \"isHouseTrained\" are \
\different fields. Use different aliases on the \
\fields to fetch both if this was intentional."
, locations = [AST.Location 4 5, AST.Location 8 5]
@@ -860,7 +872,7 @@ spec =
it "rejects wrongly typed variable arguments" $
let queryString = "query intCannotGoIntoBoolean($intArg: Int) {\n\
\ dog {\n\
- \ isHousetrained(atOtherHomes: $intArg)\n\
+ \ isHouseTrained(atOtherHomes: $intArg)\n\
\ }\n\
\}"
expected = Error
@@ -875,7 +887,7 @@ spec =
it "rejects values of incorrect types" $
let queryString = "{\n\
\ dog {\n\
- \ isHousetrained(atOtherHomes: 3)\n\
+ \ isHouseTrained(atOtherHomes: 3)\n\
\ }\n\
\}"
expected = Error