use super::super::*;
use super::fixtures::{StubSpawner, env, fake_repo, input_for};
use std::io::Cursor;
#[test]
fn happy_path_writes_handle_json_and_forwards_args() {
let (_h, repo) = fake_repo("worker");
let mut stdin = Cursor::new(input_for("worker", "do the thing"));
let mut stdout = Vec::new();
let env = env(&repo, "p1-conv");
let spawner = StubSpawner::ok("p1-conv-ct9-feedface");
run(&mut stdin, &mut stdout, &env, &spawner).unwrap();
let payload: serde_json::Value = serde_json::from_slice(&stdout).unwrap();
assert_eq!(payload["status"], "in_progress");
assert_eq!(payload["handle"], "p1-conv-ct9-feedface");
let invocations = spawner.invocations.borrow();
assert_eq!(invocations.len(), 1);
assert_eq!(invocations[0].0, "worker");
assert_eq!(invocations[0].1, repo);
assert_eq!(invocations[0].2, "p1-conv");
assert_eq!(invocations[0].3, "do the thing");
}
#[test]
fn handle_is_trimmed_of_trailing_whitespace() {
let (_h, repo) = fake_repo("worker");
let mut stdin = Cursor::new(input_for("worker", "g"));
let mut stdout = Vec::new();
let env = env(&repo, "p1");
let spawner = StubSpawner::ok("p1-sub ");
run(&mut stdin, &mut stdout, &env, &spawner).unwrap();
let payload: serde_json::Value = serde_json::from_slice(&stdout).unwrap();
assert_eq!(payload["handle"], "p1-sub");
}
#[test]
fn process_env_reads_live_var() {
let p = ProcessEnv;
assert!(p.get("PATH").is_some());
assert!(p.get("DEFINITELY_NOT_SET_LERNIE_TEST_VAR_xxxxx").is_none());
}
#[test]
fn subprocess_spawner_with_exe_returns_captured_output() {
let s = SubprocessSpawner::with_exe(PathBuf::from("true"));
let out = s
.dispatch("worker", Path::new("/tmp"), "p1", "g")
.expect("true exits cleanly");
assert_eq!(out.exit, 0);
assert!(out.stdout.is_empty());
assert!(out.stderr.is_empty());
}
#[test]
fn subprocess_spawner_with_exe_returns_nonzero_for_failing_binary() {
let s = SubprocessSpawner::with_exe(PathBuf::from("false"));
let out = s
.dispatch("worker", Path::new("/tmp"), "p1", "g")
.expect("false runs");
assert_eq!(out.exit, 1);
}
#[test]
fn subprocess_spawner_with_exe_surfaces_spawn_error_for_missing_binary() {
let s = SubprocessSpawner::with_exe(PathBuf::from("/no/such/lernie-binary"));
let err = s
.dispatch("worker", Path::new("/tmp"), "p1", "g")
.unwrap_err();
assert_eq!(err.kind(), io::ErrorKind::NotFound);
}