#![cfg(feature = "network")]
use nginx_discovery::{
network::{
check_all, check_port, check_ssl_certificate, resolve_hostname, HealthStatus,
NetworkCheckOptions,
},
parse,
};
use std::path::Path;
const SAMPLE_CONFIG: &str = r#"
http {
upstream backend {
server 127.0.0.1 59999;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
"#;
#[tokio::test]
async fn test_check_port_localhost() {
let result = check_port("127.0.0.1", 59999).await;
assert!(result.is_ok());
let check = result.unwrap();
assert_eq!(check.address, "127.0.0.1");
assert_eq!(check.port, 59999);
}
#[tokio::test]
async fn test_resolve_hostname_success() {
let result = resolve_hostname("localhost").await;
assert!(result.is_ok());
let check = result.unwrap();
assert_eq!(check.hostname, "localhost");
assert_eq!(check.status, HealthStatus::Healthy);
assert!(!check.addresses.is_empty());
}
#[tokio::test]
async fn test_resolve_hostname_failure() {
let result = resolve_hostname("invalid-host-12345.invalid").await;
assert!(result.is_ok());
let check = result.unwrap();
assert!(matches!(
check.status,
HealthStatus::Unhealthy | HealthStatus::Error
));
}
#[tokio::test]
async fn test_ssl_certificate_missing_file() {
let result = check_ssl_certificate(Path::new("/no/such/file.pem")).await;
assert!(result.is_ok());
let check = result.unwrap();
assert_eq!(check.status, HealthStatus::Error);
}
#[tokio::test]
async fn test_check_all_dns_only() {
let config = parse(SAMPLE_CONFIG).expect("config parse failed");
let options = NetworkCheckOptions {
check_upstreams: false,
check_ports: false,
check_ssl: false,
check_dns: true,
..Default::default()
};
let result = check_all(&config, options).await;
assert!(result.is_ok());
let checks = result.unwrap();
assert!(!checks.is_empty());
}
#[tokio::test]
async fn test_check_all_upstream_indirectly() {
let config = parse(SAMPLE_CONFIG).expect("config parse failed");
let options = NetworkCheckOptions {
check_upstreams: true,
check_ports: false,
check_ssl: false,
check_dns: false,
..Default::default()
};
let result = check_all(&config, options).await;
assert!(result.is_ok());
let checks = result.unwrap();
assert!(checks.is_empty());
}
#[test]
fn test_health_status_display() {
assert_eq!(HealthStatus::Healthy.to_string(), "HEALTHY");
assert_eq!(HealthStatus::Unhealthy.to_string(), "UNHEALTHY");
assert_eq!(HealthStatus::Degraded.to_string(), "DEGRADED");
assert_eq!(HealthStatus::Error.to_string(), "ERROR");
}