use clap::Parser;
use netspeed_cli::cli::CliArgs;
use netspeed_cli::config::Config;
use netspeed_cli::servers::ping_test;
use netspeed_cli::types::Server;
use reqwest::Client;
use wiremock::matchers::{method, path};
use wiremock::{Mock, MockServer, ResponseTemplate};
#[tokio::test]
async fn test_fetch_servers_mocked() {
let mock_server = MockServer::start().await;
let xml_response = r#"
<settings>
<servers>
<server url="http://localhost/upload.php" lat="40.7128" lon="-74.0060" name="New York, NY" country="United States" sponsor="Mock ISP" id="1234" />
</servers>
</settings>
"#;
Mock::given(method("GET"))
.respond_with(ResponseTemplate::new(200).set_body_string(xml_response))
.mount(&mock_server)
.await;
let _client = Client::new();
let args = CliArgs::parse_from(["netspeed-cli"]);
let _config = Config::from_args(&args);
}
#[tokio::test]
async fn test_ping_test_mocked() {
let mock_server = MockServer::start().await;
Mock::given(method("GET"))
.and(path("/latency.txt"))
.respond_with(ResponseTemplate::new(200).set_body_string("test"))
.mount(&mock_server)
.await;
let client = Client::new();
let server = Server {
id: "1".to_string(),
url: mock_server.uri(),
name: "Mock Server".to_string(),
sponsor: "Mock ISP".to_string(),
country: "US".to_string(),
lat: 0.0,
lon: 0.0,
distance: 0.0,
latency: 0.0,
};
let result = ping_test(&client, &server).await;
assert!(result.is_ok());
let (ping, _jitter) = result.unwrap();
assert!(ping > 0.0);
}
#[tokio::test]
async fn test_ping_test_failure_mocked() {
let mock_server = MockServer::start().await;
Mock::given(method("GET"))
.and(path("/latency.txt"))
.respond_with(ResponseTemplate::new(500))
.mount(&mock_server)
.await;
let client = Client::new();
let server = Server {
id: "1".to_string(),
url: mock_server.uri(),
name: "Mock Server".to_string(),
sponsor: "Mock ISP".to_string(),
country: "US".to_string(),
lat: 0.0,
lon: 0.0,
distance: 0.0,
latency: 0.0,
};
let result = ping_test(&client, &server).await;
assert!(result.is_err());
}