use crate::ast;
use crate::GraphQLParseErrorKind;
use crate::tests::utils::parse_executable;
use crate::tests::utils::parse_schema;
#[test]
fn parse_schema_document_only_types() {
let (doc, _) = parse_schema("type Query { field: String }")
.into_valid()
.unwrap();
assert_eq!(doc.definitions.len(), 1);
assert!(matches!(
&doc.definitions[0],
ast::Definition::TypeDefinition(_),
));
}
#[test]
fn parse_schema_rejects_operation() {
let result = parse_schema("query GetUser { name }");
assert!(result.has_errors());
let has_wrong_doc_error = result.errors().iter().any(|e| {
matches!(
e.kind(),
GraphQLParseErrorKind::WrongDocumentKind {
found: ast::DefinitionKind::Operation,
document_kind: ast::DocumentKind::Schema,
},
)
});
assert!(
has_wrong_doc_error,
"Expected at least one WrongDocumentKind(Operation, Schema) error, \
got: {:?}",
result.errors().iter().map(|e| e.kind()).collect::<Vec<_>>(),
);
}
#[test]
fn parse_schema_rejects_fragment() {
let result = parse_schema("fragment UserFields on User { name }");
assert!(result.has_errors());
}
#[test]
fn parse_schema_rejects_mutation() {
let result = parse_schema("mutation CreateUser { createUser { id } }");
assert!(result.has_errors());
let has_wrong_doc_error = result.errors().iter().any(|e| {
matches!(
e.kind(),
GraphQLParseErrorKind::WrongDocumentKind {
found: ast::DefinitionKind::Operation,
document_kind: ast::DocumentKind::Schema,
},
)
});
assert!(
has_wrong_doc_error,
"Expected at least one WrongDocumentKind(Operation, Schema) error, \
got: {:?}",
result.errors().iter().map(|e| e.kind()).collect::<Vec<_>>(),
);
}
#[test]
fn parse_schema_rejects_subscription() {
let result = parse_schema("subscription OnMessage { newMessage { text } }");
assert!(result.has_errors());
let has_wrong_doc_error = result.errors().iter().any(|e| {
matches!(
e.kind(),
GraphQLParseErrorKind::WrongDocumentKind {
found: ast::DefinitionKind::Operation,
document_kind: ast::DocumentKind::Schema,
},
)
});
assert!(
has_wrong_doc_error,
"Expected at least one WrongDocumentKind(Operation, Schema) error, \
got: {:?}",
result.errors().iter().map(|e| e.kind()).collect::<Vec<_>>(),
);
}
#[test]
fn parse_schema_rejects_shorthand_query() {
let result = parse_schema("{ field }");
assert!(result.has_errors());
let has_wrong_doc_error = result.errors().iter().any(|e| {
matches!(
e.kind(),
GraphQLParseErrorKind::WrongDocumentKind {
found: ast::DefinitionKind::Operation,
document_kind: ast::DocumentKind::Schema,
},
)
});
assert!(
has_wrong_doc_error,
"Expected at least one WrongDocumentKind(Operation, Schema) error, \
got: {:?}",
result.errors().iter().map(|e| e.kind()).collect::<Vec<_>>(),
);
}
#[test]
fn parse_executable_document_only_ops() {
let (query_doc, _) = parse_executable("query GetUser { name }")
.into_valid()
.unwrap();
assert_eq!(query_doc.definitions.len(), 1);
assert!(matches!(
&query_doc.definitions[0],
ast::Definition::OperationDefinition(_),
));
let (frag_doc, _) = parse_executable("fragment UserFields on User { name }")
.into_valid()
.unwrap();
assert_eq!(frag_doc.definitions.len(), 1);
assert!(matches!(
&frag_doc.definitions[0],
ast::Definition::FragmentDefinition(_),
));
}
#[test]
fn parse_executable_rejects_type() {
let result = parse_executable("type Query { field: String }");
assert!(result.has_errors());
let has_wrong_doc_error = result.errors().iter().any(|e| {
matches!(
e.kind(),
GraphQLParseErrorKind::WrongDocumentKind {
found: ast::DefinitionKind::TypeDefinition,
document_kind: ast::DocumentKind::Executable,
},
)
});
assert!(
has_wrong_doc_error,
"Expected at least one WrongDocumentKind(TypeDefinition, Executable) \
error, got: {:?}",
result.errors().iter().map(|e| e.kind()).collect::<Vec<_>>(),
);
}
#[test]
fn parse_executable_rejects_directive_def() {
let result = parse_executable("directive @deprecated on FIELD_DEFINITION");
assert!(result.has_errors());
let has_wrong_doc_error = result.errors().iter().any(|e| {
matches!(
e.kind(),
GraphQLParseErrorKind::WrongDocumentKind {
found: ast::DefinitionKind::DirectiveDefinition,
document_kind: ast::DocumentKind::Executable,
},
)
});
assert!(
has_wrong_doc_error,
"Expected at least one WrongDocumentKind(DirectiveDefinition, \
Executable) error, got: {:?}",
result.errors().iter().map(|e| e.kind()).collect::<Vec<_>>(),
);
}
#[test]
fn parse_empty_document() {
let (schema_doc, _) = parse_schema("").into_valid().unwrap();
assert_eq!(schema_doc.definitions.len(), 0);
let (exec_doc, _) = parse_executable("").into_valid().unwrap();
assert_eq!(exec_doc.definitions.len(), 0);
}
#[test]
fn parse_whitespace_only() {
let (schema_doc, _) = parse_schema(" \n\t ").into_valid().unwrap();
assert_eq!(schema_doc.definitions.len(), 0);
let (exec_doc, _) = parse_executable(" \n\t ").into_valid().unwrap();
assert_eq!(exec_doc.definitions.len(), 0);
}
#[test]
fn parse_comments_only() {
let (schema_doc, _) =
parse_schema("# This is a comment\n# Another comment")
.into_valid()
.unwrap();
assert_eq!(schema_doc.definitions.len(), 0);
let (exec_doc, _) =
parse_executable("# Just a comment\n# And another one")
.into_valid()
.unwrap();
assert_eq!(exec_doc.definitions.len(), 0);
}