apollo-compiler 1.32.0

A compiler for the GraphQL query language.
Documentation
use apollo_compiler::introspection;
use apollo_compiler::ExecutableDocument;
use apollo_compiler::Schema;
use expect_test::expect;

#[test]
fn test_3_sibling_fields_list() {
    let doc = r#"
      {
        __type(name: "Query") {
          trueFields: fields(includeDeprecated: true) {
            name
          }
          falseFields: fields(includeDeprecated: false) {
            name
          }
          omittedFields: fields {
            name
          }
        }
      }
    "#;
    let expected = expect!["Ok"];
    assert_split(doc, expected);
}

#[test]
fn test_2_nested_fields_lists() {
    let doc = r#"
      {
        __type(name: "Query") {
          fields {
            type {
              fields {
                name
              }
            }
          }
        }
      }
    "#;
    let expected = expect!["Ok"];
    assert_split(doc, expected);
}

#[test]
fn test_3_nested_fields_lists() {
    let doc = r#"
      {
        __type(name: "Query") {
          fields {
            type {
              fields {
                type {
                  fields {
                    name
                  }
                }
              }
            }
          }
        }
      }
    "#;
    let expected = expect![[r#"
        GraphQLError {
            message: "Maximum introspection depth exceeded",
            locations: [
                8:19,
            ],
            path: [],
            extensions: {},
        }
    "#]];
    assert_split(doc, expected);
}

#[test]
fn test_2_nested_input_fields_lists() {
    let doc = r#"
      {
        __type(name: "Query") {
          inputFields {
            type {
              inputFields {
                name
              }
            }
          }
        }
      }
    "#;
    let expected = expect!["Ok"];
    assert_split(doc, expected);
}

#[test]
fn test_3_nested_input_fields_lists() {
    let doc = r#"
      {
        __type(name: "Query") {
          inputFields {
            type {
              inputFields {
                type {
                  inputFields {
                    name
                  }
                }
              }
            }
          }
        }
      }
    "#;
    let expected = expect![[r#"
        GraphQLError {
            message: "Maximum introspection depth exceeded",
            locations: [
                8:19,
            ],
            path: [],
            extensions: {},
        }
    "#]];
    assert_split(doc, expected);
}

#[test]
fn test_2_nested_interfaces_lists() {
    let doc = r#"
      {
        __schema {
          types {
            interfaces {
              interfaces {
                name
              }
            }
          }
        }
      }
    "#;
    let expected = expect!["Ok"];
    assert_split(doc, expected);
}

#[test]
fn test_3_nested_interfaces_lists() {
    let doc = r#"
      {
        __schema {
          types {
            interfaces {
              interfaces {
                interfaces {
                  name
                }
              }
            }
          }
        }
      }
    "#;
    let expected = expect![[r#"
        GraphQLError {
            message: "Maximum introspection depth exceeded",
            locations: [
                7:17,
            ],
            path: [],
            extensions: {},
        }
    "#]];
    assert_split(doc, expected);
}

#[test]
fn test_2_nested_possible_types_lists() {
    let doc = r#"
      {
        __schema {
          types {
            possibleTypes {
              possibleTypes {
                name
              }
            }
          }
        }
      }
    "#;
    let expected = expect!["Ok"];
    assert_split(doc, expected);
}

#[test]
fn test_3_nested_possible_types_lists() {
    let doc = r#"
      {
        __schema {
          types {
            possibleTypes {
              possibleTypes {
                possibleTypes {
                  name
                }
              }
            }
          }
        }
      }
    "#;
    let expected = expect![[r#"
        GraphQLError {
            message: "Maximum introspection depth exceeded",
            locations: [
                7:17,
            ],
            path: [],
            extensions: {},
        }
    "#]];
    assert_split(doc, expected);
}

#[test]
fn test_2_nested_possible_types_lists_with_inline_fragments() {
    let doc = r#"
      {
        ... on Query {
          __schema {
            types {
              ... on __Type {
                possibleTypes {
                  ... on __Type {
                    possibleTypes {
                      ... on __Type {
                        name
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    "#;
    let expected = expect!["Ok"];
    assert_split(doc, expected);
}

#[test]
fn test_3_nested_possible_types_lists_with_inline_fragments() {
    let doc = r#"
      {
        ... on Query {
          __schema {
            types {
              ... on __Type {
                possibleTypes {
                  ... on __Type {
                    possibleTypes {
                      ... on __Type {
                        possibleTypes {
                          ... on __Type {
                            name
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    "#;
    let expected = expect![[r#"
        GraphQLError {
            message: "Maximum introspection depth exceeded",
            locations: [
                11:25,
            ],
            path: [],
            extensions: {},
        }
    "#]];
    assert_split(doc, expected);
}

#[test]
fn test_2_nested_possible_types_lists_with_named_fragments() {
    let doc = r#"
      {
        __schema {
          types {
            ...One
          }
        }
      }
      fragment One on __Type {
        possibleTypes {
          ...Two
        }
      }
      fragment Two on __Type {
        possibleTypes {
          ...Three
        }
      }
      fragment Three on __Type {
        name
      }
    "#;
    let expected = expect!["Ok"];
    assert_split(doc, expected);
}

#[test]
fn test_3_nested_possible_types_lists_with_named_fragments() {
    let doc = r#"
      {
        __schema {
          types {
            ...One
          }
        }
      }
      fragment One on __Type {
        possibleTypes {
          ...Two
        }
      }
      fragment Two on __Type {
        possibleTypes {
          ...Three
        }
      }
      fragment Three on __Type {
        possibleTypes {
          ...Four
        }
      }
      fragment Four on __Type {
        name
      }
    "#;
    let expected = expect![[r#"
        GraphQLError {
            message: "Maximum introspection depth exceeded",
            locations: [
                20:9,
            ],
            path: [],
            extensions: {},
        }
    "#]];
    assert_split(doc, expected);
}

#[track_caller]
fn assert_split(doc: &str, expected: expect_test::Expect) {
    let schema = "type Query { f: Int }";
    let schema = Schema::parse_and_validate(schema, "schema.graphql").unwrap();
    let doc = ExecutableDocument::parse_and_validate(&schema, doc, "doc.graphql").unwrap();
    let operation = doc.operations.get(None).unwrap();

    match introspection::check_max_depth(&doc, operation) {
        Ok(_) => expected.assert_eq("Ok"),
        Err(err) => expected.assert_debug_eq(&err.to_graphql_error(&doc.sources)),
    }
}