idb 0.6.5

A futures based crate for interacting with IndexedDB on browsers using webassembly
Documentation
use idb::{DatabaseEvent, Factory, ObjectStoreParams, TransactionMode};
use wasm_bindgen_test::wasm_bindgen_test;

#[wasm_bindgen_test]
async fn test_database_name_and_version() {
    let factory = Factory::new().unwrap();
    factory.delete("test").unwrap().await.unwrap();

    let open_request = factory.open("test", Some(1)).unwrap();
    let database = open_request.await.unwrap();

    assert_eq!(database.name(), "test");
    assert_eq!(database.version(), Ok(1));

    database.close();
    factory.delete("test").unwrap().await.unwrap();
}

#[wasm_bindgen_test]
async fn test_database_store_names() {
    let factory = Factory::new().unwrap();
    factory.delete("test").unwrap().await.unwrap();

    let mut open_request = factory.open("test", Some(1)).unwrap();
    open_request.on_upgrade_needed(|event| {
        let database = event.database().unwrap();

        database
            .create_object_store("store1", ObjectStoreParams::new())
            .unwrap();
        database
            .create_object_store("store2", ObjectStoreParams::new())
            .unwrap();
        database
            .create_object_store("store3", ObjectStoreParams::new())
            .unwrap();
    });

    let database = open_request.await.unwrap();

    let store_names = database.store_names();
    assert_eq!(store_names.len(), 3);
    assert!(store_names.contains(&"store1".to_string()));
    assert!(store_names.contains(&"store2".to_string()));
    assert!(store_names.contains(&"store3".to_string()));

    database.close();
    factory.delete("test").unwrap().await.unwrap();
}

#[wasm_bindgen_test]
async fn test_database_transaction() {
    let factory = Factory::new().unwrap();
    factory.delete("test").unwrap().await.unwrap();

    let mut open_request = factory.open("test", Some(1)).unwrap();
    open_request.on_upgrade_needed(|event| {
        let database = event.database().unwrap();

        database
            .create_object_store("store1", ObjectStoreParams::new())
            .unwrap();
        database
            .create_object_store("store2", ObjectStoreParams::new())
            .unwrap();
        database
            .create_object_store("store3", ObjectStoreParams::new())
            .unwrap();
    });

    let database = open_request.await.unwrap();

    let read_transaction = database.transaction(&["store1"], TransactionMode::ReadOnly);
    assert!(
        read_transaction.is_ok(),
        "read transaction should be ok: {}",
        read_transaction.unwrap_err()
    );
    let read_transaction = read_transaction.unwrap();

    assert_eq!(read_transaction.mode(), Ok(TransactionMode::ReadOnly));
    assert_eq!(read_transaction.store_names(), vec!["store1"]);

    let write_transaction = database.transaction(&["store2", "store3"], TransactionMode::ReadWrite);
    assert!(
        write_transaction.is_ok(),
        "write transaction should be ok: {}",
        write_transaction.unwrap_err()
    );
    let write_transaction = write_transaction.unwrap();

    assert_eq!(write_transaction.mode(), Ok(TransactionMode::ReadWrite));
    assert_eq!(write_transaction.store_names(), vec!["store2", "store3"]);

    database.close();
    factory.delete("test").unwrap().await.unwrap();
}

#[wasm_bindgen_test]
async fn test_database_delete_object_store() {
    let factory = Factory::new().unwrap();
    factory.delete("test").unwrap().await.unwrap();

    let mut open_request = factory.open("test", Some(1)).unwrap();
    open_request.on_upgrade_needed(|event| {
        let database = event.database().unwrap();

        database
            .create_object_store("store1", ObjectStoreParams::new())
            .unwrap();
        database
            .create_object_store("store2", ObjectStoreParams::new())
            .unwrap();
        database
            .create_object_store("store3", ObjectStoreParams::new())
            .unwrap();
    });

    let mut database = open_request.await.unwrap();
    database.on_version_change(|event| event.database().expect("database").close());

    let mut open_request = factory.open("test", Some(2)).unwrap();
    open_request.on_upgrade_needed(|event| {
        let database = event.database().unwrap();

        let store_names = database.store_names();
        assert_eq!(store_names.len(), 3);
        assert!(store_names.contains(&"store1".to_string()));
        assert!(store_names.contains(&"store2".to_string()));
        assert!(store_names.contains(&"store3".to_string()));

        database.delete_object_store("store2").unwrap();
    });

    let database = open_request.await.unwrap();

    let store_names = database.store_names();
    assert_eq!(store_names.len(), 2);
    assert!(store_names.contains(&"store1".to_string()));
    assert!(store_names.contains(&"store3".to_string()));

    database.close();
    factory.delete("test").unwrap().await.unwrap();
}