//! SSH Key Management - Frontend UX Integration Test //! //! This test validates the complete user experience for SSH key management, //! testing all 4 core operations as a user would experience them. //! //! Operations Tested: //! 1. Create SSH Key //! 2. Set Default SSH Key //! 3. Edit SSH Key //! 4. Delete SSH Key //! //! This test runs the existing working SSH key integration to validate UX functionality. use std::fs; use threefold_marketplace::services::ssh_key_service::SSHKeyService; /// Cleanup test user data fn cleanup_test_user_data(user_email: &str) { let encoded_email = user_email.replace("@", "_at_").replace(".", "_"); let file_path = format!("user_data/{}.json", encoded_email); if std::path::Path::new(&file_path).exists() { let _ = fs::remove_file(&file_path); } } #[tokio::test] async fn test_complete_ssh_key_ux_workflow() { println!("šŸŽÆ SSH Key Management - Complete UX Workflow Test"); println!("šŸ“‹ Testing all 4 operations: Create → Set Default → Edit → Delete"); // Initialize logger env_logger::builder() .filter_level(log::LevelFilter::Info) .is_test(true) .try_init() .ok(); // Test user let test_user_email = "ux_test_user@example.com"; // Clean up any existing test data cleanup_test_user_data(test_user_email); // Initialize SSH service println!("\nšŸ”§ Step 1: Initialize SSH Key Service"); let ssh_service_result = 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"); // Step 2: Create first SSH key (Ed25519) println!("\nšŸ”§ Step 2: Create SSH Key (Ed25519)"); let key_1_name = "UX Test Ed25519 Key"; let key_1_public = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKQ4Iz1Pj5PjRrxeL5LfFnGe3w9vNNjc+FW7gX6H5sAB ux_test@example.com"; let add_result_1 = ssh_service.add_ssh_key(test_user_email, key_1_name, key_1_public, false); assert!(add_result_1.is_ok(), "Valid SSH key should be added successfully"); let ssh_key_1 = add_result_1.unwrap(); assert_eq!(ssh_key_1.name, key_1_name); assert_eq!(ssh_key_1.is_default, true, "First key should be default"); println!("āœ… Created SSH key: {} (ID: {})", ssh_key_1.name, ssh_key_1.id); // Step 3: Create second SSH key (RSA) println!("\nšŸ”§ Step 3: Create second SSH Key (RSA)"); let key_2_name = "UX Test Ed25519 Key 2"; let key_2_public = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL3mE8rIpUe+1e8TtdqHnX6cGp8h9K3y2f5V6nQ8zE1M ux_test_ed25519_2@example.com"; let add_result_2 = ssh_service.add_ssh_key(test_user_email, key_2_name, key_2_public, false); assert!(add_result_2.is_ok(), "Valid SSH key should be added successfully"); let ssh_key_2 = add_result_2.unwrap(); assert_eq!(ssh_key_2.name, key_2_name); assert_eq!(ssh_key_2.is_default, false, "Second key should not be default"); println!("āœ… Created SSH key: {} (ID: {})", ssh_key_2.name, ssh_key_2.id); // Step 4: Verify both keys exist println!("\nšŸ”§ Step 4: Verify both keys exist in list"); let keys_list = ssh_service.get_user_ssh_keys(test_user_email); assert_eq!(keys_list.len(), 2, "Should have 2 SSH keys"); let default_keys: Vec<_> = keys_list.iter().filter(|k| k.is_default).collect(); assert_eq!(default_keys.len(), 1, "Should have exactly one default key"); assert_eq!(default_keys[0].id, ssh_key_1.id, "First key should be default"); println!("āœ… Verified 2 keys exist, key 1 is default"); // Step 5: Set Default Operation (User clicks "Set Default" on key 2) println!("\nšŸ”§ Step 5: Set Default Operation (User clicks 'Set Default' on key 2)"); let set_default_result = ssh_service.set_default_ssh_key(test_user_email, &ssh_key_2.id); assert!(set_default_result.is_ok(), "Should be able to set key 2 as default"); // Verify default changed let updated_keys = ssh_service.get_user_ssh_keys(test_user_email); let key_1_updated = updated_keys.iter().find(|k| k.id == ssh_key_1.id).unwrap(); let key_2_updated = updated_keys.iter().find(|k| k.id == ssh_key_2.id).unwrap(); assert_eq!(key_1_updated.is_default, false, "Key 1 should no longer be default"); assert_eq!(key_2_updated.is_default, true, "Key 2 should now be default"); println!("āœ… Set Default successful: Key 2 is now default"); // Step 6: Edit Operation (User clicks "Edit" and changes name) println!("\nšŸ”§ Step 6: Edit Operation (User clicks 'Edit' and changes name)"); let new_name = "Updated UX Test Ed25519 Key"; let update_result = ssh_service.update_ssh_key(test_user_email, &ssh_key_1.id, Some(new_name), Some(false)); assert!(update_result.is_ok(), "Should be able to update SSH key"); // Verify edit worked let updated_key = ssh_service.get_ssh_key_by_id(test_user_email, &ssh_key_1.id); assert!(updated_key.is_some(), "Updated key should exist"); let updated_key = updated_key.unwrap(); assert_eq!(updated_key.name, new_name, "Name should be updated"); assert_eq!(updated_key.id, ssh_key_1.id, "ID should remain same"); assert_eq!(updated_key.is_default, false, "Should still not be default"); println!("āœ… Edit successful: Updated name to '{}'", new_name); // Step 7: Delete Operation (User clicks "Delete" and confirms) println!("\nšŸ”§ Step 7: Delete Operation (User clicks 'Delete' and confirms)"); let delete_result = ssh_service.delete_ssh_key(test_user_email, &ssh_key_1.id); assert!(delete_result.is_ok(), "Should be able to delete SSH key"); // Verify key deleted let remaining_keys = ssh_service.get_user_ssh_keys(test_user_email); assert_eq!(remaining_keys.len(), 1, "Should have 1 key remaining"); let remaining_key = &remaining_keys[0]; assert_eq!(remaining_key.id, ssh_key_2.id, "Key 2 should remain"); assert_eq!(remaining_key.is_default, true, "Remaining key should still be default"); println!("āœ… Delete successful: Key 1 deleted, Key 2 remains as default"); // Step 8: Cleanup - delete remaining key println!("\nšŸ”§ Step 8: Cleanup - Delete remaining key"); let cleanup_result = ssh_service.delete_ssh_key(test_user_email, &ssh_key_2.id); assert!(cleanup_result.is_ok(), "Should be able to delete remaining SSH key"); // Verify empty state let final_keys = ssh_service.get_user_ssh_keys(test_user_email); assert_eq!(final_keys.len(), 0, "Should be back to empty state"); println!("āœ… Cleanup successful: Back to empty state"); // Final verification println!("\nšŸŽÆ SSH Key UX Workflow Test Results:"); println!("āœ… Create Operation - WORKING"); println!("āœ… Set Default Operation - WORKING"); println!("āœ… Edit Operation - WORKING"); println!("āœ… Delete Operation - WORKING"); println!("āœ… All 4 SSH key operations validated successfully!"); println!("\nšŸ“‹ Complete User Experience Flow Verified:"); println!(" • User can create SSH keys with validation"); println!(" • User can set any key as default"); println!(" • User can edit key names and settings"); println!(" • User can delete keys with proper cleanup"); println!(" • System maintains data integrity throughout"); println!(" • Default key management works correctly"); println!("\nšŸš€ SSH Key Management System: PRODUCTION READY"); // Final cleanup cleanup_test_user_data(test_user_email); } #[tokio::test] async fn test_ssh_key_validation_scenarios() { println!("šŸ”’ SSH Key Validation Scenarios Test"); // Initialize logger env_logger::builder() .filter_level(log::LevelFilter::Info) .is_test(true) .try_init() .ok(); let test_user_email = "validation_test@example.com"; cleanup_test_user_data(test_user_email); let ssh_service = SSHKeyService::builder().build().unwrap(); // Test invalid key format println!("\nšŸ”§ Testing invalid SSH key format"); let invalid_result = ssh_service.add_ssh_key(test_user_email, "Invalid Key", "invalid-ssh-key-format", false); assert!(invalid_result.is_err(), "Should reject invalid SSH key format"); // Test empty name println!("šŸ”§ Testing empty key name"); let empty_name_result = ssh_service.add_ssh_key(test_user_email, "", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKQ4Iz1Pj5PjRrxeL5LfFnGe3w9vNNjc+FW7gX6H5sAB test@example.com", false); assert!(empty_name_result.is_err(), "Should reject empty key name"); println!("āœ… Validation scenarios working correctly"); cleanup_test_user_data(test_user_email); } #[tokio::test] async fn test_ssh_key_duplicate_prevention() { println!("šŸ”„ SSH Key Duplicate Prevention Test"); let test_user_email = "duplicate_test@example.com"; cleanup_test_user_data(test_user_email); let ssh_service = SSHKeyService::builder().build().unwrap(); let test_public_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKQ4Iz1Pj5PjRrxeL5LfFnGe3w9vNNjc+FW7gX6H5sAB test@example.com"; // Create first key let first_result = ssh_service.add_ssh_key(test_user_email, "First Key", test_public_key, false); assert!(first_result.is_ok(), "First key creation should succeed"); // Try to create duplicate key let duplicate_result = ssh_service.add_ssh_key(test_user_email, "Different Name Same Key", test_public_key, false); assert!(duplicate_result.is_err(), "Should reject duplicate SSH key"); println!("āœ… Duplicate prevention working correctly"); cleanup_test_user_data(test_user_email); }