jellyflow-runtime 0.2.0

Headless store, rules, schema, profile, and change pipeline for Jellyflow.
Documentation
use super::*;

#[test]
fn store_dispatch_pipeline_publishes_coherent_commit_state() {
    use std::cell::RefCell;
    use std::rc::Rc;

    let (g0, a, _b, _out_port, _in_port, eid) = make_graph();
    let mut store = make_store(g0);

    let observed: Rc<RefCell<Option<(bool, Option<EdgeReconnectable>)>>> =
        Rc::new(RefCell::new(None));
    let observed2 = observed.clone();
    store.subscribe(move |ev| {
        if let NodeGraphStoreEvent::GraphCommitted { patch } = ev {
            let node_edge_changes = NodeGraphChanges::from_patch(patch);
            let hidden = node_edge_changes
                .nodes()
                .iter()
                .any(|change| matches!(change, NodeChange::Hidden { hidden: true, .. }));
            let reconnectable = node_edge_changes
                .edges()
                .iter()
                .find_map(|change| match change {
                    EdgeChange::Reconnectable { reconnectable, .. } => *reconnectable,
                    _ => None,
                });
            *observed2.borrow_mut() = Some((hidden, reconnectable));
        }
    });

    let tx = GraphTransaction::from_ops([
        GraphOp::SetNodeHidden {
            id: a,
            from: false,
            to: true,
        },
        GraphOp::SetEdgeReconnectable {
            id: eid,
            from: None,
            to: Some(EdgeReconnectable::Bool(false)),
        },
    ]);

    let outcome = store.dispatch_transaction(&tx).expect("dispatch");

    assert!(store.graph().nodes.get(&a).unwrap().hidden);
    assert!(store.lookups().node_lookup.get(&a).unwrap().hidden);
    assert_eq!(
        store.lookups().edge_lookup.get(&eid).unwrap().reconnectable,
        Some(EdgeReconnectable::Bool(false))
    );
    assert!(store.can_undo());
    let node_edge_changes = NodeGraphChanges::from_patch(&outcome.patch);
    assert!(
        node_edge_changes
            .nodes()
            .iter()
            .any(|change| matches!(change, NodeChange::Hidden { id, hidden: true } if *id == a))
    );
    assert!(node_edge_changes.edges().iter().any(|change| matches!(
        change,
        EdgeChange::Reconnectable {
            id,
            reconnectable: Some(EdgeReconnectable::Bool(false))
        } if *id == eid
    )));
    assert_eq!(
        *observed.borrow(),
        Some((true, Some(EdgeReconnectable::Bool(false))))
    );
}