forked from OSS/graphql
Compare commits
2 Commits
4063d48a37
...
59aa010f0b
Author | SHA1 | Date | |
---|---|---|---|
59aa010f0b | |||
b1c5a568dd |
@ -618,6 +618,10 @@ noUndefinedVariablesRule =
|
||||
, "\"."
|
||||
]
|
||||
|
||||
-- Used to find the difference between defined and used variables. The first
|
||||
-- argument are variables defined in the operation, the second argument are
|
||||
-- variables used in the query. It should return the difference between these
|
||||
-- 2 sets.
|
||||
type UsageDifference
|
||||
= HashMap Full.Name [Full.Location]
|
||||
-> HashMap Full.Name [Full.Location]
|
||||
@ -664,11 +668,26 @@ variableUsageDifference difference errorMessage = OperationDefinitionRule $ \cas
|
||||
= filterSelections' selections
|
||||
>>= lift . mapReaderT (<> mapDirectives directives') . pure
|
||||
findDirectiveVariables (Full.Directive _ arguments _) = mapArguments arguments
|
||||
mapArguments = Seq.fromList . mapMaybe findArgumentVariables
|
||||
|
||||
mapArguments = Seq.fromList . (>>= findArgumentVariables)
|
||||
mapDirectives = foldMap findDirectiveVariables
|
||||
findArgumentVariables (Full.Argument _ Full.Node{ node = Full.Variable value', ..} _) =
|
||||
Just (value', [location])
|
||||
findArgumentVariables _ = Nothing
|
||||
|
||||
findArgumentVariables (Full.Argument _ Full.Node{node = value, ..} _) =
|
||||
findValueVariables location value
|
||||
|
||||
findValueVariables location (Full.Variable value') = [(value', [location])]
|
||||
findValueVariables location (Full.List values) =
|
||||
values
|
||||
>>= (\(Full.Node{node = value}) -> findValueVariables location value)
|
||||
findValueVariables _ (Full.Object fields) =
|
||||
fields
|
||||
>>= ( \( Full.ObjectField
|
||||
{ location = location
|
||||
, value = Full.Node{node = value}
|
||||
}
|
||||
) -> findValueVariables location value
|
||||
)
|
||||
findValueVariables _ _ = []
|
||||
makeError operationName (variableName, locations') = Error
|
||||
{ message = errorMessage operationName variableName
|
||||
, locations = locations'
|
||||
|
@ -18,7 +18,7 @@ import Language.GraphQL.Type
|
||||
import qualified Language.GraphQL.Type.In as In
|
||||
import qualified Language.GraphQL.Type.Out as Out
|
||||
import Language.GraphQL.Validate
|
||||
import Test.Hspec (Spec, context, describe, it, shouldBe, shouldContain)
|
||||
import Test.Hspec (Spec, context, describe, it, shouldBe, shouldContain, xit)
|
||||
import Text.Megaparsec (parse, errorBundlePretty)
|
||||
|
||||
petSchema :: Schema IO
|
||||
@ -560,7 +560,7 @@ spec =
|
||||
}
|
||||
in validate queryString `shouldBe` [expected]
|
||||
|
||||
context "noUnusedVariablesRule" $
|
||||
context "noUnusedVariablesRule" $ do
|
||||
it "rejects unused variables" $
|
||||
let queryString = [gql|
|
||||
query variableUnused($atOtherHomes: Boolean) {
|
||||
@ -577,6 +577,16 @@ spec =
|
||||
}
|
||||
in validate queryString `shouldBe` [expected]
|
||||
|
||||
xit "detects variables in properties of input objects" $
|
||||
let queryString = [gql|
|
||||
query withVar ($name: String!) {
|
||||
findDog (complex: { name: $name }) {
|
||||
name
|
||||
}
|
||||
}
|
||||
|]
|
||||
in validate queryString `shouldBe` []
|
||||
|
||||
context "uniqueInputFieldNamesRule" $
|
||||
it "rejects duplicate fields in input objects" $
|
||||
let queryString = [gql|
|
||||
|
Loading…
x
Reference in New Issue
Block a user