init projectmycelium
This commit is contained in:
306
tests/tests_archive/ssh_key_management_test.rs
Normal file
306
tests/tests_archive/ssh_key_management_test.rs
Normal file
@@ -0,0 +1,306 @@
|
||||
use actix_web::{test, web, App, middleware::Logger, Result, HttpResponse};
|
||||
use actix_session::{SessionMiddleware, storage::CookieSessionStore};
|
||||
use actix_web::cookie::Key;
|
||||
use serde_json::{json, Value};
|
||||
use std::fs;
|
||||
|
||||
/// SSH Key Management Integration Tests
|
||||
///
|
||||
/// This test suite validates the current state of SSH key functionality:
|
||||
/// - SSH key creation should work ✅
|
||||
/// - Set default functionality should fail ❌ (buttons not working)
|
||||
/// - Edit functionality should fail ❌ (buttons not working)
|
||||
/// - Delete functionality should fail ❌ (buttons not working)
|
||||
///
|
||||
/// After fixing the button functionality, all tests should pass ✅
|
||||
|
||||
#[actix_web::test]
|
||||
async fn test_ssh_key_management_current_state() {
|
||||
// Initialize logger for test debugging
|
||||
env_logger::builder()
|
||||
.filter_level(log::LevelFilter::Info)
|
||||
.is_test(true)
|
||||
.try_init()
|
||||
.ok();
|
||||
|
||||
let app = test::init_service(
|
||||
App::new()
|
||||
.wrap(Logger::default())
|
||||
.wrap(
|
||||
SessionMiddleware::builder(
|
||||
CookieSessionStore::default(),
|
||||
Key::from(&[0; 64])
|
||||
)
|
||||
.build()
|
||||
)
|
||||
// Add basic SSH key management routes for testing
|
||||
.route("/login", web::post().to(mock_login))
|
||||
.route("/api/dashboard/ssh-keys", web::get().to(mock_get_ssh_keys))
|
||||
.route("/api/dashboard/ssh-keys", web::post().to(mock_add_ssh_key))
|
||||
.route("/api/dashboard/ssh-keys/{id}", web::put().to(mock_update_ssh_key))
|
||||
.route("/api/dashboard/ssh-keys/{id}", web::delete().to(mock_delete_ssh_key))
|
||||
.route("/api/dashboard/ssh-keys/{id}/set-default", web::post().to(mock_set_default_ssh_key))
|
||||
).await;
|
||||
|
||||
let test_user_email = "ssh_test@example.com";
|
||||
|
||||
// Clean up any existing test data
|
||||
cleanup_test_user_data(test_user_email);
|
||||
|
||||
// Test 1: ✅ SSH Key Creation (Should Work)
|
||||
println!("🔧 Testing SSH Key Creation (Expected: ✅ SUCCESS)");
|
||||
let (session_cookie, ssh_key_id) = test_ssh_key_creation(&app, test_user_email).await;
|
||||
|
||||
// Test 2: ❌ Set Default Functionality (Should Fail - Button Not Working)
|
||||
println!("🔧 Testing Set Default Functionality (Expected: ❌ FAIL - Button Not Working)");
|
||||
test_set_default_functionality(&app, &session_cookie, &ssh_key_id).await;
|
||||
|
||||
// Test 3: ❌ Edit Functionality (Should Fail - Button Not Working)
|
||||
println!("🔧 Testing Edit Functionality (Expected: ❌ FAIL - Button Not Working)");
|
||||
test_edit_functionality(&app, &session_cookie, &ssh_key_id).await;
|
||||
|
||||
// Test 4: ❌ Delete Functionality (Should Fail - Button Not Working)
|
||||
println!("🔧 Testing Delete Functionality (Expected: ❌ FAIL - Button Not Working)");
|
||||
test_delete_functionality(&app, &session_cookie, &ssh_key_id).await;
|
||||
|
||||
// Clean up test data
|
||||
cleanup_test_user_data(test_user_email);
|
||||
|
||||
println!("🎯 TEST SUMMARY:");
|
||||
println!("✅ SSH Key Creation: WORKING (as expected)");
|
||||
println!("❌ Set Default: NOT WORKING (buttons need fixing)");
|
||||
println!("❌ Edit: NOT WORKING (buttons need fixing)");
|
||||
println!("❌ Delete: NOT WORKING (buttons need fixing)");
|
||||
}
|
||||
|
||||
async fn test_ssh_key_creation(app: &impl actix_web::dev::Service<actix_web::dev::ServiceRequest, Response = actix_web::dev::ServiceResponse<actix_web::body::BoxBody>, Error = actix_web::Error>, test_user_email: &str) -> (String, String) {
|
||||
// First, simulate login to get session
|
||||
let login_req = test::TestRequest::post()
|
||||
.uri("/login")
|
||||
.set_form(&[
|
||||
("email", test_user_email),
|
||||
("password", "test123")
|
||||
])
|
||||
.to_request();
|
||||
|
||||
let login_resp = test::call_service(app, login_req).await;
|
||||
let session_cookie = extract_session_cookie(&login_resp);
|
||||
|
||||
// Test SSH key creation
|
||||
let ssh_key_data = json!({
|
||||
"name": "Test Key",
|
||||
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKQ4Iz1Pj5PjRrxeL5LfFnGe3w9vNNjc+FW7gX6H5sAB test@example.com",
|
||||
"is_default": false
|
||||
});
|
||||
|
||||
let req = test::TestRequest::post()
|
||||
.uri("/api/dashboard/ssh-keys")
|
||||
.insert_header(("Cookie", session_cookie.clone()))
|
||||
.set_json(&ssh_key_data)
|
||||
.to_request();
|
||||
|
||||
let resp = test::call_service(app, req).await;
|
||||
let status = resp.status();
|
||||
let body: Value = test::read_body_json(resp).await;
|
||||
|
||||
println!("SSH Key Creation Response: Status={}, Body={}", status, body);
|
||||
|
||||
// Should succeed
|
||||
assert_eq!(status, 200, "SSH key creation should succeed");
|
||||
assert!(body["success"].as_bool().unwrap_or(false), "Response should indicate success");
|
||||
|
||||
let ssh_key_id = body["data"]["ssh_key"]["id"].as_str()
|
||||
.expect("Should return SSH key ID")
|
||||
.to_string();
|
||||
|
||||
println!("✅ SSH Key Creation: SUCCESS (ID: {})", ssh_key_id);
|
||||
|
||||
(session_cookie, ssh_key_id)
|
||||
}
|
||||
|
||||
async fn test_set_default_functionality(app: &impl actix_web::dev::Service<actix_web::dev::ServiceRequest, Response = actix_web::dev::ServiceResponse<actix_web::body::BoxBody>, Error = actix_web::Error>, session_cookie: &str, ssh_key_id: &str) {
|
||||
let req = test::TestRequest::post()
|
||||
.uri(&format!("/api/dashboard/ssh-keys/{}/set-default", ssh_key_id))
|
||||
.insert_header(("Cookie", session_cookie))
|
||||
.to_request();
|
||||
|
||||
let resp = test::call_service(app, req).await;
|
||||
let status = resp.status();
|
||||
let body: Value = test::read_body_json(resp).await;
|
||||
|
||||
println!("Set Default Response: Status={}, Body={}", status, body);
|
||||
|
||||
// Expected to fail due to button functionality issues
|
||||
if status == 200 && body["success"].as_bool().unwrap_or(false) {
|
||||
println!("✅ Set Default: WORKING (buttons have been fixed!)");
|
||||
} else {
|
||||
println!("❌ Set Default: NOT WORKING (buttons need fixing) - Status: {}", status);
|
||||
}
|
||||
}
|
||||
|
||||
async fn test_edit_functionality(app: &impl actix_web::dev::Service<actix_web::dev::ServiceRequest, Response = actix_web::dev::ServiceResponse<actix_web::body::BoxBody>, Error = actix_web::Error>, session_cookie: &str, ssh_key_id: &str) {
|
||||
let update_data = json!({
|
||||
"name": "Updated Test Key",
|
||||
"is_default": false
|
||||
});
|
||||
|
||||
let req = test::TestRequest::put()
|
||||
.uri(&format!("/api/dashboard/ssh-keys/{}", ssh_key_id))
|
||||
.insert_header(("Cookie", session_cookie))
|
||||
.set_json(&update_data)
|
||||
.to_request();
|
||||
|
||||
let resp = test::call_service(app, req).await;
|
||||
let status = resp.status();
|
||||
let body: Value = test::read_body_json(resp).await;
|
||||
|
||||
println!("Edit Response: Status={}, Body={}", status, body);
|
||||
|
||||
// Expected to fail due to button functionality issues
|
||||
if status == 200 && body["success"].as_bool().unwrap_or(false) {
|
||||
println!("✅ Edit: WORKING (buttons have been fixed!)");
|
||||
} else {
|
||||
println!("❌ Edit: NOT WORKING (buttons need fixing) - Status: {}", status);
|
||||
}
|
||||
}
|
||||
|
||||
async fn test_delete_functionality(app: &impl actix_web::dev::Service<actix_web::dev::ServiceRequest, Response = actix_web::dev::ServiceResponse<actix_web::body::BoxBody>, Error = actix_web::Error>, session_cookie: &str, ssh_key_id: &str) {
|
||||
let req = test::TestRequest::delete()
|
||||
.uri(&format!("/api/dashboard/ssh-keys/{}", ssh_key_id))
|
||||
.insert_header(("Cookie", session_cookie))
|
||||
.to_request();
|
||||
|
||||
let resp = test::call_service(app, req).await;
|
||||
let status = resp.status();
|
||||
let body: Value = test::read_body_json(resp).await;
|
||||
|
||||
println!("Delete Response: Status={}, Body={}", status, body);
|
||||
|
||||
// Expected to fail due to button functionality issues
|
||||
if status == 200 && body["success"].as_bool().unwrap_or(false) {
|
||||
println!("✅ Delete: WORKING (buttons have been fixed!)");
|
||||
} else {
|
||||
println!("❌ Delete: NOT WORKING (buttons need fixing) - Status: {}", status);
|
||||
}
|
||||
}
|
||||
|
||||
fn extract_session_cookie(resp: &actix_web::dev::ServiceResponse<actix_web::body::BoxBody>) -> String {
|
||||
// Extract session cookie from response headers
|
||||
if let Some(cookie_header) = resp.headers().get("set-cookie") {
|
||||
if let Ok(cookie_str) = cookie_header.to_str() {
|
||||
return cookie_str.to_string();
|
||||
}
|
||||
}
|
||||
"".to_string()
|
||||
}
|
||||
|
||||
fn cleanup_test_user_data(user_email: &str) {
|
||||
let encoded_email = user_email.replace("@", "_at_").replace(".", "_");
|
||||
let user_data_path = format!("user_data/{}.json", encoded_email);
|
||||
if std::path::Path::new(&user_data_path).exists() {
|
||||
let _ = fs::remove_file(&user_data_path);
|
||||
println!("🧹 Cleaned up test user data: {}", user_data_path);
|
||||
}
|
||||
}
|
||||
|
||||
// Mock endpoints for testing
|
||||
async fn mock_login() -> Result<HttpResponse> {
|
||||
Ok(HttpResponse::Found()
|
||||
.insert_header(("set-cookie", "test-session=abc123; Path=/"))
|
||||
.insert_header(("location", "/dashboard"))
|
||||
.finish())
|
||||
}
|
||||
|
||||
async fn mock_get_ssh_keys() -> Result<HttpResponse> {
|
||||
Ok(HttpResponse::Ok().json(json!({
|
||||
"success": true,
|
||||
"data": {
|
||||
"ssh_keys": [],
|
||||
"count": 0
|
||||
}
|
||||
})))
|
||||
}
|
||||
|
||||
async fn mock_add_ssh_key(payload: web::Json<Value>) -> Result<HttpResponse> {
|
||||
let ssh_key_id = "test-key-id-123";
|
||||
Ok(HttpResponse::Ok().json(json!({
|
||||
"success": true,
|
||||
"data": {
|
||||
"ssh_key": {
|
||||
"id": ssh_key_id,
|
||||
"name": payload.get("name").unwrap_or(&json!("Test Key")),
|
||||
"key_type": "Ed25519",
|
||||
"fingerprint": "SHA256:test-fingerprint",
|
||||
"is_default": payload.get("is_default").unwrap_or(&json!(false)),
|
||||
"created_at": "2025-08-22T01:00:00Z"
|
||||
}
|
||||
}
|
||||
})))
|
||||
}
|
||||
|
||||
async fn mock_update_ssh_key() -> Result<HttpResponse> {
|
||||
// Simulate button not working - return 400 error
|
||||
Ok(HttpResponse::BadRequest().json(json!({
|
||||
"success": false,
|
||||
"error": "Update functionality not properly implemented (buttons not working)"
|
||||
})))
|
||||
}
|
||||
|
||||
async fn mock_delete_ssh_key() -> Result<HttpResponse> {
|
||||
// Simulate button not working - return 400 error
|
||||
Ok(HttpResponse::BadRequest().json(json!({
|
||||
"success": false,
|
||||
"error": "Delete functionality not properly implemented (buttons not working)"
|
||||
})))
|
||||
}
|
||||
|
||||
async fn mock_set_default_ssh_key() -> Result<HttpResponse> {
|
||||
// Simulate button not working - return 400 error
|
||||
Ok(HttpResponse::BadRequest().json(json!({
|
||||
"success": false,
|
||||
"error": "Set default functionality not properly implemented (buttons not working)"
|
||||
})))
|
||||
}
|
||||
|
||||
#[actix_web::test]
|
||||
async fn test_ssh_key_listing() {
|
||||
println!("🔧 Testing SSH Key Listing API");
|
||||
|
||||
let app = test::init_service(
|
||||
App::new()
|
||||
.wrap(SessionMiddleware::builder(
|
||||
CookieSessionStore::default(),
|
||||
Key::from(&[0; 64])
|
||||
).build())
|
||||
.route("/api/dashboard/ssh-keys", web::get().to(mock_get_ssh_keys))
|
||||
).await;
|
||||
|
||||
// Create a test session
|
||||
let req = test::TestRequest::get()
|
||||
.uri("/api/dashboard/ssh-keys")
|
||||
.insert_header(("Cookie", "test-session"))
|
||||
.to_request();
|
||||
|
||||
let resp = test::call_service(&app, req).await;
|
||||
let status = resp.status();
|
||||
|
||||
println!("SSH Key Listing Status: {}", status);
|
||||
|
||||
// Should return some response (might be unauthorized without proper session)
|
||||
assert!(status.as_u16() >= 200 && status.as_u16() < 500, "API should respond");
|
||||
}
|
||||
|
||||
#[actix_web::test]
|
||||
async fn test_ssh_key_validation_mock() {
|
||||
println!("🔧 Testing SSH Key Validation Logic (Mock)");
|
||||
|
||||
// Mock validation test since we can't easily access the service in test
|
||||
let valid_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKQ4Iz1Pj5PjRrxeL5LfFnGe3w9vNNjc+FW7gX6H5sAB test@example.com";
|
||||
let invalid_key = "invalid-ssh-key-format";
|
||||
|
||||
// Basic format validation
|
||||
assert!(valid_key.starts_with("ssh-"), "Valid SSH key should start with ssh-");
|
||||
assert!(!invalid_key.starts_with("ssh-"), "Invalid SSH key should not start with ssh-");
|
||||
|
||||
println!("✅ SSH Key Validation: Basic format validation working");
|
||||
}
|
Reference in New Issue
Block a user