graphql_query/validate/rules/
mod.rs

1use crate::visit::ComposedVisitor;
2
3mod known_fragment_names;
4mod lone_anonymous_operation;
5mod no_fragment_cycles;
6mod no_undefined_variables;
7mod no_unused_fragments;
8mod unique_argument_names;
9mod unique_fragment_names;
10mod unique_operation_names;
11mod unique_variable_names;
12
13pub use super::context::ValidationContext;
14pub use known_fragment_names::*;
15pub use lone_anonymous_operation::*;
16pub use no_fragment_cycles::*;
17pub use no_undefined_variables::*;
18pub use no_unused_fragments::*;
19pub use unique_argument_names::*;
20pub use unique_fragment_names::*;
21pub use unique_operation_names::*;
22pub use unique_variable_names::*;
23
24/// All of GraphQL's validation rules which don't require a schema to be run combined into one
25/// `ValidationRule`.
26///
27/// See: [`ComposedVisitor`]
28pub type DefaultRules<'a> = ComposedVisitor<
29    'a,
30    ValidationContext<'a>,
31    ComposedVisitor<
32        'a,
33        ValidationContext<'a>,
34        ComposedVisitor<'a, ValidationContext<'a>, LoneAnonymousOperation, UniqueVariableNames<'a>>,
35        ComposedVisitor<
36            'a,
37            ValidationContext<'a>,
38            UniqueFragmentNames<'a>,
39            UniqueOperationNames<'a>,
40        >,
41    >,
42    ComposedVisitor<
43        'a,
44        ValidationContext<'a>,
45        ComposedVisitor<'a, ValidationContext<'a>, NoUnusedFragments<'a>, UniqueArgumentNames<'a>>,
46        ComposedVisitor<
47            'a,
48            ValidationContext<'a>,
49            KnownFragmentNames<'a>,
50            ComposedVisitor<
51                'a,
52                ValidationContext<'a>,
53                NoFragmentCycles<'a>,
54                NoUndefinedVariables<'a>,
55            >,
56        >,
57    >,
58>;
59
60#[cfg(test)]
61mod tests {
62    use super::super::*;
63    use super::*;
64    use crate::ast::*;
65
66    #[test]
67    fn passes() {
68        let ctx = ASTContext::new();
69        let document = Document::parse(
70            &ctx,
71            "query A { __typename } query B { ...Test } fragment Test on Query { __typename }",
72        )
73        .unwrap();
74        DefaultRules::validate(&ctx, document).unwrap();
75    }
76
77    #[test]
78    fn fails() {
79        let ctx = ASTContext::new();
80
81        let document = Document::parse(
82            &ctx,
83            "query A { __typename } query B { __typename } fragment Test on Query { __typename }",
84        )
85        .unwrap();
86        DefaultRules::validate(&ctx, document).unwrap_err();
87
88        let document = Document::parse(
89            &ctx,
90            "query { __typename } query { ...Test } fragment Test on Query { __typename }",
91        )
92        .unwrap();
93        DefaultRules::validate(&ctx, document).unwrap_err();
94    }
95}