use clap::CommandFactory;
use clap_complete_rawline::complete_line;
use tempfile::TempDir;
use yb::Cli;
use yb_core::piv::virtual_piv::fixtures;
use yb_core::store::Store;
use yb_core::{store_blob, Compression, Encryption, PivBackend, StoreOptions, VirtualPiv};
const MGMT: &str = "010203040506070801020304050607080102030405060708";
fn complete(line: &str, word: &str, dir: &TempDir) -> Vec<String> {
complete_line(&mut Cli::command(), line, word, Some(dir.path())).unwrap()
}
#[test]
fn subcommands_and_options() {
let dir = TempDir::new().unwrap();
assert!(complete("yb fe", "fe", &dir).contains(&"fetch".to_owned()));
assert!(complete("yb store --no-c", "--no-c", &dir).contains(&"--no-compress".to_owned()));
}
#[test]
fn paths_blob_names_and_serial_numbers() {
let dir = TempDir::new().unwrap();
std::fs::write(dir.path().join("my file.txt"), b"x").unwrap();
std::fs::write(dir.path().join("a:b.txt"), b"x").unwrap();
std::fs::create_dir(dir.path().join("sub dir")).unwrap();
std::env::set_current_dir(dir.path()).unwrap();
assert_eq!(complete(r"yb store my\ f", r"my\ f", &dir), ["my file.txt"]);
assert_eq!(complete(r#"yb store "my f"#, "my f", &dir), ["my file.txt"]);
assert_eq!(complete("yb store a:", "", &dir), ["b.txt"]);
assert_eq!(complete(r"yb store sub\ d", r"sub\ d", &dir), ["sub dir/"]);
let piv = VirtualPiv::from_fixture_yaml(fixtures::WITH_KEY).unwrap();
let reader = piv.reader_name();
let mut store = Store::format(&reader, &piv, 8, 0x82, MGMT).unwrap();
let plain = || StoreOptions {
encryption: Encryption::None,
compression: Compression::None,
};
for name in ["alpha", "my secret"] {
store_blob(&mut store, &piv, name, b"x", plain(), MGMT, None).unwrap();
}
let fixture = dir.path().join("card.yaml");
piv.save_fixture(&fixture).unwrap();
std::env::set_var("YB_FIXTURE", &fixture);
let card_before = std::fs::read(&fixture).unwrap();
assert_eq!(complete("yb fetch al", "al", &dir), ["alpha"]);
assert_eq!(complete(r"yb fetch my\ s", r"my\ s", &dir), ["my secret"]);
assert_eq!(complete(r#"yb fetch "my s"#, "my s", &dir), ["my secret"]);
assert_eq!(complete("yb --serial=8", "8", &dir), ["88888888"]);
assert_eq!(complete("yb --serial ", "", &dir), ["88888888"]);
assert_eq!(std::fs::read(&fixture).unwrap(), card_before);
std::env::remove_var("YB_FIXTURE");
}