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
|
type UsageDifference
|
||||||
= HashMap Full.Name [Full.Location]
|
= HashMap Full.Name [Full.Location]
|
||||||
-> HashMap Full.Name [Full.Location]
|
-> HashMap Full.Name [Full.Location]
|
||||||
@ -664,11 +668,26 @@ variableUsageDifference difference errorMessage = OperationDefinitionRule $ \cas
|
|||||||
= filterSelections' selections
|
= filterSelections' selections
|
||||||
>>= lift . mapReaderT (<> mapDirectives directives') . pure
|
>>= lift . mapReaderT (<> mapDirectives directives') . pure
|
||||||
findDirectiveVariables (Full.Directive _ arguments _) = mapArguments arguments
|
findDirectiveVariables (Full.Directive _ arguments _) = mapArguments arguments
|
||||||
mapArguments = Seq.fromList . mapMaybe findArgumentVariables
|
|
||||||
|
mapArguments = Seq.fromList . (>>= findArgumentVariables)
|
||||||
mapDirectives = foldMap findDirectiveVariables
|
mapDirectives = foldMap findDirectiveVariables
|
||||||
findArgumentVariables (Full.Argument _ Full.Node{ node = Full.Variable value', ..} _) =
|
|
||||||
Just (value', [location])
|
findArgumentVariables (Full.Argument _ Full.Node{node = value, ..} _) =
|
||||||
findArgumentVariables _ = Nothing
|
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
|
makeError operationName (variableName, locations') = Error
|
||||||
{ message = errorMessage operationName variableName
|
{ message = errorMessage operationName variableName
|
||||||
, locations = locations'
|
, locations = locations'
|
||||||
|
@ -18,7 +18,7 @@ import Language.GraphQL.Type
|
|||||||
import qualified Language.GraphQL.Type.In as In
|
import qualified Language.GraphQL.Type.In as In
|
||||||
import qualified Language.GraphQL.Type.Out as Out
|
import qualified Language.GraphQL.Type.Out as Out
|
||||||
import Language.GraphQL.Validate
|
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)
|
import Text.Megaparsec (parse, errorBundlePretty)
|
||||||
|
|
||||||
petSchema :: Schema IO
|
petSchema :: Schema IO
|
||||||
@ -560,7 +560,7 @@ spec =
|
|||||||
}
|
}
|
||||||
in validate queryString `shouldBe` [expected]
|
in validate queryString `shouldBe` [expected]
|
||||||
|
|
||||||
context "noUnusedVariablesRule" $
|
context "noUnusedVariablesRule" $ do
|
||||||
it "rejects unused variables" $
|
it "rejects unused variables" $
|
||||||
let queryString = [gql|
|
let queryString = [gql|
|
||||||
query variableUnused($atOtherHomes: Boolean) {
|
query variableUnused($atOtherHomes: Boolean) {
|
||||||
@ -577,6 +577,16 @@ spec =
|
|||||||
}
|
}
|
||||||
in validate queryString `shouldBe` [expected]
|
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" $
|
context "uniqueInputFieldNamesRule" $
|
||||||
it "rejects duplicate fields in input objects" $
|
it "rejects duplicate fields in input objects" $
|
||||||
let queryString = [gql|
|
let queryString = [gql|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user