use super::*;
use crate::delivery::Repo;
use crate::delivery_repo::tests::project;
use std::fs;
#[test]
fn deliver_leaves_the_owning_checkout_clean_not_phantom_staged() {
let (tmp, root, p) = project();
let wt = tmp.path().join("wt");
p.materialize(&wt, "work/bl-x").unwrap();
fs::write(wt.join("feature.txt"), "shipped\n").unwrap();
p.deliver(&wt, "work/bl-x", "main", "Add feature [bl-x]", "[bl-x]").unwrap();
assert_eq!(Project::run(&root, &["status", "--porcelain"]).unwrap(), "");
assert_eq!(fs::read_to_string(root.join("feature.txt")).unwrap(), "shipped\n");
let reflog = Project::run(&root, &["reflog", "main"]).unwrap();
assert!(reflog.lines().next().unwrap().contains("Add feature [bl-x]"), "reflog: {reflog}");
}
#[test]
fn reconcile_is_idempotent_and_never_clobbers_a_real_edit() {
let (tmp, root, p) = project();
let wt = tmp.path().join("wt");
p.materialize(&wt, "work/bl-x").unwrap();
fs::write(wt.join("feature.txt"), "shipped\n").unwrap();
p.deliver(&wt, "work/bl-x", "main", "Add feature [bl-x]", "[bl-x]").unwrap();
p.reconcile("main").unwrap();
assert_eq!(Project::run(&root, &["status", "--porcelain"]).unwrap(), "");
fs::write(root.join("feature.txt"), "local edit\n").unwrap();
p.reconcile("main").unwrap();
assert_eq!(fs::read_to_string(root.join("feature.txt")).unwrap(), "local edit\n");
}
#[test]
fn reconcile_refuses_a_phantom_checkout_carrying_a_real_edit() {
let (_tmp, root, p) = project();
let g = |args: &[&str]| Project::run(&root, args).unwrap();
let c0 = g(&["rev-parse", "HEAD"]).trim().to_string();
fs::write(root.join("feature.txt"), "shipped\n").unwrap();
g(&["add", "-A"]);
let tree = g(&["write-tree"]).trim().to_string();
g(&["reset", "--hard", &c0]);
let c1 = g(&["commit-tree", &tree, "-p", &c0, "-m", "Add feature [bl-x]"]).trim().to_string();
g(&["update-ref", "main", &c1]);
fs::write(root.join("seed.txt"), "tampered\n").unwrap();
p.reconcile("main").unwrap();
assert_eq!(fs::read_to_string(root.join("seed.txt")).unwrap(), "tampered\n"); assert!(!root.join("feature.txt").exists()); }
#[test]
fn checkouts_on_returns_only_the_branch_owners() {
let (tmp, root, p) = project();
let wt = tmp.path().join("wt");
p.materialize(&wt, "work/bl-x").unwrap();
let owners = p.checkouts_on("main").unwrap();
assert_eq!(owners.len(), 1);
assert_eq!(owners[0].canonicalize().unwrap(), root.canonicalize().unwrap());
let work = p.checkouts_on("work/bl-x").unwrap();
assert_eq!(work.len(), 1);
assert_eq!(work[0].canonicalize().unwrap(), wt.canonicalize().unwrap());
}