use toasty_core::stmt::{
Expr, Limit, LimitCursor, LimitOffset, OrderBy, OrderByExpr, Query, Statement, Value, Values,
};
fn values_query(items: Vec<i64>) -> Query {
Query::values(Values::new(
items
.into_iter()
.map(|n| Expr::from(Value::I64(n)))
.collect(),
))
}
#[test]
fn query_with_order_by_is_error() {
let mut query = values_query(vec![1, 2, 3]);
query.order_by = Some(OrderBy::from(OrderByExpr {
expr: Expr::from(0i64),
order: None,
}));
assert!(Statement::Query(query).eval_const().is_err());
}
#[test]
fn limit_returns_first_n_items() {
let mut query = values_query(vec![1, 2, 3, 4, 5]);
query.limit = Some(Limit::Offset(LimitOffset {
limit: Expr::from(3i64),
offset: None,
}));
let result = Statement::Query(query).eval_const().unwrap();
assert_eq!(
result,
Value::List(vec![Value::I64(1), Value::I64(2), Value::I64(3)])
);
}
#[test]
fn limit_larger_than_list_returns_all() {
let mut query = values_query(vec![1, 2]);
query.limit = Some(Limit::Offset(LimitOffset {
limit: Expr::from(10i64),
offset: None,
}));
let result = Statement::Query(query).eval_const().unwrap();
assert_eq!(result, Value::List(vec![Value::I64(1), Value::I64(2)]));
}
#[test]
fn limit_zero_returns_empty_list() {
let mut query = values_query(vec![1, 2, 3]);
query.limit = Some(Limit::Offset(LimitOffset {
limit: Expr::from(0i64),
offset: None,
}));
let result = Statement::Query(query).eval_const().unwrap();
assert_eq!(result, Value::List(vec![]));
}
#[test]
fn limit_with_count_offset_skips_then_takes() {
let mut query = values_query(vec![1, 2, 3, 4, 5]);
query.limit = Some(Limit::Offset(LimitOffset {
limit: Expr::from(2i64),
offset: Some(Expr::from(2i64)),
}));
let result = Statement::Query(query).eval_const().unwrap();
assert_eq!(result, Value::List(vec![Value::I64(3), Value::I64(4)]));
}
#[test]
fn limit_with_count_offset_larger_than_list_returns_empty() {
let mut query = values_query(vec![1, 2]);
query.limit = Some(Limit::Offset(LimitOffset {
limit: Expr::from(5i64),
offset: Some(Expr::from(10i64)),
}));
let result = Statement::Query(query).eval_const().unwrap();
assert_eq!(result, Value::List(vec![]));
}
#[test]
fn limit_with_cursor_is_error() {
let mut query = values_query(vec![1, 2, 3]);
query.limit = Some(Limit::Cursor(LimitCursor {
page_size: Expr::from(2i64),
after: Some(Expr::from(1i64)),
}));
assert!(Statement::Query(query).eval_const().is_err());
}
#[test]
fn single_with_one_row_returns_value() {
let mut query = values_query(vec![42]);
query.single = true;
let result = Statement::Query(query).eval_const().unwrap();
assert_eq!(result, Value::I64(42));
}
#[test]
fn single_with_zero_rows_is_error() {
let mut query = values_query(vec![]);
query.single = true;
assert!(Statement::Query(query).eval_const().is_err());
}
#[test]
fn single_with_two_rows_is_error() {
let mut query = values_query(vec![1, 2]);
query.single = true;
assert!(Statement::Query(query).eval_const().is_err());
}
#[test]
fn plain_values_query_evals_ok() {
let query = Query::values(Values::new(vec![
Expr::from(Value::I64(1)),
Expr::from(Value::I64(2)),
]));
let result = Statement::Query(query).eval_const().unwrap();
assert_eq!(result, Value::List(vec![Value::I64(1), Value::I64(2)]));
}