#![cfg(feature = "integration")]
#![allow(clippy::too_many_lines)]
mod common;
use common::aperture_cmd;
use predicates::prelude::*;
use tempfile::TempDir;
#[test]
fn test_config_settings_lists_all() {
let temp_dir = TempDir::new().unwrap();
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "settings"])
.assert()
.success()
.stdout(predicate::str::contains("default_timeout_secs"))
.stdout(predicate::str::contains("agent_defaults.json_errors"))
.stdout(predicate::str::contains("Type: integer"))
.stdout(predicate::str::contains("Type: boolean"));
}
#[test]
fn test_config_settings_json_output() {
let temp_dir = TempDir::new().unwrap();
let output = aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "settings", "--json"])
.assert()
.success();
let stdout = String::from_utf8_lossy(&output.get_output().stdout);
let parsed: serde_json::Value = serde_json::from_str(&stdout).expect("Should be valid JSON");
assert!(parsed.is_array());
let settings = parsed.as_array().unwrap();
assert_eq!(settings.len(), 5);
let first = &settings[0];
assert!(first.get("key").is_some());
assert!(first.get("value").is_some());
assert!(first.get("type").is_some());
assert!(first.get("description").is_some());
assert!(first.get("default").is_some());
}
#[test]
fn test_config_get_default_value() {
let temp_dir = TempDir::new().unwrap();
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "get", "default_timeout_secs"])
.assert()
.success()
.stdout(predicate::str::contains("30"));
}
#[test]
fn test_config_get_json_output() {
let temp_dir = TempDir::new().unwrap();
let output = aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "get", "default_timeout_secs", "--json"])
.assert()
.success();
let stdout = String::from_utf8_lossy(&output.get_output().stdout);
let parsed: serde_json::Value = serde_json::from_str(&stdout).expect("Should be valid JSON");
assert_eq!(parsed["key"], "default_timeout_secs");
assert_eq!(parsed["value"], "30");
}
#[test]
fn test_config_set_get_roundtrip() {
let temp_dir = TempDir::new().unwrap();
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "set", "default_timeout_secs", "120"])
.assert()
.success()
.stdout(predicate::str::contains("Set default_timeout_secs = 120"));
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "get", "default_timeout_secs"])
.assert()
.success()
.stdout(predicate::str::contains("120"));
}
#[test]
fn test_config_set_nested_key() {
let temp_dir = TempDir::new().unwrap();
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "set", "agent_defaults.json_errors", "true"])
.assert()
.success()
.stdout(predicate::str::contains(
"Set agent_defaults.json_errors = true",
));
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "get", "agent_defaults.json_errors"])
.assert()
.success()
.stdout(predicate::str::contains("true"));
}
#[test]
fn test_config_get_invalid_key_error() {
let temp_dir = TempDir::new().unwrap();
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "get", "nonexistent_key"])
.assert()
.failure()
.stderr(predicate::str::contains("Unknown setting key"))
.stderr(predicate::str::contains("aperture config settings"));
}
#[test]
fn test_config_set_invalid_value_error() {
let temp_dir = TempDir::new().unwrap();
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "set", "default_timeout_secs", "not_a_number"])
.assert()
.failure()
.stderr(predicate::str::contains("Invalid value"))
.stderr(predicate::str::contains("expected integer"));
}
#[test]
fn test_settings_persistence() {
let temp_dir = TempDir::new().unwrap();
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "set", "default_timeout_secs", "45"])
.assert()
.success();
aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "set", "agent_defaults.json_errors", "true"])
.assert()
.success();
let output = aperture_cmd()
.env("APERTURE_CONFIG_DIR", temp_dir.path())
.args(["config", "settings", "--json"])
.assert()
.success();
let stdout = String::from_utf8_lossy(&output.get_output().stdout);
let parsed: serde_json::Value = serde_json::from_str(&stdout).expect("Should be valid JSON");
let settings = parsed.as_array().unwrap();
let timeout = settings
.iter()
.find(|s| s["key"] == "default_timeout_secs")
.unwrap();
assert_eq!(timeout["value"], "45");
let json_errors = settings
.iter()
.find(|s| s["key"] == "agent_defaults.json_errors")
.unwrap();
assert_eq!(json_errors["value"], "true");
}