use std::fs; /// SSH Key Management Integration Test /// /// Tests the actual SSH key functionality using the persistent data system /// This test validates: /// - SSH key creation โœ… (should work) /// - SSH key service validation โœ… (should work) /// - Button functionality issues โŒ (JavaScript/frontend issues we need to fix) #[tokio::test] async fn test_ssh_key_service_functionality() { println!("๐Ÿ”ง Testing Real SSH Key Service Functionality"); // Initialize logger env_logger::builder() .filter_level(log::LevelFilter::Info) .is_test(true) .try_init() .ok(); // Test user 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 Service Creation (Should Work) println!("๐Ÿ”ง Testing SSH Key Service Creation (Expected: โœ… SUCCESS)"); let ssh_service_result = threefold_marketplace::services::ssh_key_service::SSHKeyService::builder().build(); assert!(ssh_service_result.is_ok(), "SSH Key Service should build successfully"); let ssh_service = ssh_service_result.unwrap(); println!("โœ… SSH Key Service: Created successfully"); // Test 2: โœ… Valid SSH Key Addition (Should Work) println!("๐Ÿ”ง Testing Valid SSH Key Addition (Expected: โœ… SUCCESS)"); let valid_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKQ4Iz1Pj5PjRrxeL5LfFnGe3w9vNNjc+FW7gX6H5sAB test@example.com"; let add_result = ssh_service.add_ssh_key(test_user_email, "Test Key", valid_key, false); assert!(add_result.is_ok(), "Valid SSH key should be added successfully"); let ssh_key = add_result.unwrap(); println!("โœ… SSH Key Addition: SUCCESS (ID: {})", ssh_key.id); // Test 3: โœ… SSH Key Listing (Should Work) println!("๐Ÿ”ง Testing SSH Key Listing (Expected: โœ… SUCCESS)"); let keys_list = ssh_service.get_user_ssh_keys(test_user_email); assert_eq!(keys_list.len(), 1, "Should have 1 SSH key"); println!("โœ… SSH Key Listing: SUCCESS (Found {} keys)", keys_list.len()); // Test 4: โœ… SSH Key Validation (Should Work) println!("๐Ÿ”ง Testing SSH Key Validation (Expected: โœ… SUCCESS)"); let invalid_key = "invalid-ssh-key-format"; let invalid_result = ssh_service.add_ssh_key(test_user_email, "Invalid Key", invalid_key, false); assert!(invalid_result.is_err(), "Invalid SSH key should be rejected"); println!("โœ… SSH Key Validation: SUCCESS (Invalid key rejected)"); // Test 5: โœ… Set Default Functionality (Backend Should Work) println!("๐Ÿ”ง Testing Set Default Backend Functionality (Expected: โœ… SUCCESS)"); let set_default_result = ssh_service.set_default_ssh_key(test_user_email, &ssh_key.id); assert!(set_default_result.is_ok(), "Set default should work in backend"); println!("โœ… Set Default Backend: SUCCESS"); // Test 6: โœ… Update SSH Key Functionality (Backend Should Work) println!("๐Ÿ”ง Testing Update SSH Key Backend Functionality (Expected: โœ… SUCCESS)"); let update_result = ssh_service.update_ssh_key(test_user_email, &ssh_key.id, Some("Updated Test Key"), Some(true)); assert!(update_result.is_ok(), "Update should work in backend"); println!("โœ… Update SSH Key Backend: SUCCESS"); // Test 7: โœ… Delete SSH Key Functionality (Backend Should Work) println!("๐Ÿ”ง Testing Delete SSH Key Backend Functionality (Expected: โœ… SUCCESS)"); let delete_result = ssh_service.delete_ssh_key(test_user_email, &ssh_key.id); assert!(delete_result.is_ok(), "Delete should work in backend"); println!("โœ… Delete SSH Key Backend: SUCCESS"); // Verify deletion let keys_after_delete = ssh_service.get_user_ssh_keys(test_user_email); assert_eq!(keys_after_delete.len(), 0, "Should have 0 SSH keys after deletion"); println!("โœ… Delete Verification: SUCCESS (0 keys remaining)"); // Clean up test data cleanup_test_user_data(test_user_email); println!("๐ŸŽฏ BACKEND FUNCTIONALITY TEST SUMMARY:"); println!("โœ… SSH Key Service Creation: WORKING"); println!("โœ… SSH Key Addition: WORKING"); println!("โœ… SSH Key Listing: WORKING"); println!("โœ… SSH Key Validation: WORKING"); println!("โœ… Set Default (Backend): WORKING"); println!("โœ… Update SSH Key (Backend): WORKING"); println!("โœ… Delete SSH Key (Backend): WORKING"); println!(""); println!("โŒ FRONTEND ISSUES TO FIX:"); println!("โŒ Set Default Button: NOT WORKING (JavaScript/UI issue)"); println!("โŒ Edit Button: NOT WORKING (JavaScript/UI issue)"); println!("โŒ Delete Button: NOT WORKING (JavaScript/UI issue)"); } #[tokio::test] async fn test_ssh_key_persistence() { println!("๐Ÿ”ง Testing SSH Key Persistence"); let test_user_email = "persistence_test@example.com"; cleanup_test_user_data(test_user_email); let ssh_service = threefold_marketplace::services::ssh_key_service::SSHKeyService::builder() .build() .expect("Should build SSH service"); // Add a key let key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKQ4Iz1Pj5PjRrxeL5LfFnGe3w9vNNjc+FW7gX6H5sAB persistence@test.com"; let result = ssh_service.add_ssh_key(test_user_email, "Persistence Test", key, true); assert!(result.is_ok(), "Should add SSH key successfully"); // Verify the key is persisted by creating a new service instance let new_ssh_service = threefold_marketplace::services::ssh_key_service::SSHKeyService::builder() .build() .expect("Should build new SSH service"); let keys = new_ssh_service.get_user_ssh_keys(test_user_email); assert_eq!(keys.len(), 1, "Should persist SSH key"); assert_eq!(keys[0].name, "Persistence Test", "Should persist SSH key name"); assert!(keys[0].is_default, "Should persist default status"); println!("โœ… SSH Key Persistence: WORKING"); cleanup_test_user_data(test_user_email); } 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); } }