kcode-k1-groups 0.2.0

Synchronous facade over the K1 groups driver and projection
Documentation
use std::{path::Path, sync::Arc};

use kcode_k1_groups::{GroupName, K1Groups, TxId, UserId};
use kcode_k1_peering::K1Peering;
use kcode_k1_txn_ordering::K1TxnOrdering;

fn assert_send_sync<T: Send + Sync>() {}

fn user(value: u8) -> UserId {
    UserId::from_tx_id(TxId::from_bytes([value; 12]))
}

fn name(value: &str) -> GroupName {
    GroupName::new(value.to_owned()).unwrap()
}

fn open_stack(root: &Path) -> (Arc<K1TxnOrdering>, Arc<K1Peering>, K1Groups) {
    let ordering = Arc::new(K1TxnOrdering::open(&root.join("ordering")).unwrap());
    let peering = Arc::new(K1Peering::open(&root.join("peering"), ordering.clone()).unwrap());
    let groups = K1Groups::open(&root.join("groups"), ordering.clone(), peering.clone()).unwrap();
    (ordering, peering, groups)
}

#[test]
fn create_rename_query_and_reopen() {
    assert_send_sync::<K1Groups>();
    let root = tempfile::tempdir().unwrap();
    let (ordering, peering, groups) = open_stack(root.path());

    let created = groups.create(user(1), name("created")).unwrap();
    let group = created.group_id();
    let renamed = groups.rename(user(1), group, name("renamed")).unwrap();
    let fetched = groups.get(group).unwrap().unwrap();
    assert_eq!(fetched.name().as_str(), "renamed");
    assert_eq!(fetched.revision(), &renamed);

    drop(groups);
    drop(peering);
    drop(ordering);

    let (ordering, peering, groups) = open_stack(root.path());
    let fetched = groups.get(group).unwrap().unwrap();
    assert_eq!(fetched.name().as_str(), "renamed");
    assert_eq!(fetched.revision(), &renamed);

    drop(groups);
    drop(peering);
    drop(ordering);
}