#![ cfg( feature = "secure" ) ]
use std ::fs;
use workspace_tools ::testing;
use secrecy ::ExposeSecret;
#[ test ]
#[ cfg( feature = "secure" ) ]
fn test_load_secrets_secure_basic()
{
let ( _temp_dir, workspace ) = testing ::create_test_workspace_with_structure();
let secret_content = "API_KEY=secret-key-123\nDATABASE_URL=postgresql: //localhost/testdb";
let secret_file = workspace.secret_file( "-test-secure.env" );
fs ::write( &secret_file, secret_content ).unwrap();
let secrets = workspace.load_secrets_secure( "-test-secure.env" ).unwrap();
assert!( secrets.contains_key( "API_KEY" ) );
assert!( secrets.contains_key( "DATABASE_URL" ) );
assert_eq!( secrets.len(), 2 );
let api_key = secrets.get( "API_KEY" ).unwrap();
assert_eq!( api_key.expose_secret(), "secret-key-123" );
let db_url = secrets.get( "DATABASE_URL" ).unwrap();
assert_eq!( db_url.expose_secret(), "postgresql: //localhost/testdb" );
}
#[ test ]
#[ cfg( feature = "secure" ) ]
fn test_load_secret_key_secure()
{
let ( _temp_dir, workspace ) = testing ::create_test_workspace_with_structure();
let secret_content = "TOKEN=secure-token-456\nPASSWORD=super-secret";
let secret_file = workspace.secret_file( "-key-test.env" );
fs ::write( &secret_file, secret_content ).unwrap();
let token = workspace.load_secret_key_secure( "TOKEN", "-key-test.env" ).unwrap();
assert_eq!( token.expose_secret(), "secure-token-456" );
let result = workspace.load_secret_key_secure( "NONEXISTENT", "-key-test.env" );
assert!( result.is_err() );
}
#[ test ]
#[ cfg( feature = "secure" ) ]
fn test_env_secret()
{
let ( _temp_dir, workspace ) = testing ::create_test_workspace_with_structure();
std ::env ::set_var( "TEST_SECRET_ENV", "env-secret-value" );
let env_secret = workspace.env_secret( "TEST_SECRET_ENV" ).unwrap();
assert_eq!( env_secret.expose_secret(), "env-secret-value" );
let missing = workspace.env_secret( "MISSING_ENV_VAR" );
assert!( missing.is_none() );
std ::env ::remove_var( "TEST_SECRET_ENV" );
}
#[ test ]
#[ cfg( feature = "secure" ) ]
fn test_load_secret_key_secure_with_env_fallback()
{
let ( _temp_dir, workspace ) = testing ::create_test_workspace_with_structure();
std ::env ::set_var( "FALLBACK_SECRET", "fallback-value" );
let secret = workspace.load_secret_key_secure( "FALLBACK_SECRET", "-missing-file.env" ).unwrap();
assert_eq!( secret.expose_secret(), "fallback-value" );
std ::env ::remove_var( "FALLBACK_SECRET" );
}
#[ test ]
#[ cfg( feature = "secure" ) ]
fn test_secure_and_regular_api_compatibility()
{
let ( _temp_dir, workspace ) = testing ::create_test_workspace_with_structure();
let secret_content = "COMPAT_KEY=compatibility-test";
let secret_file = workspace.secret_file( "-compat-test.env" );
fs ::write( &secret_file, secret_content ).unwrap();
let regular_secrets = workspace.load_secrets_from_file( "-compat-test.env" ).unwrap();
let secure_secrets = workspace.load_secrets_secure( "-compat-test.env" ).unwrap();
assert!( regular_secrets.contains_key( "COMPAT_KEY" ) );
assert!( secure_secrets.contains_key( "COMPAT_KEY" ) );
let regular_value = regular_secrets.get( "COMPAT_KEY" ).unwrap();
let secure_value = secure_secrets.get( "COMPAT_KEY" ).unwrap();
assert_eq!( regular_value, secure_value.expose_secret() );
}
#[ test ]
#[ cfg( feature = "secure" ) ]
fn test_secure_loading_with_export_format()
{
let ( _temp_dir, workspace ) = testing ::create_test_workspace_with_structure();
let secret_content = r#"
export SECURE_API_KEY="exported-secret-123"
REGULAR_KEY=regular-value
export DATABASE_PASSWORD='quoted-password'
"#;
let secret_file = workspace.secret_file( "-export-test.env" );
fs ::write( &secret_file, secret_content ).unwrap();
let secrets = workspace.load_secrets_secure( "-export-test.env" ).unwrap();
assert_eq!( secrets.len(), 3 );
assert_eq!( secrets.get( "SECURE_API_KEY" ).unwrap().expose_secret(), "exported-secret-123" );
assert_eq!( secrets.get( "REGULAR_KEY" ).unwrap().expose_secret(), "regular-value" );
assert_eq!( secrets.get( "DATABASE_PASSWORD" ).unwrap().expose_secret(), "quoted-password" );
}
#[ test ]
#[ cfg( feature = "secure" ) ]
fn test_secret_string_debug_safety()
{
let ( _temp_dir, workspace ) = testing ::create_test_workspace_with_structure();
let secret_content = "DEBUG_TEST=sensitive-data";
let secret_file = workspace.secret_file( "-debug-test.env" );
fs ::write( &secret_file, secret_content ).unwrap();
let secrets = workspace.load_secrets_secure( "-debug-test.env" ).unwrap();
let secret = secrets.get( "DEBUG_TEST" ).unwrap();
let debug_output = format!( "{secret:?}" );
assert!( !debug_output.contains( "sensitive-data" ) );
assert_eq!( secret.expose_secret(), "sensitive-data" );
}
#[ test ]
#[ cfg( feature = "secure" ) ]
fn test_secure_error_handling()
{
let ( _temp_dir, workspace ) = testing ::create_test_workspace_with_structure();
let result = workspace.load_secrets_secure( "-nonexistent.env" );
assert!( result.is_err() ); let error_msg = result.unwrap_err().to_string();
assert!( error_msg.contains( "not found" ) );
let result = workspace.load_secret_key_secure( "MISSING_KEY", "-nonexistent.env" );
assert!( result.is_err() );
}