use amp_rs::client::{ApiClient, MockTokenStrategy, TokenEnvironment, TokenStrategy};
use serial_test::serial;
use std::env;
use url::Url;
async fn setup_mock_test() {
let _ = ApiClient::force_cleanup_token_files().await;
env::set_var("AMP_USERNAME", "mock_user");
env::set_var("AMP_PASSWORD", "mock_pass");
env::remove_var("AMP_TESTS"); env::remove_var("AMP_TOKEN_PERSISTENCE");
tracing::debug!("Mock test environment setup complete");
}
async fn cleanup_mock_test() {
let _ = ApiClient::force_cleanup_token_files().await;
dotenvy::from_filename_override(".env").ok();
tracing::debug!("Mock test environment cleanup complete");
}
async fn setup_live_test() {
dotenvy::from_filename_override(".env").ok();
env::set_var("AMP_TESTS", "live");
env::set_var("AMP_TOKEN_PERSISTENCE", "true");
tracing::debug!("Live test environment setup complete");
}
#[tokio::test]
#[serial]
async fn test_api_client_with_mock_strategy() {
setup_mock_test().await;
let base_url = Url::parse("http://localhost:8080").unwrap();
let mock_token = "test_mock_token_123".to_string();
let client = ApiClient::with_mock_token(base_url.clone(), mock_token.clone())
.expect("Failed to create ApiClient with mock token");
assert_eq!(client.get_strategy_type(), "mock");
assert!(!client.should_persist_tokens());
let token = client.get_token().await.expect("Failed to get mock token");
assert_eq!(token, mock_token);
let token2 = client
.get_token()
.await
.expect("Failed to get mock token again");
assert_eq!(token2, mock_token);
client
.clear_token()
.await
.expect("Failed to clear mock token");
let token3 = client
.get_token()
.await
.expect("Failed to get mock token after clear");
assert_eq!(token3, mock_token);
cleanup_mock_test().await;
}
#[tokio::test]
#[serial]
async fn test_api_client_automatic_strategy_selection_mock() {
setup_mock_test().await;
env::set_var("AMP_API_BASE_URL", "http://localhost:8080");
let client = ApiClient::new().await.expect("Failed to create ApiClient");
assert_eq!(client.get_strategy_type(), "mock");
assert!(!client.should_persist_tokens());
cleanup_mock_test().await;
}
#[tokio::test]
#[serial]
async fn test_api_client_with_live_strategy() {
setup_live_test().await;
if env::var("AMP_USERNAME").unwrap_or_default().is_empty()
|| env::var("AMP_PASSWORD").unwrap_or_default().is_empty()
{
println!("Skipping live strategy test - no credentials available");
return;
}
let client = ApiClient::new().await.expect("Failed to create ApiClient");
assert_eq!(client.get_strategy_type(), "live");
assert!(client.should_persist_tokens());
}
#[tokio::test]
#[serial]
async fn test_token_environment_detection() {
env::set_var("AMP_USERNAME", "mock_user");
env::set_var("AMP_PASSWORD", "mock_pass");
env::remove_var("AMP_TESTS");
let env_mock = TokenEnvironment::detect();
assert_eq!(env_mock, TokenEnvironment::Mock);
assert!(env_mock.is_mock());
assert!(!env_mock.is_live());
assert!(!env_mock.should_persist_tokens());
env::set_var("AMP_USERNAME", "real_user");
env::set_var("AMP_PASSWORD", "real_pass");
env::set_var("AMP_TESTS", "live");
let env_live = TokenEnvironment::detect();
assert_eq!(env_live, TokenEnvironment::Live);
assert!(!env_live.is_mock());
assert!(env_live.is_live());
assert!(env_live.should_persist_tokens());
env::set_var("AMP_USERNAME", "user");
env::set_var("AMP_PASSWORD", "pass");
env::set_var("AMP_API_BASE_URL", "http://localhost:8080");
env::remove_var("AMP_TESTS");
let env_mock_url = TokenEnvironment::detect();
assert_eq!(env_mock_url, TokenEnvironment::Mock);
env::remove_var("AMP_USERNAME");
env::remove_var("AMP_PASSWORD");
env::remove_var("AMP_TESTS");
env::remove_var("AMP_API_BASE_URL");
}
#[tokio::test]
#[serial]
async fn test_strategy_creation() {
let mock_strategy = TokenEnvironment::Mock
.create_strategy(Some("test_token".to_string()))
.await
.expect("Failed to create mock strategy");
assert_eq!(mock_strategy.strategy_type(), "mock");
assert!(!mock_strategy.should_persist());
let token = mock_strategy
.get_token()
.await
.expect("Failed to get token from mock strategy");
assert_eq!(token, "test_token");
env::set_var("AMP_USERNAME", "mock_user");
env::set_var("AMP_PASSWORD", "mock_pass");
env::remove_var("AMP_TESTS");
let auto_strategy = TokenEnvironment::create_auto_strategy(Some("auto_test_token".to_string()))
.await
.expect("Failed to create auto strategy");
assert_eq!(auto_strategy.strategy_type(), "mock");
let auto_token = auto_strategy
.get_token()
.await
.expect("Failed to get token from auto strategy");
assert_eq!(auto_token, "auto_test_token");
env::remove_var("AMP_USERNAME");
env::remove_var("AMP_PASSWORD");
}
#[tokio::test]
#[serial]
async fn test_api_client_strategy_methods() {
setup_mock_test().await;
let base_url = Url::parse("http://localhost:8080").unwrap();
let client = ApiClient::with_mock_token(base_url, "test_token".to_string())
.expect("Failed to create ApiClient");
assert_eq!(client.get_strategy_type(), "mock");
assert!(!client.should_persist_tokens());
let refreshed_token = client
.force_refresh()
.await
.expect("Failed to force refresh");
assert_eq!(refreshed_token, "test_token");
cleanup_mock_test().await;
}
#[tokio::test]
async fn test_api_client_force_cleanup() {
ApiClient::force_cleanup_token_files()
.await
.expect("Failed to force cleanup token files");
ApiClient::force_cleanup_token_files()
.await
.expect("Failed to force cleanup token files again");
}
#[tokio::test]
async fn test_mock_strategy_isolation() {
let strategy1 = MockTokenStrategy::new("token1".to_string());
let strategy2 = MockTokenStrategy::new("token2".to_string());
let token1 = strategy1.get_token().await.expect("Failed to get token1");
let token2 = strategy2.get_token().await.expect("Failed to get token2");
assert_eq!(token1, "token1");
assert_eq!(token2, "token2");
assert_ne!(token1, token2);
strategy1
.clear_token()
.await
.expect("Failed to clear token1");
let token1_after_clear = strategy1
.get_token()
.await
.expect("Failed to get token1 after clear");
let token2_after_clear = strategy2
.get_token()
.await
.expect("Failed to get token2 after clear");
assert_eq!(token1_after_clear, "token1"); assert_eq!(token2_after_clear, "token2"); }