gy 1.2.1

good,yes — the ledger of what work rests on before a requirement is confirmed
mod common;

use common::{criterion, decision, fixture, need, question, stderr, stdout};

#[test]
fn link_adds_then_removes_an_edge() {
    let fx = fixture();
    fx.seed(&[need("0001", "a need"), criterion("0002", "a criterion")]);

    let out = fx.run(&["link", "n-0001", "targets", "ac-0002"]);
    assert!(out.status.success(), "{}", stderr(&out));
    assert!(stdout(&out).contains("changed: linked"));
    assert!(stdout(&out).contains("missing: \nnext: \n"));

    let out = fx.run(&["link", "n-0001", "targets", "ac-0002"]);
    assert_eq!(out.status.code(), Some(2));

    let out = fx.run(&["link", "n-0001", "targets", "ac-0002", "--remove"]);
    assert!(out.status.success(), "{}", stderr(&out));
    assert!(stdout(&out).contains("changed: unlinked"));
}

#[test]
fn link_rejects_closes_and_an_unknown_relation() {
    let fx = fixture();
    fx.seed(&[
        question("0003", "a question"),
        decision("0004", "a decision"),
    ]);
    let out = fx.run(&["link", "q-0003", "closes", "d-0004"]);
    assert_eq!(out.status.code(), Some(2));

    fx.seed(&[need("0005", "a need"), criterion("0006", "a criterion")]);
    let out = fx.run(&["link", "n-0005", "bogus", "ac-0006"]);
    assert_eq!(out.status.code(), Some(2));
}

#[test]
fn link_names_the_valid_relations() {
    let fx = fixture();
    fx.seed(&[need("0001", "a need"), criterion("0002", "a criterion")]);

    let out = fx.run(&["link", "n-0001", "bogus", "ac-0002"]);
    assert_eq!(out.status.code(), Some(2));
    let message = stderr(&out);
    assert!(message.contains("expected one of"), "{message}");
    for relation in gy_ledger::Relation::ALL {
        assert!(message.contains(relation.name()), "{message}");
    }
}

#[test]
fn link_help_names_the_relations() {
    let fx = fixture();
    let help = fx.run(&["link", "--help"]);
    assert!(help.status.success(), "{}", stderr(&help));
    let text = stdout(&help);
    for relation in gy_ledger::Relation::ALL {
        assert!(text.contains(relation.name()), "{text}");
    }
}