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}