use scythe_codegen::{generate_with_backend, get_backend};
use scythe_core::analyzer::analyze;
use scythe_core::catalog::Catalog;
use scythe_core::dialect::SqlDialect;
use scythe_core::parser::parse_query_with_dialect;
const SCHEMA: [&str; 2] = [
"CREATE TABLE owners (id SERIAL PRIMARY KEY, name TEXT NOT NULL);",
"CREATE TABLE parts (id SERIAL PRIMARY KEY, owner_id INT NOT NULL REFERENCES owners (id), \"my col\" TEXT);",
];
const QUERY: &str = "-- @name GetOwnersWithParts\n-- @returns :grouped\n-- @group_by owners.id\n\
SELECT o.id, o.name, p.id AS part_id, p.\"my col\" \
FROM owners o JOIN parts p ON p.owner_id = o.id;";
fn generate_grouped_query_fn() -> String {
let backend = get_backend("rust-sqlx", "postgresql").expect("backend must support postgresql");
let catalog = Catalog::from_ddl_with_dialect(&SCHEMA, &SqlDialect::PostgreSQL).expect("schema must parse");
let parsed = parse_query_with_dialect(QUERY, &SqlDialect::PostgreSQL).expect("query must parse");
let analyzed = analyze(&catalog, &parsed).expect("query must analyze");
let code = generate_with_backend(&analyzed, &*backend).expect("codegen must succeed");
code.query_fn.expect("expected a grouped query function")
}
#[test]
fn rust_sqlx_grouped_query_aliases_a_mangled_child_column() {
let query_fn = generate_grouped_query_fn();
assert!(
query_fn.contains("p.\\\"my col\\\" AS \\\"my_col\\\""),
"expected the SQL to alias the non-identifier column to the field sqlx's \
query! macro must report -- `p.\"my col\" AS \"my_col\"` -- but got:\n{query_fn}"
);
}
#[test]
fn rust_sqlx_grouped_query_reads_the_aliased_field_by_its_sanitized_name() {
let query_fn = generate_grouped_query_fn();
assert!(
query_fn.contains("my_col: row.my_col,"),
"expected the child struct literal to read `row.my_col`:\n{query_fn}"
);
}
#[test]
fn rust_sqlx_grouped_query_does_not_alias_columns_that_need_no_rename() {
let query_fn = generate_grouped_query_fn();
assert!(
!query_fn.contains("part_id AS"),
"part_id already matches its field name and must not be re-aliased:\n{query_fn}"
);
assert!(
!query_fn.contains("o.id AS"),
"o.id already matches its field name and must not be re-aliased:\n{query_fn}"
);
}