1 //! CLI-level test: `hu13 build` on a repo without `.forge/` exits 0.2 3 use std::sync::atomic::{AtomicU64, Ordering};4 5 static SEQ: AtomicU64 = AtomicU64::new(0);6 7 use std::path::{Path, PathBuf};8 use std::process::Command;9 10 fn git(repo: &Path, args: &[&str]) {11 let st = Command::new("git")12 .arg("-C")13 .arg(repo)14 .args(args)15 .status()16 .expect("spawn git");17 assert!(st.success(), "git {args:?} failed");18 }19 20 #[test]21 fn unknown_subcommand_exits_two() {22 let out = Command::new(env!("CARGO_BIN_EXE_hu13"))23 .arg("nope")24 .output()25 .expect("spawn hu13");26 assert_eq!(out.status.code(), Some(2), "unknown subcommand is an error");27 let stderr = String::from_utf8_lossy(&out.stderr);28 assert!(stderr.contains("unknown subcommand 'nope'"), "{stderr}");29 }30 31 #[test]32 fn build_no_forge_repo_exits_zero() {33 let dir = std::env::temp_dir().join(format!(34 "hu13-cli-noforge-{}-{}",35 std::process::id(),36 std::time::SystemTime::now()37 .duration_since(std::time::UNIX_EPOCH)38 .map(|d| d.as_nanos())39 .unwrap_or(0)40 .wrapping_add(u128::from(SEQ.fetch_add(1, Ordering::Relaxed)))41 ));42 std::fs::create_dir_all(&dir).unwrap();43 git(&dir, &["init", "-b", "main"]);44 git(&dir, &["config", "user.name", "hu13-test"]);45 git(&dir, &["config", "user.email", "[email protected]"]);46 git(&dir, &["config", "commit.gpgsign", "false"]);47 std::fs::write(dir.join("README.md"), "# cli fixture\n").unwrap();48 std::fs::write(dir.join("hello.txt"), "hello\n").unwrap();49 git(&dir, &["add", "-A"]);50 git(&dir, &["commit", "-m", "init"]);51 assert!(!dir.join(".forge").exists());52 53 let out: PathBuf = dir.join("..").join(format!(54 "hu13-cli-out-{}-{}",55 std::process::id(),56 std::time::SystemTime::now()57 .duration_since(std::time::UNIX_EPOCH)58 .map(|d| d.as_nanos())59 .unwrap_or(1)60 .wrapping_add(u128::from(SEQ.fetch_add(1, Ordering::Relaxed)))61 ));62 let bin = env!("CARGO_BIN_EXE_hu13");63 let st = Command::new(bin)64 .arg("build")65 .arg(&dir)66 .arg("-o")67 .arg(&out)68 .status()69 .expect("spawn hu13");70 assert!(st.success(), "no-forge build exits 0, got {st}");71 assert!(out.join("index.html").exists());72 assert!(out.join("raw").join("README.md").exists());73 }