use std::collections::{BTreeMap, BTreeSet};
use std::path::Path;
use brazen::{AmbientSpec, Args, Cred, CredStore, EnvSnapshot, ProvidersIo};
use crate::config::per_repo_providers::PerRepoProviders;
struct NullCredStore;
impl CredStore for NullCredStore {
fn get(&self, _provider: &str) -> Option<Cred> {
None
}
fn put(&self, _provider: &str, _cred: &Cred) -> std::io::Result<()> {
Ok(())
}
fn discover(&self, _spec: &AmbientSpec) -> Option<Cred> {
None
}
}
fn brazen_builtin_provider_names() -> BTreeSet<String> {
let config_home = tempfile::tempdir().unwrap();
let mut env = BTreeMap::new();
env.insert(
"XDG_CONFIG_HOME".to_string(),
config_home.path().to_string_lossy().into_owned(),
);
env.insert("BRAZEN_OUTPUT".to_string(), "ndjson".to_string());
let args = Args {
argv: Vec::new(),
env: EnvSnapshot(env),
tty: false,
stdout_tty: false,
};
let mut stdout = Vec::new();
let mut stderr = Vec::new();
let mut io = ProvidersIo {
stdout: &mut stdout,
stderr: &mut stderr,
store: &NullCredStore,
};
let code = brazen::list_providers(&args, &mut io);
assert_eq!(
code,
0,
"brazen --list-providers over an empty config root failed: {}",
String::from_utf8_lossy(&stderr)
);
let doc: serde_json::Value =
serde_json::from_slice(&stdout).expect("list-providers json output");
doc["providers"]
.as_array()
.expect("a providers array")
.iter()
.map(|row| row["name"].as_str().expect("row has a name").to_owned())
.collect()
}
fn seeded_role_providers() -> Vec<String> {
let raw = crate::template::TEMPLATE
.get_file("providers.yaml")
.expect("template ships providers.yaml")
.contents_utf8()
.expect("providers.yaml is UTF-8");
let per_repo = PerRepoProviders::parse(raw, Path::new("template/providers.yaml")).unwrap();
per_repo
.roles
.values()
.map(|a| a.provider.clone())
.collect()
}
#[test]
fn seeded_providers_yaml_names_only_real_brazen_providers() {
let known = brazen_builtin_provider_names();
for provider in seeded_role_providers() {
assert!(
known.contains(&provider),
"template/providers.yaml names provider {provider:?}, which brazen's \
pinned built-in table does not resolve (known rows: {known:?})"
);
}
}