idb 0.6.5

A futures based crate for interacting with IndexedDB on browsers using webassembly
Documentation
use idb::{
    builder::{DatabaseBuilder, IndexBuilder, ObjectStoreBuilder},
    Factory, KeyPath, TransactionMode,
};
use wasm_bindgen_test::wasm_bindgen_test;

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

    let database = DatabaseBuilder::new("test")
        .version(1)
        .build()
        .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_builder_remove() {
    let factory = Factory::new().unwrap();
    factory.delete("test").unwrap().await.unwrap();

    let database = DatabaseBuilder::new("test")
        .version(1)
        .add_object_store(ObjectStoreBuilder::new("store1"))
        .add_object_store(ObjectStoreBuilder::new("store2"))
        .add_object_store(ObjectStoreBuilder::new("store3"))
        .add_object_store(ObjectStoreBuilder::new("store4"))
        .remove_object_store("store4")
        .build()
        .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_builder_reopen_remove() {
    let factory = Factory::new().unwrap();
    factory.delete("test").unwrap().await.unwrap();

    let database = DatabaseBuilder::new("test")
        .version(1)
        .add_object_store(ObjectStoreBuilder::new("store1"))
        .add_object_store(ObjectStoreBuilder::new("store2"))
        .build()
        .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(&"store2".to_string()));

    database.close();

    let database = DatabaseBuilder::new("test")
        .version(2)
        .add_object_store(ObjectStoreBuilder::new("store1"))
        .add_object_store(ObjectStoreBuilder::new("store2"))
        .remove_object_store("store2")
        .build()
        .await
        .unwrap();

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

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

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

    let database = DatabaseBuilder::new("test")
        .version(1)
        .add_object_store(ObjectStoreBuilder::new("store1"))
        .add_object_store(ObjectStoreBuilder::new("store2"))
        .add_object_store(ObjectStoreBuilder::new("store3"))
        .build()
        .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_builder_rename() {
    let factory = Factory::new().unwrap();
    factory.delete("test").unwrap().await.unwrap();

    let database = DatabaseBuilder::new("test")
        .version(1)
        .add_object_store(ObjectStoreBuilder::new("store1"))
        .add_object_store(ObjectStoreBuilder::new("store2"))
        .add_object_store(ObjectStoreBuilder::new("store3_to_rename_twice"))
        .rename_object_store("store3_to_rename_twice", "store3_to_rename_once_more")
        .rename_object_store("store3_to_rename_once_more", "store3")
        .build()
        .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_builder_reopen_rename() {
    let factory = Factory::new().unwrap();
    factory.delete("test").unwrap().await.unwrap();

    let database = DatabaseBuilder::new("test")
        .version(1)
        .add_object_store(ObjectStoreBuilder::new("store_to_rename"))
        .build()
        .await
        .unwrap();

    let store_names = database.store_names();
    assert_eq!(store_names.len(), 1);
    assert!(store_names.contains(&"store_to_rename".to_string()));

    database.close();

    let database = DatabaseBuilder::new("test")
        .version(2)
        .add_object_store(ObjectStoreBuilder::new("store_to_rename"))
        .rename_object_store("store_to_rename", "store")
        .build()
        .await
        .unwrap();

    let store_names = database.store_names();
    assert_eq!(store_names.len(), 1);
    assert!(store_names.contains(&"store".to_string()));
    database.close();

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

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

    let database = DatabaseBuilder::new("test")
        .version(1)
        .add_object_store(ObjectStoreBuilder::new("store"))
        .add_object_store(ObjectStoreBuilder::new("store_to_rename"))
        .build()
        .await
        .unwrap();

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

    database.close();

    let database = DatabaseBuilder::new("test")
        .version(2)
        .add_object_store(ObjectStoreBuilder::new("store"))
        .add_object_store(ObjectStoreBuilder::new("store_to_rename"))
        .remove_object_store("store")
        .rename_object_store("store_to_rename", "store")
        .build()
        .await
        .unwrap();

    let store_names = database.store_names();
    assert_eq!(store_names.len(), 1);
    assert!(store_names.contains(&"store".to_string()));
    database.close();

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

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

    let database = DatabaseBuilder::new("test")
        .version(1)
        .add_object_store(
            ObjectStoreBuilder::new("store1").add_index(IndexBuilder::new(
                "index1".to_string(),
                KeyPath::new_single("id"),
            )),
        )
        .add_object_store(
            ObjectStoreBuilder::new("store2").add_index(IndexBuilder::new(
                "index2".to_string(),
                KeyPath::new_single("id"),
            )),
        )
        .add_object_store(
            ObjectStoreBuilder::new("store3").add_index(IndexBuilder::new(
                "index3".to_string(),
                KeyPath::new_single("id"),
            )),
        )
        .build()
        .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()));

    let transaction = database
        .transaction(&["store1", "store2", "store3"], TransactionMode::ReadOnly)
        .unwrap();

    let store1 = transaction.object_store("store1").unwrap();
    let index1 = store1.index_names();
    assert_eq!(1, index1.len());
    assert!(index1.contains(&"index1".to_string()));

    let store2 = transaction.object_store("store2").unwrap();
    let index2 = store2.index_names();
    assert_eq!(1, index2.len());
    assert!(index2.contains(&"index2".to_string()));

    let store3 = transaction.object_store("store3").unwrap();
    let index3 = store3.index_names();
    assert_eq!(1, index3.len());
    assert!(index3.contains(&"index3".to_string()));

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

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

    let database = DatabaseBuilder::new("test")
        .version(1)
        .add_object_store(
            ObjectStoreBuilder::new("store")
                .add_index(IndexBuilder::new(
                    "index0".to_string(),
                    KeyPath::new_single("id"),
                ))
                .add_index(
                    IndexBuilder::new("index1".to_string(), KeyPath::new_single("id")).unique(true),
                ),
        )
        .build()
        .await
        .unwrap();

    let transaction = database
        .transaction(&["store"], TransactionMode::ReadOnly)
        .unwrap();

    let store = transaction.object_store("store").unwrap();
    let index = store.index_names();
    assert_eq!(index, vec!["index0", "index1"]);
    assert!(store.index("index1").unwrap().unique());

    transaction.abort().unwrap();
    database.close();

    let database = DatabaseBuilder::new("test")
        .version(2)
        .add_object_store(
            ObjectStoreBuilder::new("store")
                .add_index(IndexBuilder::new(
                    "index0".to_string(),
                    KeyPath::new_single("id"),
                ))
                .add_index(IndexBuilder::new(
                    "index1".to_string(),
                    KeyPath::new_single("id"),
                )),
        )
        .build()
        .await
        .unwrap();

    let transaction = database
        .transaction(&["store"], TransactionMode::ReadOnly)
        .unwrap();

    let store = transaction.object_store("store").unwrap();
    let index = store.index_names();
    assert_eq!(index, vec!["index0", "index1"]);
    assert!(!store.index("index1").unwrap().unique());

    transaction.abort().unwrap();
    database.close();
}