use crate::GraphQLParseErrorKind;
use crate::tests::ast_utils::extract_first_object_type;
use crate::tests::utils::parse_schema;
#[test]
fn directive_simple() {
let obj = extract_first_object_type("type Query { field: String @deprecated }");
let field = &obj.fields[0];
assert_eq!(field.directives.len(), 1);
assert_eq!(field.directives[0].name.value, "deprecated");
assert!(field.directives[0].arguments.is_empty());
}
#[test]
fn directive_with_args() {
let obj = extract_first_object_type(
r#"type Query { field: String @deprecated(reason: "old") }"#,
);
let field = &obj.fields[0];
assert_eq!(field.directives.len(), 1);
assert_eq!(field.directives[0].name.value, "deprecated");
assert_eq!(field.directives[0].arguments.len(), 1);
assert_eq!(field.directives[0].arguments[0].name.value, "reason");
}
#[test]
fn directive_multiple() {
let obj = extract_first_object_type("type Query { field: String @a @b @c }");
let field = &obj.fields[0];
assert_eq!(field.directives.len(), 3);
assert_eq!(field.directives[0].name.value, "a");
assert_eq!(field.directives[1].name.value, "b");
assert_eq!(field.directives[2].name.value, "c");
}
#[test]
fn directive_arg_list() {
let obj = extract_first_object_type("type Query { field: String @dir(a: 1, b: 2) }");
let field = &obj.fields[0];
assert_eq!(field.directives.len(), 1);
assert_eq!(field.directives[0].name.value, "dir");
assert_eq!(field.directives[0].arguments.len(), 2);
assert_eq!(field.directives[0].arguments[0].name.value, "a");
assert_eq!(field.directives[0].arguments[1].name.value, "b");
}
#[test]
fn directive_empty_args_error() {
let result = parse_schema("type Query { field: String @dir() }");
assert!(result.has_errors());
assert_eq!(result.errors().len(), 1);
assert!(
matches!(
result.errors()[0].kind(),
GraphQLParseErrorKind::InvalidEmptyConstruct { .. },
),
"Expected InvalidEmptyConstruct error, got: {:?}",
result.errors()[0].kind(),
);
}
#[test]
fn directive_name_keyword() {
let obj_type = extract_first_object_type("type Query { field: String @type }");
let field_type = &obj_type.fields[0];
assert_eq!(field_type.directives.len(), 1);
assert_eq!(field_type.directives[0].name.value, "type");
let obj_query = extract_first_object_type("type Query { field: String @query }");
let field_query = &obj_query.fields[0];
assert_eq!(field_query.directives.len(), 1);
assert_eq!(field_query.directives[0].name.value, "query");
}