#![cfg(target_arch = "wasm32")]
use absurder_sql::Database;
use wasm_bindgen_test::*;
wasm_bindgen_test_configure!(run_in_browser);
#[wasm_bindgen_test]
async fn test_sync_frequency_is_excessive() {
web_sys::console::log_1(&"=== SYNC FREQUENCY TEST (PROVING THE BUG) ===".into());
let mut config = absurder_sql::DatabaseConfig::default();
config.name = "sync_frequency_test".to_string();
let mut db = Database::new(config).await.unwrap();
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, data TEXT)")
.await
.unwrap();
web_sys::console::log_1(&"Starting 10 inserts - count 'VFS sync: Persisting' messages".into());
web_sys::console::log_1(&"Expected: 1 sync at end".into());
web_sys::console::log_1(&"Actual: (watch console)".into());
for i in 1..=10 {
db.execute(&format!("INSERT INTO test VALUES ({}, 'data {}')", i, i))
.await
.unwrap();
}
web_sys::console::log_1(&"Inserts complete - check console for sync count".into());
web_sys::console::log_1(
&" If you see 10 'VFS sync: Persisting' messages, the bug is confirmed!".into(),
);
db.close().await.unwrap();
}
#[wasm_bindgen_test]
async fn test_sync_overhead_performance_impact() {
web_sys::console::log_1(&"=== PERFORMANCE IMPACT TEST ===".into());
let mut config = absurder_sql::DatabaseConfig::default();
config.name = "perf_impact_test".to_string();
let mut db = Database::new(config).await.unwrap();
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, data TEXT)")
.await
.unwrap();
let start = js_sys::Date::now();
for i in 1..=50 {
db.execute(&format!("INSERT INTO test VALUES ({}, 'data {}')", i, i))
.await
.unwrap();
}
let time_with_excessive_syncs = js_sys::Date::now() - start;
web_sys::console::log_1(
&format!(
" 50 inserts with sync-per-insert: {:.2}ms",
time_with_excessive_syncs
)
.into(),
);
web_sys::console::log_1(
&format!(
" Per-insert cost: {:.2}ms",
time_with_excessive_syncs / 50.0
)
.into(),
);
if time_with_excessive_syncs > 500.0 {
web_sys::console::log_1(&"SLOW: Excessive syncing is killing performance!".into());
} else {
web_sys::console::log_1(&"FAST: Syncing is optimized!".into());
}
db.close().await.unwrap();
}
#[wasm_bindgen_test]
async fn test_batched_inserts_should_sync_once() {
web_sys::console::log_1(&"=== BATCHED INSERT SYNC TEST ===".into());
let mut config = absurder_sql::DatabaseConfig::default();
config.name = "batch_sync_test".to_string();
let mut db = Database::new(config).await.unwrap();
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, data TEXT)")
.await
.unwrap();
web_sys::console::log_1(&"Starting explicit transaction with 20 inserts".into());
web_sys::console::log_1(&"Expected: 1 sync at COMMIT".into());
web_sys::console::log_1(&"Actual: (count 'VFS sync: Persisting' messages)".into());
db.execute("BEGIN TRANSACTION").await.unwrap();
for i in 1..=20 {
db.execute(&format!("INSERT INTO test VALUES ({}, 'data {}')", i, i))
.await
.unwrap();
}
db.execute("COMMIT").await.unwrap();
web_sys::console::log_1(&"Transaction complete - check sync count".into());
db.close().await.unwrap();
}
#[wasm_bindgen_test]
async fn test_deferred_sync_behavior_after_fix() {
web_sys::console::log_1(&"=== DEFERRED SYNC TEST (AFTER FIX) ===".into());
let mut config = absurder_sql::DatabaseConfig::default();
config.name = "deferred_sync_test".to_string();
let mut db = Database::new(config).await.unwrap();
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, data TEXT)")
.await
.unwrap();
web_sys::console::log_1(&"Doing 10 inserts with deferred sync".into());
let start = js_sys::Date::now();
for i in 1..=10 {
db.execute(&format!("INSERT INTO test VALUES ({}, 'data {}')", i, i))
.await
.unwrap();
}
let insert_time = js_sys::Date::now() - start;
web_sys::console::log_1(
&format!(
" 10 inserts: {:.2}ms ({:.2}ms per insert)",
insert_time,
insert_time / 10.0
)
.into(),
);
if insert_time < 100.0 {
web_sys::console::log_1(&"PASS: Deferred sync is working! Inserts are fast.".into());
} else {
web_sys::console::log_1(&"FAIL: Still syncing too frequently!".into());
}
db.close().await.unwrap();
}
#[wasm_bindgen_test]
async fn test_data_persistence_with_deferred_sync() {
web_sys::console::log_1(&"=== DATA PERSISTENCE TEST (CROSS-CONNECTION) ===".into());
let db_name = "persistence_test_cross";
{
let mut config = absurder_sql::DatabaseConfig::default();
config.name = db_name.to_string();
let mut db = Database::new(config).await.unwrap();
web_sys::console::log_1(&"Creating table...".into());
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, data TEXT)")
.await
.unwrap();
web_sys::console::log_1(&"Inserting data...".into());
db.execute("INSERT INTO test VALUES (1, 'test data')")
.await
.unwrap();
web_sys::console::log_1(&"Closing database (should sync to IndexedDB)...".into());
db.close().await.unwrap();
web_sys::console::log_1(&"Database closed".into());
}
web_sys::console::log_1(&"Waiting for IndexedDB persistence...".into());
let promise = js_sys::Promise::new(&mut |resolve, _reject| {
web_sys::window()
.unwrap()
.set_timeout_with_callback_and_timeout_and_arguments_0(&resolve, 1500)
.unwrap();
});
wasm_bindgen_futures::JsFuture::from(promise).await.unwrap();
web_sys::console::log_1(&"Wait complete, opening new connection...".into());
{
let mut config = absurder_sql::DatabaseConfig::default();
config.name = db_name.to_string();
web_sys::console::log_1(&"Creating new Database instance...".into());
let mut db = Database::new(config).await.unwrap();
web_sys::console::log_1(&"New Database instance created, executing SELECT...".into());
match db.execute("SELECT * FROM test WHERE id = 1").await {
Ok(_) => {
web_sys::console::log_1(
&"PASS: Schema and data persisted correctly across connections!".into(),
);
}
Err(e) => {
web_sys::console::log_1(&format!("FAIL: Query failed: {:?}", e).into());
panic!("Schema did not persist: {:?}", e);
}
}
db.close().await.unwrap();
}
}