use crate::tests_queries_support::{error_for, with_query};
#[test]
fn rejects_a_query_with_no_sql_body() {
let message = error_for(&with_query(
r#"query totals(userId: String): Totals
@allow(auth() != null)"#,
));
assert!(message.contains("has no SQL body"), "{message}");
}
#[test]
fn rejects_the_per_backend_sql_split_a_view_allows() {
let message = error_for(&with_query(
r#"query totals(userId: String): Totals
@@embedded_sql("SELECT 1 AS total WHERE a = $1")
@allow(auth() != null)"#,
));
assert!(message.contains("Postgres-only"), "{message}");
assert!(message.contains("@@embedded_sql"), "{message}");
}
#[test]
fn rejects_an_unquoted_sql_argument() {
let message = error_for(&with_query(
r#"query totals(userId: String): Totals
@@sql(SELECT 1 AS total WHERE a = $1)
@allow(auth() != null)"#,
));
assert!(
message.contains("argument is not a quoted string"),
"{message}"
);
}
#[test]
fn rejects_a_bare_sql_attribute_with_no_parentheses() {
let message = error_for(&with_query(
r#"query totals(userId: String): Totals
@@sql
@allow(auth() != null)"#,
));
assert!(
message.contains("argument is not a quoted string"),
"{message}"
);
}
#[test]
fn rejects_a_second_attribute_sharing_the_sql_line() {
let message = error_for(&with_query(
r#"query totals(userId: String): Totals
@@sql("SELECT 1 AS total WHERE a = $1") @allow(auth() != null)"#,
));
assert!(
message.contains("argument is not a quoted string"),
"{message}"
);
assert!(message.contains("on its own line"), "{message}");
}
#[test]
fn rejects_an_unquoted_sql_argument_on_a_view_too() {
let message = error_for(
r#"
model Customer {
id Int @id
email String
}
view CustomerSummary from Customer {
id Int @id
email String
@@server_sql(SELECT id, email FROM customers)
@@allow("read", auth() != null)
}
"#,
);
assert!(
message.contains("argument is not a quoted string"),
"{message}"
);
}
#[test]
fn unescapes_quotes_in_a_single_line_sql_body() {
let declaration = concat!(
"query totals(userId: String): Totals\n",
" @@sql(\"SELECT 1 AS \\\"total\\\" WHERE a = $1\")\n",
" @allow(auth() != null)",
);
let schema = crate::parse_schema(&with_query(declaration))
.expect("a single-line body with escaped quotes should parse");
assert_eq!(
schema.queries[0].sql().as_deref(),
Some("SELECT 1 AS \"total\" WHERE a = $1"),
);
}