use stoolap::Database;
fn setup_db() -> Database {
let db = Database::open_in_memory().unwrap();
db.execute(
"CREATE TABLE users (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
username TEXT NOT NULL,
plan TEXT NOT NULL DEFAULT 'free',
metadata JSON
)",
(),
)
.unwrap();
db.execute(
"INSERT INTO users (username, plan, metadata) VALUES
('alice', 'pro', '{\"country\":\"US\"}'),
('bob', 'enterprise', '{\"country\":\"UK\"}'),
('charlie', 'free', '{\"country\":\"DE\"}')",
(),
)
.unwrap();
db.execute(
"CREATE TABLE events (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
user_id INTEGER NOT NULL,
event_type TEXT NOT NULL,
duration_ms INTEGER,
properties JSON,
created_at TIMESTAMP NOT NULL
)",
(),
)
.unwrap();
db.execute(
"INSERT INTO events (user_id, event_type, duration_ms, properties, created_at) VALUES
(1, 'page_view', 3200, '{\"device\":\"desktop\"}', '2026-01-05 09:10:00'),
(2, 'purchase', 45000, '{\"device\":\"mobile\",\"amount\":99.99}', '2026-01-05 11:30:00'),
(3, 'page_view', 1800, '{\"device\":\"desktop\"}', '2026-01-06 08:00:00')",
(),
)
.unwrap();
db.execute(
"CREATE VIEW user_dashboard AS
SELECT u.id AS user_id, u.username, u.plan, COUNT(e.id) AS total_events
FROM users u LEFT JOIN events e ON e.user_id = u.id
GROUP BY u.id, u.username, u.plan",
(),
)
.unwrap();
db
}
#[test]
fn test_view_column_names_no_prefix() {
let db = setup_db();
let result = db.query("SELECT * FROM user_dashboard", ()).unwrap();
let rows: Vec<_> = result.collect::<Result<Vec<_>, _>>().unwrap();
assert_eq!(rows.len(), 3);
let username = rows[0].get::<String>(1);
assert!(
username.is_ok(),
"Column at index 1 should be accessible and be 'username' not 'u.username'"
);
}
#[test]
fn test_view_select_specific_column() {
let db = setup_db();
let result = db.query("SELECT username FROM user_dashboard", ());
assert!(
result.is_ok(),
"SELECT username FROM view should work, but fails because column is named 'u.username': {:?}",
result.err()
);
}
#[test]
fn test_window_function_on_view_no_panic() {
let db = setup_db();
let result = db.query(
"SELECT total_events,
RANK() OVER (ORDER BY total_events) AS rnk
FROM user_dashboard",
(),
);
match result {
Ok(rows) => {
let collected: Vec<_> = rows.collect::<Result<Vec<_>, _>>().unwrap();
assert_eq!(collected.len(), 3);
}
Err(e) => {
eprintln!("Window function on view returned error (acceptable): {}", e);
}
}
}
#[test]
fn test_percent_rank_on_view_no_panic() {
let db = setup_db();
let result = db.query(
"SELECT total_events,
RANK() OVER (ORDER BY total_events DESC) AS revenue_rank,
ROUND(PERCENT_RANK() OVER (ORDER BY total_events), 2) AS activity_percentile
FROM user_dashboard
ORDER BY revenue_rank",
(),
);
match result {
Ok(rows) => {
let collected: Vec<_> = rows.collect::<Result<Vec<_>, _>>().unwrap();
assert_eq!(collected.len(), 3);
}
Err(e) => {
eprintln!("PERCENT_RANK on view returned error (acceptable): {}", e);
}
}
}