use sqlx::FromRow;
use crate::{
database::sqlite::fetch_sqlite_query,
operations::serialize::object_from_value,
queries::{serialize::QueryTree, Checkable},
};
use super::{
dummy::{dummy_sqlite_database, prepare_dummy_sqlite_database, Todo},
utils::read_serialized_query,
};
fn todos() -> Vec<Todo> {
vec![
Todo {
id: 1,
title: "First todo".to_string(),
content: "This is the first todo".to_string(),
},
Todo {
id: 2,
title: "Second todo".to_string(),
content: "This is the second todo".to_string(),
},
Todo {
id: 3,
title: "Third todo".to_string(),
content: "This is the third todo".to_string(),
},
]
}
fn filter_todos(query: &QueryTree) -> Vec<Todo> {
todos()
.into_iter()
.filter(|t| query.check(&object_from_value(serde_json::to_value(t).unwrap()).unwrap()))
.collect()
}
#[tokio::test]
async fn test_engine_single() {
let query = read_serialized_query("01_single.json");
let engine_todos = filter_todos(&query);
assert_eq!(engine_todos.len(), 3);
}
#[tokio::test]
async fn test_engine_many() {
let pool = dummy_sqlite_database().await;
prepare_dummy_sqlite_database(&pool).await;
let query = read_serialized_query("02_many.json");
let result = fetch_sqlite_query(&query, &pool).await;
let all_rows = result.unwrap_many();
let engine_todos = filter_todos(&query);
assert_eq!(engine_todos.len(), all_rows.len());
}
#[tokio::test]
async fn test_engine_single_with_condition() {
let pool = dummy_sqlite_database().await;
prepare_dummy_sqlite_database(&pool).await;
let query = read_serialized_query("03_single_with_condition.json");
let result = fetch_sqlite_query(&query, &pool).await;
let single_row = Todo::from_row(&result.unwrap_single()).unwrap();
let engine_todos = filter_todos(&query);
assert_eq!(engine_todos.len(), 1);
assert_eq!(engine_todos[0], single_row);
}
#[tokio::test]
async fn test_engine_many_with_condition() {
let pool = dummy_sqlite_database().await;
prepare_dummy_sqlite_database(&pool).await;
let query = read_serialized_query("04_many_with_condition.json");
let result = fetch_sqlite_query(&query, &pool).await;
let single_row = Todo::from_row(&result.unwrap_many()[0]).unwrap();
let engine_todos = filter_todos(&query);
assert_eq!(engine_todos.len(), 1);
assert_eq!(engine_todos[0], single_row);
}
#[tokio::test]
async fn test_engine_nested_or() {
let pool = dummy_sqlite_database().await;
prepare_dummy_sqlite_database(&pool).await;
let query = read_serialized_query("05_nested_or.json");
let result = fetch_sqlite_query(&query, &pool).await;
let all_rows = result.unwrap_many();
let engine_todos = filter_todos(&query);
assert_eq!(engine_todos.len(), all_rows.len());
}
#[tokio::test]
async fn test_engine_empty() {
let pool = dummy_sqlite_database().await;
prepare_dummy_sqlite_database(&pool).await;
let query = read_serialized_query("06_empty.json");
let result = fetch_sqlite_query(&query, &pool).await;
let single_row = result.unwrap_optional_single();
let engine_todos = filter_todos(&query);
assert!(single_row.is_none());
assert_eq!(engine_todos.len(), 0);
}
#[tokio::test]
async fn test_engine_in() {
let pool = dummy_sqlite_database().await;
prepare_dummy_sqlite_database(&pool).await;
let query = read_serialized_query("07_in.json");
let result = fetch_sqlite_query(&query, &pool).await;
let all_rows = result
.unwrap_many()
.into_iter()
.map(|r| Todo::from_row(&r).unwrap())
.collect::<Vec<Todo>>();
let engine_todos = filter_todos(&query);
assert_eq!(engine_todos, all_rows);
}