fix(tests): add comprehensive unit and async tests across Rust crates and TypeScript runtime
This commit is contained in:
@@ -544,6 +544,186 @@ async fn handle_client_connection(
|
||||
let _ = edge_id; // used for logging context
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
// --- Serde tests ---
|
||||
|
||||
#[test]
|
||||
fn test_edge_config_deserialize_camel_case() {
|
||||
let json = r#"{
|
||||
"hubHost": "hub.example.com",
|
||||
"hubPort": 8443,
|
||||
"edgeId": "edge-1",
|
||||
"secret": "my-secret"
|
||||
}"#;
|
||||
let config: EdgeConfig = serde_json::from_str(json).unwrap();
|
||||
assert_eq!(config.hub_host, "hub.example.com");
|
||||
assert_eq!(config.hub_port, 8443);
|
||||
assert_eq!(config.edge_id, "edge-1");
|
||||
assert_eq!(config.secret, "my-secret");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_edge_config_serialize_roundtrip() {
|
||||
let config = EdgeConfig {
|
||||
hub_host: "host.test".to_string(),
|
||||
hub_port: 9999,
|
||||
edge_id: "e1".to_string(),
|
||||
secret: "sec".to_string(),
|
||||
};
|
||||
let json = serde_json::to_string(&config).unwrap();
|
||||
let back: EdgeConfig = serde_json::from_str(&json).unwrap();
|
||||
assert_eq!(back.hub_host, config.hub_host);
|
||||
assert_eq!(back.hub_port, config.hub_port);
|
||||
assert_eq!(back.edge_id, config.edge_id);
|
||||
assert_eq!(back.secret, config.secret);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_handshake_config_deserialize_all_fields() {
|
||||
let json = r#"{"listenPorts": [80, 443], "stunIntervalSecs": 120}"#;
|
||||
let hc: HandshakeConfig = serde_json::from_str(json).unwrap();
|
||||
assert_eq!(hc.listen_ports, vec![80, 443]);
|
||||
assert_eq!(hc.stun_interval_secs, 120);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_handshake_config_default_stun_interval() {
|
||||
let json = r#"{"listenPorts": [443]}"#;
|
||||
let hc: HandshakeConfig = serde_json::from_str(json).unwrap();
|
||||
assert_eq!(hc.listen_ports, vec![443]);
|
||||
assert_eq!(hc.stun_interval_secs, 300);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_config_update_deserialize() {
|
||||
let json = r#"{"listenPorts": [8080, 9090]}"#;
|
||||
let update: ConfigUpdate = serde_json::from_str(json).unwrap();
|
||||
assert_eq!(update.listen_ports, vec![8080, 9090]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_edge_status_serialize() {
|
||||
let status = EdgeStatus {
|
||||
running: true,
|
||||
connected: true,
|
||||
public_ip: Some("1.2.3.4".to_string()),
|
||||
active_streams: 5,
|
||||
listen_ports: vec![443],
|
||||
};
|
||||
let json = serde_json::to_value(&status).unwrap();
|
||||
assert_eq!(json["running"], true);
|
||||
assert_eq!(json["connected"], true);
|
||||
assert_eq!(json["publicIp"], "1.2.3.4");
|
||||
assert_eq!(json["activeStreams"], 5);
|
||||
assert_eq!(json["listenPorts"], serde_json::json!([443]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_edge_status_serialize_none_ip() {
|
||||
let status = EdgeStatus {
|
||||
running: false,
|
||||
connected: false,
|
||||
public_ip: None,
|
||||
active_streams: 0,
|
||||
listen_ports: vec![],
|
||||
};
|
||||
let json = serde_json::to_value(&status).unwrap();
|
||||
assert!(json["publicIp"].is_null());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_edge_event_tunnel_connected() {
|
||||
let event = EdgeEvent::TunnelConnected;
|
||||
let json = serde_json::to_value(&event).unwrap();
|
||||
assert_eq!(json["type"], "tunnelConnected");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_edge_event_tunnel_disconnected() {
|
||||
let event = EdgeEvent::TunnelDisconnected;
|
||||
let json = serde_json::to_value(&event).unwrap();
|
||||
assert_eq!(json["type"], "tunnelDisconnected");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_edge_event_public_ip_discovered() {
|
||||
let event = EdgeEvent::PublicIpDiscovered {
|
||||
ip: "203.0.113.1".to_string(),
|
||||
};
|
||||
let json = serde_json::to_value(&event).unwrap();
|
||||
assert_eq!(json["type"], "publicIpDiscovered");
|
||||
assert_eq!(json["ip"], "203.0.113.1");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_edge_event_ports_assigned() {
|
||||
let event = EdgeEvent::PortsAssigned {
|
||||
listen_ports: vec![443, 8080],
|
||||
};
|
||||
let json = serde_json::to_value(&event).unwrap();
|
||||
assert_eq!(json["type"], "portsAssigned");
|
||||
assert_eq!(json["listenPorts"], serde_json::json!([443, 8080]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_edge_event_ports_updated() {
|
||||
let event = EdgeEvent::PortsUpdated {
|
||||
listen_ports: vec![9090],
|
||||
};
|
||||
let json = serde_json::to_value(&event).unwrap();
|
||||
assert_eq!(json["type"], "portsUpdated");
|
||||
assert_eq!(json["listenPorts"], serde_json::json!([9090]));
|
||||
}
|
||||
|
||||
// --- Async tests ---
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_tunnel_edge_new_get_status() {
|
||||
let edge = TunnelEdge::new(EdgeConfig {
|
||||
hub_host: "localhost".to_string(),
|
||||
hub_port: 8443,
|
||||
edge_id: "test-edge".to_string(),
|
||||
secret: "test-secret".to_string(),
|
||||
});
|
||||
let status = edge.get_status().await;
|
||||
assert!(!status.running);
|
||||
assert!(!status.connected);
|
||||
assert!(status.public_ip.is_none());
|
||||
assert_eq!(status.active_streams, 0);
|
||||
assert!(status.listen_ports.is_empty());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_tunnel_edge_take_event_rx() {
|
||||
let edge = TunnelEdge::new(EdgeConfig {
|
||||
hub_host: "localhost".to_string(),
|
||||
hub_port: 8443,
|
||||
edge_id: "e".to_string(),
|
||||
secret: "s".to_string(),
|
||||
});
|
||||
let rx1 = edge.take_event_rx().await;
|
||||
assert!(rx1.is_some());
|
||||
let rx2 = edge.take_event_rx().await;
|
||||
assert!(rx2.is_none());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_tunnel_edge_stop_without_start() {
|
||||
let edge = TunnelEdge::new(EdgeConfig {
|
||||
hub_host: "localhost".to_string(),
|
||||
hub_port: 8443,
|
||||
edge_id: "e".to_string(),
|
||||
secret: "s".to_string(),
|
||||
});
|
||||
edge.stop().await; // should not panic
|
||||
let status = edge.get_status().await;
|
||||
assert!(!status.running);
|
||||
}
|
||||
}
|
||||
|
||||
/// TLS certificate verifier that accepts any certificate (auth is via shared secret).
|
||||
#[derive(Debug)]
|
||||
struct NoCertVerifier;
|
||||
|
||||
Reference in New Issue
Block a user