#![cfg(target_arch = "wasm32")]
use absurder_sql::storage::wasm_indexeddb::{
persist_to_indexeddb_event_based, restore_from_indexeddb,
};
use wasm_bindgen_test::*;
wasm_bindgen_test_configure!(run_in_browser);
#[wasm_bindgen_test]
async fn test_restore_returns_result_type() {
let db_name = "test_error_handling_db";
let result: Result<(), absurder_sql::types::DatabaseError> =
restore_from_indexeddb(db_name).await;
match result {
Ok(_) => web_sys::console::log_1(&"Restore returned Ok".into()),
Err(e) => web_sys::console::log_1(&format!("Restore returned Err: {}", e.message).into()),
}
}
#[wasm_bindgen_test]
async fn test_persist_handles_transaction_errors() {
let db_name = "test_persist_error_db";
let blocks = vec![(1u64, vec![1u8, 2, 3, 4])];
let metadata = vec![(1u64, 100u64)];
let result = persist_to_indexeddb_event_based(
db_name,
blocks,
metadata,
100,
#[cfg(feature = "telemetry")]
None,
#[cfg(feature = "telemetry")]
None,
)
.await;
match result {
Ok(_) => {
web_sys::console::log_1(&"Persist succeeded".into());
}
Err(e) => {
web_sys::console::log_1(
&format!("Persist failed gracefully with error: {}", e.message).into(),
);
assert!(!e.code.is_empty(), "Error code should be set");
assert!(e.message.len() > 10, "Error message should be descriptive");
}
}
}
#[wasm_bindgen_test]
async fn test_persist_empty_data() {
let db_name = "test_persist_empty_db";
let blocks = vec![];
let metadata = vec![];
let result = persist_to_indexeddb_event_based(
db_name,
blocks,
metadata,
0,
#[cfg(feature = "telemetry")]
None,
#[cfg(feature = "telemetry")]
None,
)
.await;
match result {
Ok(_) => web_sys::console::log_1(&"Empty persist succeeded".into()),
Err(e) => {
web_sys::console::log_1(&format!("Empty persist handled: {}", e.message).into());
assert!(!e.code.is_empty());
}
}
}
#[wasm_bindgen_test]
async fn test_persist_large_blocks() {
let db_name = "test_persist_large_db";
let large_data = vec![0u8; 1024 * 1024];
let blocks = vec![(1u64, large_data)];
let metadata = vec![(1u64, 1000u64)];
let result = persist_to_indexeddb_event_based(
db_name,
blocks,
metadata,
1000,
#[cfg(feature = "telemetry")]
None,
#[cfg(feature = "telemetry")]
None,
)
.await;
match result {
Ok(_) => web_sys::console::log_1(&"Large block persist succeeded".into()),
Err(e) => {
web_sys::console::log_1(&format!("Large block error handled: {}", e.message).into());
}
}
}
#[wasm_bindgen_test]
async fn test_error_messages_are_descriptive() {
let db_name = "test_descriptive_errors";
let blocks = vec![];
let metadata = vec![];
let result = persist_to_indexeddb_event_based(
db_name,
blocks,
metadata,
0,
#[cfg(feature = "telemetry")]
None,
#[cfg(feature = "telemetry")]
None,
)
.await;
if let Err(e) = result {
assert!(
e.message.len() > 5,
"Error message should be descriptive, got: {}",
e.message
);
assert!(!e.code.is_empty(), "Error code should not be empty");
}
}
#[wasm_bindgen_test]
async fn test_missing_indexeddb_support_handled() {
let db_name = "test_no_indexeddb";
let result = restore_from_indexeddb(db_name).await;
match result {
Ok(_) => web_sys::console::log_1(&"IndexedDB available and handled".into()),
Err(e) => {
web_sys::console::log_1(
&format!("IndexedDB error handled gracefully: {}", e.code).into(),
);
assert!(!e.code.is_empty(), "Error code should be set");
}
}
}
#[wasm_bindgen_test]
async fn test_concurrent_access_errors() {
use absurder_sql::Database;
let db_name = "test_concurrent_db.db";
let _db = Database::new_wasm(db_name.to_string())
.await
.expect("Should create database");
let result = persist_to_indexeddb_event_based(
db_name,
vec![(1, vec![1, 2, 3])],
vec![(1, 1)],
1,
#[cfg(feature = "telemetry")]
None,
#[cfg(feature = "telemetry")]
None,
)
.await;
match result {
Ok(_) => web_sys::console::log_1(&"Handled concurrent access successfully".into()),
Err(_) => web_sys::console::log_1(&"Handled concurrent access error gracefully".into()),
}
}