use std::path::PathBuf;
use clap::Parser;
use socket_patch_cli::commands::repair::RepairArgs;
use socket_patch_cli::{Cli, Commands};
fn parse_repair(extra: &[&str]) -> RepairArgs {
let mut argv = vec!["socket-patch", "repair"];
argv.extend_from_slice(extra);
let cli = Cli::try_parse_from(&argv).expect("parse");
match cli.command {
Commands::Repair(a) => a,
_ => panic!("expected Repair"),
}
}
fn parse_gc(extra: &[&str]) -> RepairArgs {
let mut argv = vec!["socket-patch", "gc"];
argv.extend_from_slice(extra);
let cli = Cli::try_parse_from(&argv).expect("parse");
match cli.command {
Commands::Repair(a) => a,
_ => panic!("expected Repair via gc alias"),
}
}
#[test]
fn repair_defaults_match_contract() {
let args = parse_repair(&[]);
assert_eq!(args.common.download_mode, "diff");
assert_eq!(args.common.cwd, PathBuf::from("."));
assert_eq!(args.common.manifest_path, ".socket/manifest.json");
assert!(!args.common.dry_run);
assert!(!args.common.offline);
assert!(!args.download_only);
assert!(!args.common.json);
}
#[test]
fn repair_dry_run_long_flag() {
let args = parse_repair(&["--dry-run"]);
assert!(args.common.dry_run);
}
#[test]
fn repair_manifest_path_long_flag() {
let args = parse_repair(&["--manifest-path", "custom.json"]);
assert_eq!(args.common.manifest_path, "custom.json");
}
#[test]
fn repair_cwd_flag() {
let args = parse_repair(&["--cwd", "/tmp/x"]);
assert_eq!(args.common.cwd, PathBuf::from("/tmp/x"));
}
#[test]
fn repair_offline_flag() {
let args = parse_repair(&["--offline"]);
assert!(args.common.offline);
}
#[test]
fn repair_download_only_flag() {
let args = parse_repair(&["--download-only"]);
assert!(args.download_only);
}
#[test]
fn repair_json_flag() {
let args = parse_repair(&["--json"]);
assert!(args.common.json);
}
#[test]
fn repair_download_mode_file() {
let args = parse_repair(&["--download-mode", "file"]);
assert_eq!(args.common.download_mode, "file");
}
#[test]
fn repair_download_mode_diff() {
let args = parse_repair(&["--download-mode", "diff"]);
assert_eq!(args.common.download_mode, "diff");
}
#[test]
fn repair_download_mode_package() {
let args = parse_repair(&["--download-mode", "package"]);
assert_eq!(args.common.download_mode, "package");
}
#[test]
fn repair_gc_alias_defaults_match_repair() {
let via_gc = parse_gc(&[]);
let via_repair = parse_repair(&[]);
assert_eq!(via_gc.common.download_mode, "diff");
assert_eq!(via_gc.common.download_mode, via_repair.common.download_mode);
assert_eq!(via_gc.common.cwd, via_repair.common.cwd);
assert_eq!(via_gc.common.manifest_path, via_repair.common.manifest_path);
assert_eq!(via_gc.common.dry_run, via_repair.common.dry_run);
assert_eq!(via_gc.common.offline, via_repair.common.offline);
assert_eq!(via_gc.download_only, via_repair.download_only);
assert_eq!(via_gc.common.json, via_repair.common.json);
}
#[test]
fn repair_gc_alias_accepts_flags() {
let args = parse_gc(&["--dry-run"]);
assert!(args.common.dry_run);
}
#[test]
fn repair_unknown_flag_is_unknown_argument_error() {
let err = match Cli::try_parse_from(["socket-patch", "repair", "--nope"]) {
Ok(_) => panic!("unknown flag should fail to parse"),
Err(e) => e,
};
assert_eq!(err.kind(), clap::error::ErrorKind::UnknownArgument);
}
fn top_level_help() -> String {
match Cli::try_parse_from(["socket-patch", "--help"]) {
Ok(_) => panic!("--help should return a clap error (DisplayHelp)"),
Err(e) => format!("{e}"),
}
}
#[test]
fn repair_appears_in_top_level_help() {
let help = top_level_help();
assert!(
help.lines().any(|l| l.trim_start().starts_with("repair ")
|| l.trim_start().starts_with("repair\t")),
"`repair` must be listed in --help output:\n{help}"
);
}
#[test]
fn gc_alias_is_visible_in_top_level_help() {
let help = top_level_help();
assert!(
help.contains("[aliases: gc]") || help.contains("[alias: gc]"),
"`gc` visible alias must be listed in --help output:\n{help}"
);
}
#[test]
fn gc_alias_parses_as_repair() {
match Cli::try_parse_from(["socket-patch", "gc"]) {
Ok(cli) => assert!(
matches!(cli.command, Commands::Repair(_)),
"gc should resolve to Repair"
),
Err(e) => panic!("gc alias should parse: {e}"),
}
}