use serde_json::{
json,
Value,
};
use sqlxo::{
and,
blocks::{
BuildableFilter,
BuildableSort,
SelectType,
},
order_by,
web::WebReadFilter,
Buildable,
QueryBuilder,
ReadQueryPlan,
};
use crate::helpers::{
Item,
ItemDto,
ItemQuery,
ItemSort,
NormalizeString,
};
#[test]
fn dto_filter_combined_with_inline_filter() {
let json: Value = json!({
"filter": {
"differentName": { "like": "%Sternlampe%" }
},
"sort": null
});
let f: WebReadFilter<ItemDto> =
serde_json::from_value(json).expect("invalid ItemDtoFilter");
let plan: ReadQueryPlan<Item> =
QueryBuilder::<Item>::from_web_read::<ItemDto>(&f)
.r#where(and![ItemQuery::NameIsNull, ItemQuery::AmountEq(1000)])
.order_by(order_by![ItemSort::ByNameAsc])
.build();
let sql = plan.sql(SelectType::Star).trim_start().normalize();
assert!(
sql.contains(r#"LEFT JOIN material AS "material__""#),
"expected default auto-loaded join in SQL: {sql}"
);
assert!(
sql.contains(
r#"WHERE ("item"."name" LIKE $1 AND ("item"."name" IS NULL AND "item"."amount" = $2))"#
),
"expected combined filter in SQL: {sql}"
);
assert!(
sql.contains(r#"ORDER BY "item"."name" ASC"#),
"expected overridden sort in SQL: {sql}"
);
}