use crate::tests::ast_utils::extract_query;
use crate::tests::ast_utils::extract_shorthand_query;
use crate::tests::ast_utils::field_at;
use crate::tests::ast_utils::first_field;
use crate::tests::ast_utils::first_fragment_spread;
use crate::tests::ast_utils::first_inline_fragment;
use crate::tests::utils::parse_executable;
#[test]
fn selection_set_simple() {
let op = extract_shorthand_query("{ name }");
assert_eq!(op.selection_set.selections.len(), 1);
let field = first_field(&op.selection_set);
assert_eq!(field.name.value, "name");
}
#[test]
fn selection_set_multiple_fields() {
let op = extract_shorthand_query("{ name age email }");
assert_eq!(op.selection_set.selections.len(), 3);
assert_eq!(field_at(&op.selection_set, 0).name.value, "name");
assert_eq!(field_at(&op.selection_set, 1).name.value, "age");
assert_eq!(field_at(&op.selection_set, 2).name.value, "email");
}
#[test]
fn selection_set_nested() {
let op = extract_shorthand_query("{ user { name } }");
assert_eq!(op.selection_set.selections.len(), 1);
let user_field = first_field(&op.selection_set);
assert_eq!(user_field.name.value, "user");
let nested_ss = user_field.selection_set.as_ref().unwrap();
assert_eq!(nested_ss.selections.len(), 1);
let nested_field = first_field(nested_ss);
assert_eq!(nested_field.name.value, "name");
}
#[test]
fn selection_set_empty_error() {
let result = parse_executable("{ }");
assert!(result.has_errors());
}
#[test]
fn selection_set_unclosed_error() {
let result = parse_executable("{ name");
assert!(result.has_errors());
}
#[test]
fn field_simple() {
let query = extract_query("query { name }");
let field = first_field(&query.selection_set);
assert_eq!(field.name.value, "name");
assert!(field.alias.is_none());
assert!(field.arguments.is_empty());
}
#[test]
fn field_with_alias() {
let query = extract_query("query { userName: name }");
let field = first_field(&query.selection_set);
assert_eq!(field.alias.as_ref().unwrap().value, "userName");
assert_eq!(field.name.value, "name");
}
#[test]
fn field_with_args() {
let query = extract_query("query { user(id: 1) }");
let field = first_field(&query.selection_set);
assert_eq!(field.name.value, "user");
assert!(!field.arguments.is_empty());
assert_eq!(field.arguments.len(), 1);
assert_eq!(field.arguments[0].name.value, "id");
}
#[test]
fn field_with_directives() {
let query = extract_query("query { name @include(if: true) }");
let field = first_field(&query.selection_set);
assert_eq!(field.name.value, "name");
assert!(!field.directives.is_empty());
assert_eq!(field.directives.len(), 1);
assert_eq!(field.directives[0].name.value, "include");
}
#[test]
fn field_with_nested_selection() {
let query = extract_query("query { user { name } }");
let field = first_field(&query.selection_set);
assert_eq!(field.name.value, "user");
let nested_ss = field.selection_set.as_ref().unwrap();
assert!(!nested_ss.selections.is_empty());
let nested_field = first_field(nested_ss);
assert_eq!(nested_field.name.value, "name");
}
#[test]
fn field_empty_args_error() {
let result = parse_executable("{ field() }");
assert!(result.has_errors());
}
#[test]
fn fragment_spread() {
let query = extract_query("query { ...UserFields }");
let spread = first_fragment_spread(&query.selection_set);
assert_eq!(spread.name.value, "UserFields");
}
#[test]
fn fragment_spread_with_directives() {
let query = extract_query("query { ...UserFields @include(if: true) }");
let spread = first_fragment_spread(&query.selection_set);
assert_eq!(spread.name.value, "UserFields");
assert!(!spread.directives.is_empty());
assert_eq!(spread.directives.len(), 1);
assert_eq!(spread.directives[0].name.value, "include");
}
#[test]
fn inline_fragment_typed() {
let query = extract_query("query { ... on User { name } }");
let inline = first_inline_fragment(&query.selection_set);
let type_cond = inline.type_condition.as_ref().unwrap();
assert_eq!(type_cond.named_type.value, "User");
assert!(!inline.selection_set.selections.is_empty());
let field = first_field(&inline.selection_set);
assert_eq!(field.name.value, "name");
}
#[test]
fn inline_fragment_untyped() {
let query = extract_query("query { ... { name } }");
let inline = first_inline_fragment(&query.selection_set);
assert!(inline.type_condition.is_none());
assert!(!inline.selection_set.selections.is_empty());
let field = first_field(&inline.selection_set);
assert_eq!(field.name.value, "name");
}
#[test]
fn inline_fragment_with_directives() {
let query = extract_query("query { ... on User @skip(if: $flag) { name } }");
let inline = first_inline_fragment(&query.selection_set);
let type_cond = inline.type_condition.as_ref().unwrap();
assert_eq!(type_cond.named_type.value, "User");
assert!(!inline.directives.is_empty());
assert_eq!(inline.directives.len(), 1);
assert_eq!(inline.directives[0].name.value, "skip");
assert!(!inline.selection_set.selections.is_empty());
let field = first_field(&inline.selection_set);
assert_eq!(field.name.value, "name");
}