use std::collections::HashMap;
use std::path::Path;
use rand::rngs::StdRng;
use rand::{Rng, SeedableRng};
use njord::condition::Condition;
use njord::sqlite::{self};
use njord::table::Table;
use njord_derive::Table;
#[derive(Table)]
#[table_name = "users"]
pub struct User {
id: usize,
username: String,
email: String,
address: String,
}
#[test]
fn open_db() {
let db_relative_path = "./db/open.db";
let db_path = Path::new(&db_relative_path);
let result = sqlite::open(db_path);
assert!(result.is_ok());
}
#[test]
fn insert_row() {
let db_relative_path = "./db/insert.db";
let db_path = Path::new(&db_relative_path);
let conn = sqlite::open(db_path);
let mut rng = StdRng::from_entropy();
let max_usize = usize::MAX;
let random_number: usize = rng.gen_range(0..max_usize / 2);
let table_row: User = User {
id: random_number,
username: "mjovanc".to_string(),
email: "mjovanc@icloud.com".to_string(),
address: "Some Random Address 1".to_string(),
};
match conn {
Ok(c) => {
let result = sqlite::insert(c, &table_row);
assert!(result.is_ok());
}
Err(e) => {
panic!("Failed to INSERT: {:?}", e);
}
}
}
#[test]
fn select() {
let db_relative_path = "./db/select.db";
let db_path = Path::new(&db_relative_path);
let conn = sqlite::open(db_path);
let columns = vec!["id".to_string(), "username".to_string(), "email".to_string(), "address".to_string()];
let condition = Condition::Eq("username".to_string(), "mjovanc".to_string());
match conn {
Ok(c) => {
let result = sqlite::select(c, columns)
.from(User::default())
.where_clause(condition)
.build();
match result {
Ok(r) => assert_eq!(r.len(), 2),
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
#[test]
fn select_distinct() {
let db_relative_path = "./db/select.db";
let db_path = Path::new(&db_relative_path);
let conn = sqlite::open(db_path);
let columns = vec!["id".to_string(), "username".to_string(), "email".to_string(), "address".to_string()];
let condition = Condition::Eq("username".to_string(), "mjovanc".to_string());
match conn {
Ok(c) => {
let result = sqlite::select(c, columns)
.from(User::default())
.where_clause(condition)
.distinct()
.build();
match result {
Ok(r) => {
assert_eq!(r.len(), 2);
},
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
#[test]
fn select_group_by() {
let db_relative_path = "./db/select.db";
let db_path = Path::new(&db_relative_path);
let conn = sqlite::open(db_path);
let columns = vec!["id".to_string(), "username".to_string(), "email".to_string(), "address".to_string()];
let condition = Condition::Eq("username".to_string(), "mjovanc".to_string());
let group_by = vec!["username".to_string(), "email".to_string()];
match conn {
Ok(c) => {
let result = sqlite::select(c, columns)
.from(User::default())
.where_clause(condition)
.group_by(group_by)
.build();
match result {
Ok(r) => assert_eq!(r.len(), 1),
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
#[test]
fn select_order_by() {
let db_relative_path = "./db/select.db";
let db_path = Path::new(&db_relative_path);
let conn = sqlite::open(db_path);
let columns = vec!["id".to_string(), "username".to_string(), "email".to_string(), "address".to_string()];
let condition = Condition::Eq("username".to_string(), "mjovanc".to_string());
let group_by = vec!["username".to_string(), "email".to_string()];
let mut order_by = HashMap::new();
order_by.insert(vec!["email".to_string()], "ASC".to_string());
match conn {
Ok(c) => {
let result = sqlite::select(c, columns)
.from(User::default())
.where_clause(condition)
.order_by(order_by)
.group_by(group_by)
.build();
match result {
Ok(r) => assert_eq!(r.len(), 1),
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
#[test]
fn select_limit_offset() {
let db_relative_path = "./db/select.db";
let db_path = Path::new(&db_relative_path);
let conn = sqlite::open(db_path);
let columns = vec!["id".to_string(), "username".to_string(), "email".to_string(), "address".to_string()];
let condition = Condition::Eq("username".to_string(), "mjovanc".to_string());
let group_by = vec!["username".to_string(), "email".to_string()];
let mut order_by = HashMap::new();
order_by.insert(vec!["id".to_string()], "DESC".to_string());
match conn {
Ok(c) => {
let result = sqlite::select(c, columns)
.from(User::default())
.where_clause(condition)
.order_by(order_by)
.group_by(group_by)
.limit(1)
.offset(0)
.build();
match result {
Ok(r) => assert_eq!(r.len(), 1),
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
Err(error) => panic!("Failed to SELECT: {:?}", error),
};
}
#[test]
fn select_having() {
let db_relative_path = "./db/select.db";
let db_path = Path::new(&db_relative_path);
let conn = sqlite::open(db_path);
let columns = vec!["id".to_string(), "username".to_string(), "email".to_string(), "address".to_string()];
let condition = Condition::Eq("username".to_string(), "mjovanc".to_string());
let group_by = vec!["username".to_string(), "email".to_string()];
let mut order_by = HashMap::new();
order_by.insert(vec!["email".to_string()], "DESC".to_string());
let having_condition = Condition::Gt("id".to_string(), "1".to_string());
match conn {
Ok(c) => {
let result = sqlite::select(c, columns)
.from(User::default())
.where_clause(condition)
.order_by(order_by)
.group_by(group_by)
.having(having_condition)
.build();
match result {
Ok(r) => assert_eq!(r.len(), 1),
Err(e) => panic!("Failed to SELECT: {:?}", e),
};
}
Err(e) => panic!("Failed to SELECT: {:?}", e)
}
}