#![cfg(target_arch = "wasm32")]
use wasm_bindgen_test::*;
wasm_bindgen_test_configure!(run_in_browser);
#[wasm_bindgen_test]
async fn test_check_then_create_race() {
console_log::init_with_level(log::Level::Debug).ok();
let timestamp = js_sys::Date::now() as u64;
let db_name = format!("race_test_{}", timestamp);
use web_sys::window;
if let Some(window) = window() {
if let Ok(Some(storage)) = window.local_storage() {
let db_key = format!("{}.db", db_name);
storage
.remove_item(&format!("datasync_leader_{}", db_key))
.ok();
storage
.remove_item(&format!("datasync_instances_{}", db_key))
.ok();
storage
.remove_item(&format!("datasync_heartbeat_{}", db_key))
.ok();
}
}
use absurder_sql::types::DatabaseConfig;
let config = DatabaseConfig {
name: format!("{}.db", db_name),
version: Some(1),
cache_size: Some(10), page_size: Some(4096),
auto_vacuum: Some(true),
journal_mode: Some("WAL".to_string()),
max_export_size_bytes: Some(2 * 1024 * 1024 * 1024),
};
log::info!("TEST: Opening DB1");
let mut db1 = absurder_sql::Database::new(config.clone())
.await
.expect("DB 1");
log::info!("TEST: DB1 created successfully");
log::info!("TEST: Opening DB2");
let mut db2 = absurder_sql::Database::new(config.clone())
.await
.expect("DB 2");
log::info!("TEST: DB2 created successfully - both DBs created!");
db1.execute("DROP TABLE IF EXISTS test").await.ok();
db1.execute("CREATE TABLE test (id INTEGER)").await.ok();
db1.execute("INSERT INTO test VALUES (1)").await.ok();
let result_db2 = db2.execute("SELECT * FROM test").await;
if result_db2.is_err() {
panic!(
"RED PHASE CONFIRMED: Separate BlockStorage instances!\n\
DB2 sees DB1's table: {}\n\
Error: {:?}",
result_db2.is_ok(),
result_db2.as_ref().err()
);
}
assert!(result_db2.is_ok(), "DB2 should see DB1's data (GREEN)");
web_sys::console::log_1(&"TEST: SHARED STORAGE VERIFIED".into());
web_sys::console::log_1(&"TEST: Dropping DB1".into());
drop(db1);
web_sys::console::log_1(&"TEST: Dropping DB2".into());
drop(db2);
web_sys::console::log_1(&"TEST: All databases dropped successfully".into());
if let Some(window) = window() {
if let Ok(Some(storage)) = window.local_storage() {
let db_key = format!("{}.db", db_name);
storage
.remove_item(&format!("datasync_leader_{}", db_key))
.ok();
storage
.remove_item(&format!("datasync_instances_{}", db_key))
.ok();
storage
.remove_item(&format!("datasync_heartbeat_{}", db_key))
.ok();
}
}
web_sys::console::log_1(&"TEST COMPLETED SUCCESSFULLY".into());
log::info!("TEST: Cleanup completed - shared storage verified!");
}