use stoolap::Database;
#[test]
fn test_direct_delete() {
let db = Database::open("memory://direct_delete").expect("Failed to create database");
db.execute("CREATE TABLE test_delete (id INTEGER)", ())
.expect("Failed to create table");
db.execute("INSERT INTO test_delete VALUES (1)", ())
.expect("Failed to insert data");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM test_delete", ())
.expect("Failed to count rows");
assert_eq!(count, 1, "Expected 1 row before delete");
db.execute("DELETE FROM test_delete WHERE id = 1", ())
.expect("Failed to delete row");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM test_delete", ())
.expect("Failed to count rows after delete");
assert_eq!(count, 0, "Expected 0 rows after delete");
}
#[test]
fn test_integer_comparison_delete() {
let db = Database::open("memory://int_delete").expect("Failed to create database");
db.execute("CREATE TABLE int_delete (id INTEGER)", ())
.expect("Failed to create table");
for i in 1..=10 {
db.execute(&format!("INSERT INTO int_delete VALUES ({})", i), ())
.expect("Failed to insert data");
}
db.execute("DELETE FROM int_delete WHERE id > 5", ())
.expect("Failed to delete rows");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM int_delete", ())
.expect("Failed to count rows");
assert_eq!(
count, 5,
"Expected 5 rows to remain after DELETE WHERE id > 5"
);
for i in 1..=10 {
let exists: i64 = db
.query_one(
&format!("SELECT COUNT(*) FROM int_delete WHERE id = {}", i),
(),
)
.expect("Failed to check if row exists");
let expected = if i <= 5 { 1 } else { 0 };
assert_eq!(exists, expected, "For id={}, expected {} rows", i, expected);
}
}
#[test]
fn test_boolean_condition_delete() {
let db = Database::open("memory://bool_delete").expect("Failed to create database");
db.execute("CREATE TABLE bool_delete (id INTEGER, active BOOLEAN)", ())
.expect("Failed to create table");
for i in 1..=10 {
let active = i % 2 == 0; db.execute(
&format!("INSERT INTO bool_delete VALUES ({}, {})", i, active),
(),
)
.expect("Failed to insert data");
}
db.execute("DELETE FROM bool_delete WHERE active = true", ())
.expect("Failed to delete rows");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM bool_delete", ())
.expect("Failed to count rows");
assert_eq!(
count, 5,
"Expected 5 rows to remain after DELETE WHERE active = true"
);
let inactive_count: i64 = db
.query_one("SELECT COUNT(*) FROM bool_delete WHERE active = false", ())
.expect("Failed to count inactive rows");
assert_eq!(inactive_count, 5, "Expected 5 inactive rows to remain");
}
#[test]
fn test_string_comparison_delete() {
let db = Database::open("memory://str_delete").expect("Failed to create database");
db.execute("CREATE TABLE str_delete (id INTEGER, name TEXT)", ())
.expect("Failed to create table");
let test_data = [
(1, "Apple"),
(2, "Banana"),
(3, "Cherry"),
(4, "Date"),
(5, "Elderberry"),
];
for (id, name) in &test_data {
db.execute(
&format!("INSERT INTO str_delete VALUES ({}, '{}')", id, name),
(),
)
.expect("Failed to insert data");
}
db.execute("DELETE FROM str_delete WHERE name = 'Cherry'", ())
.expect("Failed to delete rows");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM str_delete", ())
.expect("Failed to count rows");
assert_eq!(
count, 4,
"Expected 4 rows to remain after DELETE WHERE name = 'Cherry'"
);
let cherry_count: i64 = db
.query_one("SELECT COUNT(*) FROM str_delete WHERE name = 'Cherry'", ())
.expect("Failed to check if Cherry remains");
assert_eq!(cherry_count, 0, "Expected 0 'Cherry' rows to remain");
}
#[test]
fn test_delete_with_and() {
let db = Database::open("memory://and_delete").expect("Failed to create database");
db.execute(
"CREATE TABLE and_delete (id INTEGER, category TEXT, value FLOAT)",
(),
)
.expect("Failed to create table");
db.execute("INSERT INTO and_delete VALUES (1, 'A', 10.5)", ())
.unwrap();
db.execute("INSERT INTO and_delete VALUES (2, 'A', 20.0)", ())
.unwrap();
db.execute("INSERT INTO and_delete VALUES (3, 'B', 15.5)", ())
.unwrap();
db.execute("INSERT INTO and_delete VALUES (4, 'B', 25.0)", ())
.unwrap();
db.execute("INSERT INTO and_delete VALUES (5, 'C', 30.5)", ())
.unwrap();
db.execute("INSERT INTO and_delete VALUES (6, 'C', 40.0)", ())
.unwrap();
db.execute(
"DELETE FROM and_delete WHERE category = 'B' AND value > 20.0",
(),
)
.expect("Failed to delete rows");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM and_delete", ())
.expect("Failed to count rows");
assert_eq!(
count, 5,
"Expected 5 rows to remain after DELETE with AND condition"
);
let id4_count: i64 = db
.query_one("SELECT COUNT(*) FROM and_delete WHERE id = 4", ())
.expect("Failed to check if id=4 remains");
let id3_count: i64 = db
.query_one("SELECT COUNT(*) FROM and_delete WHERE id = 3", ())
.expect("Failed to check if id=3 remains");
assert_eq!(id4_count, 0, "Expected 0 rows with id=4 to remain");
assert_eq!(id3_count, 1, "Expected 1 row with id=3 to remain");
}
#[test]
fn test_delete_all_rows() {
let db = Database::open("memory://delete_all").expect("Failed to create database");
db.execute("CREATE TABLE delete_all_test (id INTEGER, name TEXT)", ())
.expect("Failed to create table");
for i in 1..=10 {
db.execute(
&format!("INSERT INTO delete_all_test VALUES ({}, 'Name-{}')", i, i),
(),
)
.expect("Failed to insert data");
}
let initial_count: i64 = db
.query_one("SELECT COUNT(*) FROM delete_all_test", ())
.expect("Failed to count initial rows");
assert_eq!(initial_count, 10, "Expected 10 initial rows");
db.execute("DELETE FROM delete_all_test", ())
.expect("Failed to delete all rows");
let remaining_count: i64 = db
.query_one("SELECT COUNT(*) FROM delete_all_test", ())
.expect("Failed to count remaining rows");
assert_eq!(
remaining_count, 0,
"Expected 0 rows to remain after DELETE without WHERE"
);
}
#[test]
fn test_delete_with_or() {
let db = Database::open("memory://or_delete").expect("Failed to create database");
db.execute(
"CREATE TABLE or_delete (id INTEGER, category TEXT, value FLOAT)",
(),
)
.expect("Failed to create table");
db.execute("INSERT INTO or_delete VALUES (1, 'A', 10.5)", ())
.unwrap();
db.execute("INSERT INTO or_delete VALUES (2, 'A', 20.0)", ())
.unwrap();
db.execute("INSERT INTO or_delete VALUES (3, 'B', 15.5)", ())
.unwrap();
db.execute("INSERT INTO or_delete VALUES (4, 'B', 25.0)", ())
.unwrap();
db.execute("INSERT INTO or_delete VALUES (5, 'C', 30.5)", ())
.unwrap();
db.execute("INSERT INTO or_delete VALUES (6, 'C', 40.0)", ())
.unwrap();
db.execute(
"DELETE FROM or_delete WHERE category = 'A' OR value > 30.0",
(),
)
.expect("Failed to delete rows");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM or_delete", ())
.expect("Failed to count rows");
assert_eq!(
count, 2,
"Expected 2 rows to remain after DELETE with OR condition"
);
let b_category_count: i64 = db
.query_one("SELECT COUNT(*) FROM or_delete WHERE category = 'B'", ())
.expect("Failed to count category B rows");
assert_eq!(
b_category_count, 2,
"Expected 2 rows with category B to remain"
);
}
#[test]
fn test_delete_with_between() {
let db = Database::open("memory://between_delete").expect("Failed to create database");
db.execute("CREATE TABLE between_delete (id INTEGER, value FLOAT)", ())
.expect("Failed to create table");
for i in 1..=10 {
let value = (i * 10) as f64;
db.execute(
&format!("INSERT INTO between_delete VALUES ({}, {:.1})", i, value),
(),
)
.expect("Failed to insert data");
}
db.execute(
"DELETE FROM between_delete WHERE value BETWEEN 30 AND 70",
(),
)
.expect("Failed to delete rows");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM between_delete", ())
.expect("Failed to count rows");
assert_eq!(
count, 5,
"Expected 5 rows to remain after DELETE with BETWEEN"
);
}
#[test]
fn test_delete_with_in() {
let db = Database::open("memory://in_delete").expect("Failed to create database");
db.execute("CREATE TABLE in_delete (id INTEGER, category TEXT)", ())
.expect("Failed to create table");
let categories = ["A", "B", "C", "D", "E"];
for (i, category) in categories.iter().enumerate() {
db.execute(
&format!("INSERT INTO in_delete VALUES ({}, '{}')", i + 1, category),
(),
)
.expect("Failed to insert data");
}
db.execute(
"DELETE FROM in_delete WHERE category IN ('A', 'C', 'E')",
(),
)
.expect("Failed to delete rows");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM in_delete", ())
.expect("Failed to count rows");
assert_eq!(count, 2, "Expected 2 rows to remain after DELETE with IN");
let b_count: i64 = db
.query_one("SELECT COUNT(*) FROM in_delete WHERE category = 'B'", ())
.expect("Failed to count category B");
let d_count: i64 = db
.query_one("SELECT COUNT(*) FROM in_delete WHERE category = 'D'", ())
.expect("Failed to count category D");
assert_eq!(b_count, 1, "Expected 1 row with category B");
assert_eq!(d_count, 1, "Expected 1 row with category D");
}
#[test]
fn test_delete_with_not_in() {
let db = Database::open("memory://not_in_delete").expect("Failed to create database");
db.execute("CREATE TABLE not_in_delete (id INTEGER, category TEXT)", ())
.expect("Failed to create table");
db.execute("INSERT INTO not_in_delete VALUES (1, 'A')", ())
.unwrap();
db.execute("INSERT INTO not_in_delete VALUES (2, 'B')", ())
.unwrap();
db.execute("INSERT INTO not_in_delete VALUES (3, 'C')", ())
.unwrap();
db.execute("INSERT INTO not_in_delete VALUES (4, 'D')", ())
.unwrap();
db.execute("INSERT INTO not_in_delete VALUES (5, 'E')", ())
.unwrap();
db.execute(
"DELETE FROM not_in_delete WHERE category NOT IN ('B', 'D')",
(),
)
.expect("Failed to execute DELETE");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM not_in_delete", ())
.expect("Failed to count remaining rows");
assert_eq!(count, 2, "Expected 2 rows to remain");
let result = db
.query("SELECT category FROM not_in_delete ORDER BY category", ())
.expect("Failed to query categories");
let mut categories: Vec<String> = Vec::new();
for row in result {
let row = row.expect("Failed to get row");
let category: String = row.get(0).unwrap();
categories.push(category);
}
assert_eq!(categories.len(), 2);
assert!(categories.contains(&"B".to_string()));
assert!(categories.contains(&"D".to_string()));
}