use stoolap::Database;
#[test]
fn test_unique_index_first() {
let db = Database::open("memory://dup_idx_unique_first").expect("Failed to create database");
db.execute("CREATE TABLE duplicate_test (id INTEGER, name TEXT)", ())
.expect("Failed to create table");
db.execute(
"CREATE UNIQUE INDEX idx_name_unique ON duplicate_test(name)",
(),
)
.expect("Failed to create unique index");
let result = db.execute("CREATE INDEX idx_name ON duplicate_test(name)", ());
assert!(
result.is_err(),
"Expected error when creating duplicate index"
);
let err = result.unwrap_err();
let err_msg = err.to_string();
assert!(
err_msg.contains("cannot create non-unique index")
|| err_msg.contains("already exists")
|| err_msg.contains("index"),
"Unexpected error message: {}",
err_msg
);
}
#[test]
fn test_non_unique_index_first() {
let db = Database::open("memory://dup_idx_nonunique_first").expect("Failed to create database");
db.execute("CREATE TABLE duplicate_test2 (id INTEGER, name TEXT)", ())
.expect("Failed to create table");
db.execute("CREATE INDEX idx_name2 ON duplicate_test2(name)", ())
.expect("Failed to create non-unique index");
let result = db.execute(
"CREATE UNIQUE INDEX idx_name2_unique ON duplicate_test2(name)",
(),
);
assert!(
result.is_err(),
"Expected error when creating duplicate index"
);
let err = result.unwrap_err();
let err_msg = err.to_string();
assert!(
err_msg.contains("cannot create unique index")
|| err_msg.contains("already exists")
|| err_msg.contains("index"),
"Unexpected error message: {}",
err_msg
);
}
#[test]
fn test_if_not_exists() {
let db = Database::open("memory://dup_idx_if_not_exists").expect("Failed to create database");
db.execute("CREATE TABLE duplicate_test3 (id INTEGER, name TEXT)", ())
.expect("Failed to create table");
db.execute("CREATE UNIQUE INDEX idx_name3 ON duplicate_test3(name)", ())
.expect("Failed to create unique index");
let result = db.execute(
"CREATE INDEX IF NOT EXISTS idx_name3_nonunique ON duplicate_test3(name)",
(),
);
assert!(
result.is_ok(),
"IF NOT EXISTS should succeed: {:?}",
result.err()
);
}
#[test]
fn test_same_index_name() {
let db = Database::open("memory://dup_idx_same_name").expect("Failed to create database");
db.execute(
"CREATE TABLE test_table (id INTEGER, col1 TEXT, col2 TEXT)",
(),
)
.expect("Failed to create table");
db.execute("CREATE INDEX idx_test ON test_table(col1)", ())
.expect("Failed to create first index");
let result = db.execute("CREATE INDEX idx_test ON test_table(col2)", ());
assert!(
result.is_err(),
"Expected error when creating index with same name"
);
}
#[test]
fn test_different_columns() {
let db = Database::open("memory://dup_idx_diff_cols").expect("Failed to create database");
db.execute(
"CREATE TABLE multi_col (id INTEGER, name TEXT, value INTEGER)",
(),
)
.expect("Failed to create table");
db.execute("CREATE INDEX idx_name ON multi_col(name)", ())
.expect("Failed to create index on name");
db.execute("CREATE INDEX idx_value ON multi_col(value)", ())
.expect("Failed to create index on value");
db.execute(
"INSERT INTO multi_col (id, name, value) VALUES (1, 'test', 100)",
(),
)
.expect("Failed to insert data");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM multi_col WHERE name = 'test'", ())
.expect("Failed to query by name");
assert_eq!(count, 1);
let count: i64 = db
.query_one("SELECT COUNT(*) FROM multi_col WHERE value = 100", ())
.expect("Failed to query by value");
assert_eq!(count, 1);
}