strop-engine 0.36.0

strop editor engine: documents, grammar, services and sessions — no frontend UI dependencies
use strop_workspace::operation::{FsFailureKind, StepOutcome};

#[test]
fn old_review_cannot_mutate_after_a_new_worker_session_is_ready() {
    let (root, mut editor) = super::tests::fixture();
    let source = root.path().join("original.txt");
    let destination = root.path().join("renamed.txt");
    std::fs::write(&source, "kept\n").unwrap();
    editor.open_fixture(&source).unwrap();
    super::tests::command(&mut editor, ":fs rename renamed.txt<cr>");
    let prepared = editor
        .filesystem
        .pending
        .as_ref()
        .unwrap()
        .batch
        .worker_session
        .unwrap();
    let worker = editor.filesystem.worker().clone();
    worker.shutdown().unwrap();
    let (token, _owner) = strop_core::worker::CancelToken::standalone();
    worker.health(&token).unwrap();
    assert_ne!(worker.session(), Some(prepared));

    super::tests::command(&mut editor, ":apply-change<cr>");
    assert_eq!(std::fs::read(&source).unwrap(), b"kept\n");
    assert!(
        !destination.exists(),
        "old review must not execute on the new worker"
    );
    let attempt = editor.filesystem.history.back().unwrap();
    assert!(matches!(
        &attempt.receipts[0].outcome,
        StepOutcome::Refused(error) if error.kind == FsFailureKind::Conflict
    ));
    worker.shutdown().unwrap();
}