use confgr::prelude::*;
use std::{env, fs::File, io::Write};
#[derive(Config, Default)]
#[config(env_path = "CONFIG_ENV_PATH", path = "tests/common/path.toml")]
struct TestPathEnvAndValidPath {
name: String,
}
#[derive(Config, Default)]
#[config(env_path = "CONFIG_ENV_PATH", path = "nonexistent.toml")]
struct TestPathEnvAndInvalidPath {
name: String,
}
#[derive(Config, Default)]
#[config(env_path = "CONFIG_ENV_PATH", default_path = "test.toml")]
struct TestPathEnvWithDefault {
name: String,
}
#[derive(Config, Default)]
#[config(env_path = "CONFIG_ENV_PATH")]
struct TestPathEnv {
name: String,
}
#[derive(Config, Default)]
#[config(default_path = "tests/common/default.toml")]
struct TestDefaultPathValid {
name: String,
}
#[derive(Config, Default)]
#[config(default_path = "nonexistent.toml")]
struct TestDefaultPathInvalid {
name: String,
}
fn setup_files(file_name: &str, contents: &str) {
let mut file = File::create(file_name).expect("Failed to create file");
writeln!(file, "{}", contents).expect("Failed to write to file");
}
fn cleanup_file(file_name: &str) {
std::fs::remove_file(file_name).expect("Failed to delete file");
}
#[test]
fn test_env_path_valid() {
setup_files("tests/common/env_path.toml", r#"name = "EnvPath""#);
env::set_var("CONFIG_ENV_PATH", "tests/common/env_path.toml");
let config = TestPathEnvAndValidPath::load_config();
assert_eq!(config.name, "EnvPath");
cleanup_env_and_files("CONFIG_ENV_PATH", "tests/common/env_path.toml");
}
#[test]
fn test_invalid_env_path_continues_with_valid_path() {
setup_files("tests/common/path.toml", r#"name = "Path""#);
env::set_var("CONFIG_ENV_PATH", "nonexistent_path.toml");
let config = TestPathEnvAndValidPath::load_config();
assert_eq!(config.name, "Path");
cleanup_env_and_files("CONFIG_ENV_PATH", "tests/common/path.toml");
}
#[test]
#[should_panic]
fn test_invalid_env_path_fails_with_invalid_path() {
env::set_var("CONFIG_ENV_PATH", "nonexistent_path.toml");
let _config = TestPathEnvAndInvalidPath::load_config();
env::remove_var("CONFIG_ENV_PATH");
}
#[test]
fn test_default_path_valid() {
setup_files("tests/common/default.toml", r#"name = "DefaultPath""#);
let config = TestDefaultPathValid::load_config();
println!("{:?}", TestDefaultPathValid::get_file_path());
assert_eq!(config.name, "DefaultPath");
cleanup_file("tests/common/default.toml");
}
#[test]
fn test_default_path_invalid() {
let config = TestDefaultPathInvalid::load_config();
assert_eq!(config.name, "");
}
#[test]
fn test_env_path_with_default_path() {
setup_files("tests/common/path.toml", r#"name = "DefaultPath""#);
env::set_var("CONFIG_ENV_PATH", "nonexistent_path.toml");
let config = TestPathEnv::load_config();
assert_eq!(config.name, "");
cleanup_env_and_files("CONFIG_ENV_PATH", "tests/common/path.toml");
}
fn cleanup_env_and_files(env_var: &str, file_path: &str) {
env::remove_var(env_var);
cleanup_file(file_path);
}