use proptest::prelude::*;
use crate::tests::property_tests::generators::documents::arb_executable_document;
use crate::tests::property_tests::generators::documents::arb_schema_document;
use crate::tests::property_tests::generators::mutations::arb_reserved_fragment_name;
use crate::tests::property_tests::proptest_config;
use crate::GraphQLParser;
proptest! {
#![proptest_config(proptest_config())]
#[test]
fn truncated_schema_documents_produce_errors(
source in arb_schema_document(3)
) {
let brace_pos = source.find('{');
prop_assume!(brace_pos.is_some());
let cut_point = brace_pos.unwrap() + 2;
prop_assume!(cut_point < source.len());
let mut boundary = cut_point;
while boundary < source.len() && !source.is_char_boundary(boundary) {
boundary += 1;
}
prop_assume!(boundary < source.len());
let truncated = &source[..boundary];
let result = GraphQLParser::new(truncated).parse_schema_document();
prop_assert!(
result.has_errors(),
"Truncated schema document should produce errors.\n\
Original:\n{}\n\nTruncated:\n{}",
source,
truncated,
);
}
#[test]
fn truncated_executable_documents_produce_errors(
source in arb_executable_document(3)
) {
let brace_pos = source.find('{');
prop_assume!(brace_pos.is_some());
let cut_point = brace_pos.unwrap() + 2;
prop_assume!(cut_point < source.len());
let mut boundary = cut_point;
while boundary < source.len() && !source.is_char_boundary(boundary) {
boundary += 1;
}
prop_assume!(boundary < source.len());
let truncated = &source[..boundary];
let result = GraphQLParser::new(truncated).parse_executable_document();
prop_assert!(
result.has_errors(),
"Truncated executable document should produce errors.\n\
Original:\n{}\n\nTruncated:\n{}",
source,
truncated,
);
}
#[test]
fn brace_to_bracket_swap_produces_errors(
source in arb_schema_document(3)
) {
prop_assume!(source.contains('{'));
let mutated = source.replace('{', "[");
let result = GraphQLParser::new(&mutated).parse_schema_document();
prop_assert!(
result.has_errors(),
"Brace-to-bracket swap should produce errors.\n\
Original:\n{}\n\nMutated:\n{}",
source,
mutated,
);
}
#[test]
fn reserved_fragment_names_produce_errors(
source in arb_reserved_fragment_name()
) {
let result = GraphQLParser::new(&source).parse_executable_document();
prop_assert!(
result.has_errors(),
"Fragment with reserved name 'on' should produce errors.\n\
Source:\n{}",
source,
);
}
}