use crate::tests_queries_support::{error_for, with_query};
#[test]
fn rejects_a_placeholder_past_the_declared_parameter_count() {
let message = error_for(&with_query(
r#"query totals(userId: String, cutoff: DateTime): Totals
@@sql("SELECT 1 AS total WHERE a = $1 AND b = $3")
@allow(auth() != null)"#,
));
assert!(message.contains("references parameter `$3`"), "{message}");
assert!(
message.contains("only 2 parameter(s) are declared (`userId`, `cutoff`)"),
"{message}"
);
}
#[test]
fn rejects_a_zero_placeholder() {
let message = error_for(&with_query(
r#"query totals(userId: String): Totals
@@sql("SELECT 1 AS total WHERE a = $0")
@allow(auth() != null)"#,
));
assert!(message.contains("references parameter `$0`"), "{message}");
}
#[test]
fn rejects_a_declared_parameter_that_the_body_never_references() {
let message = error_for(&with_query(
r#"query totals(userId: String, cutoff: DateTime): Totals
@@sql("SELECT 1 AS total WHERE a = $1")
@allow(auth() != null)"#,
));
assert!(
message.contains("declares parameter `cutoff` (`$2`) but it is never referenced"),
"{message}"
);
}
#[test]
fn rejects_an_unknown_result_type() {
let message = error_for(&with_query(
r#"query totals(userId: String): Nope
@@sql("SELECT 1 AS total WHERE a = $1")
@allow(auth() != null)"#,
));
assert!(message.contains("unknown result type"), "{message}");
assert!(message.contains("no `type Nope` is declared"), "{message}");
}
#[test]
fn rejects_a_model_as_the_result_type() {
let message = error_for(
r#"
model Event {
id Int @id
}
query totals(userId: String): Event
@@sql("SELECT 1 AS id WHERE a = $1")
@allow(auth() != null)
"#,
);
assert!(message.contains("is not a `type` declaration"), "{message}");
}
#[test]
fn rejects_an_unbindable_parameter_type() {
let message = error_for(&with_query(
r#"query totals(page: PageInput): Totals
@@sql("SELECT 1 AS total WHERE a = $1")
@allow(auth() != null)"#,
));
assert!(
message.contains("cannot be bound as a SQL parameter"),
"{message}"
);
}
#[test]
fn rejects_a_list_parameter() {
let message = error_for(&with_query(
r#"query totals(ids: String[]): Totals
@@sql("SELECT 1 AS total WHERE a = ANY($1)")
@allow(auth() != null)"#,
));
assert!(message.contains("must be a required scalar"), "{message}");
}
#[test]
fn rejects_a_header_with_no_result_type() {
let message = error_for(&with_query(
r#"query totals(userId: String)
@@sql("SELECT 1 AS total WHERE a = $1")"#,
));
assert!(message.contains("must include a result type"), "{message}");
}
#[test]
fn rejects_an_out_of_range_placeholder_hidden_after_an_escape_string() {
let declaration = concat!(
"query totals(userId: String): Totals\n",
" @@sql(\"\"\"\n",
" SELECT 1 AS total FROM t WHERE a = $1 AND note = E'\\'' AND x = $5\n",
" \"\"\")\n",
" @allow(auth() != null)",
);
let message = error_for(&with_query(declaration));
assert!(message.contains("references parameter `$5`"), "{message}");
assert!(
message.contains("only 1 parameter(s) are declared"),
"{message}"
);
}