async_graphql/validation/rules/
known_fragment_names.rs

1use crate::{
2    parser::types::FragmentSpread,
3    validation::visitor::{Visitor, VisitorContext},
4    Positioned,
5};
6
7#[derive(Default)]
8pub struct KnownFragmentNames;
9
10impl<'a> Visitor<'a> for KnownFragmentNames {
11    fn enter_fragment_spread(
12        &mut self,
13        ctx: &mut VisitorContext<'a>,
14        fragment_spread: &'a Positioned<FragmentSpread>,
15    ) {
16        if !ctx.is_known_fragment(&fragment_spread.node.fragment_name.node) {
17            ctx.report_error(
18                vec![fragment_spread.pos],
19                format!(
20                    r#"Unknown fragment: "{}""#,
21                    fragment_spread.node.fragment_name.node
22                ),
23            );
24        }
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    pub fn factory() -> KnownFragmentNames {
33        KnownFragmentNames
34    }
35
36    #[test]
37    fn known() {
38        expect_passes_rule!(
39            factory,
40            r#"
41          {
42            human(id: 4) {
43              ...HumanFields1
44              ... on Human {
45                ...HumanFields2
46              }
47              ... {
48                name
49              }
50            }
51          }
52          fragment HumanFields1 on Human {
53            name
54            ...HumanFields3
55          }
56          fragment HumanFields2 on Human {
57            name
58          }
59          fragment HumanFields3 on Human {
60            name
61          }
62        "#,
63        );
64    }
65
66    #[test]
67    fn unknown() {
68        expect_fails_rule!(
69            factory,
70            r#"
71          {
72            human(id: 4) {
73              ...UnknownFragment1
74              ... on Human {
75                ...UnknownFragment2
76              }
77            }
78          }
79          fragment HumanFields on Human {
80            name
81            ...UnknownFragment3
82          }
83        "#,
84        );
85    }
86}