use config::{Config, File};
use std::sync::OnceLock;
use tracing::instrument;
#[instrument]
pub fn load_env() {
static INIT: OnceLock<()> = OnceLock::new();
INIT.get_or_init(|| {
dotenvy::dotenv().ok();
});
}
#[instrument]
pub fn api_key() -> anyhow::Result<String> {
use anyhow::Context;
load_env();
let settings = Config::builder()
.add_source(File::with_name("config/test-tiers"))
.build()
.context("Failed to load config/test-tiers.toml")?;
let tier = active_tier();
tracing::debug!(tier = %tier, "Detected active test tier");
let env_var_key = format!("tiers.{}.env_var", tier);
let env_var_name = settings
.get_string(&env_var_key)
.with_context(|| format!("No env_var configured for tier: {}", tier))?;
tracing::debug!(
env_var = %env_var_name,
tier = %tier,
"Looking up API key from environment"
);
std::env::var(&env_var_name).with_context(|| {
format!(
"Environment variable {} not found (required for tier: {}). \
Add to .env file or set in environment.",
env_var_name, tier
)
})
}
fn active_tier() -> &'static str {
if cfg!(feature = "test-public") {
"public"
} else if cfg!(feature = "test-location") {
"location"
} else if cfg!(feature = "test-content") {
"content"
} else if cfg!(feature = "test-features") {
"features"
} else {
"public" }
}
#[instrument]
pub fn init_tracing() {
use tracing_subscriber::EnvFilter;
static INIT: OnceLock<()> = OnceLock::new();
INIT.get_or_init(|| {
load_env();
let log_level = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_string());
let env_filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(log_level));
tracing_subscriber::fmt()
.with_env_filter(env_filter)
.with_test_writer()
.with_target(true)
.with_thread_ids(true)
.with_line_number(true)
.init();
});
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_env_loading() {
init_tracing();
load_env();
}
#[test]
fn test_api_key_helper() {
init_tracing();
let result = api_key();
tracing::debug!(
has_key = result.is_ok(),
tier = active_tier(),
"API key lookup completed"
);
}
}