use serde_json::json;
use super::{interpret_session, scan_evidence};
use crate::core::sm::goals::SessionTaskState;
#[test]
fn interpret_running() {
let obs = interpret_session(&json!({ "session": { "state": "running" } }));
assert_eq!(obs.state, SessionTaskState::Running);
assert!(obs.evidence.is_none());
}
#[test]
fn interpret_failed() {
let obs = interpret_session(&json!({ "session": { "state": "errored" } }));
assert_eq!(obs.state, SessionTaskState::Failed);
assert!(obs.evidence.is_none());
}
#[test]
fn interpret_launched() {
let obs = interpret_session(&json!({ "session": { "state": "created" } }));
assert_eq!(obs.state, SessionTaskState::Launched);
}
#[test]
fn interpret_verified_with_pr_url() {
let obs = interpret_session(&json!({
"session": {
"state": "running",
"pane": "Opened PR https://github.com/acme/repo/pull/42 ready for review"
}
}));
assert_eq!(obs.state, SessionTaskState::Verified);
assert_eq!(
obs.evidence.as_deref(),
Some("PR opened: https://github.com/acme/repo/pull/42")
);
}
#[test]
fn interpret_no_evidence_stays_unverified() {
let obs = interpret_session(&json!({ "session": { "state": "stopped" } }));
assert_ne!(obs.state, SessionTaskState::Verified);
assert!(obs.evidence.is_none());
}
#[test]
fn scan_finds_pr_url() {
let ev = scan_evidence("All set. See https://github.com/o/r/pull/7).").unwrap();
assert_eq!(ev, "PR opened: https://github.com/o/r/pull/7");
}
#[test]
fn scan_pr_url_strips_json_framing() {
let obs = interpret_session(&json!({
"session": { "state": "running", "pane": "https://github.com/o/r/pull/9" }
}));
assert_eq!(
obs.evidence.as_deref(),
Some("PR opened: https://github.com/o/r/pull/9"),
"captured URL must not carry trailing JSON framing"
);
}
#[test]
fn interpret_evidence_from_raw_pane() {
let pane =
"Ran the job: \"build\" finished.\nOpened PR https://github.com/acme/repo/pull/13\nDone.";
let obs = interpret_session(&json!({
"session": { "state": "running", "pane": pane }
}));
assert_eq!(obs.state, SessionTaskState::Verified);
assert_eq!(
obs.evidence.as_deref(),
Some("PR opened: https://github.com/acme/repo/pull/13"),
"evidence is scanned from the raw pane value, clean of JSON escaping"
);
}
#[test]
fn interpret_evidence_fallback_to_json_when_no_pane() {
let obs = interpret_session(&json!({
"session": { "state": "running", "result_url": "https://github.com/o/r/pull/5" }
}));
assert_eq!(obs.state, SessionTaskState::Verified);
assert_eq!(
obs.evidence.as_deref(),
Some("PR opened: https://github.com/o/r/pull/5"),
"no pane field ⇒ fall back to scanning the whole JSON"
);
}
#[test]
fn scan_finds_test_pass() {
let ev = scan_evidence("running 12 tests\ntest result: ok. 12 passed; 0 failed").unwrap();
assert!(ev.starts_with("tests pass:"));
assert!(ev.contains("ok"));
}
#[test]
fn scan_finds_diff() {
let ev = scan_evidence("diff --git a/src/main.rs b/src/main.rs\n+ added").unwrap();
assert!(ev.starts_with("edit made:"));
}
#[test]
fn scan_finds_nothing() {
assert!(scan_evidence("still working on the feature, no results yet").is_none());
}