use std::fs; use threefold_marketplace::services::ssh_key_service::SSHKeyService; /// Integration test for complete SSH Key UI workflow /// Tests: Create SSH key โ†’ Test set default, edit, delete buttons #[tokio::test] async fn test_ssh_key_complete_ui_workflow() { println!("๐Ÿ”ง Testing Complete SSH Key UI Workflow"); // Test user let test_user_email = "ssh_ui_test@example.com"; let test_ssh_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG2DBmFDHHXEXAMP1EKfgzrFQJ7CVOXXJwJQ6nKZZJhC test_ui_key@example.com"; // Clean up any existing test data let user_data_path = format!("user_data/{}.json", test_user_email.replace("@", "_at_").replace(".", "_")); let _ = fs::remove_file(&user_data_path); // Step 1: Create SSH Key Service println!("๐Ÿ”ง Step 1: Testing SSH Key Service Creation"); let ssh_service = SSHKeyService::builder() .build() .expect("Failed to build SSH key service"); println!("โœ… SSH Key Service: Created successfully"); // Step 2: Add SSH Key (like the create form) println!("๐Ÿ”ง Step 2: Creating SSH Key (simulating UI create)"); let created_key = ssh_service.add_ssh_key( test_user_email, "Test UI Key", test_ssh_key, false ).expect("Failed to add SSH key"); let created_key_id = created_key.id.clone(); println!("โœ… SSH Key Created: ID = {}", created_key_id); // Step 3: Get all keys to verify creation worked println!("๐Ÿ”ง Step 3: Verifying SSH Key List"); let all_keys = ssh_service.get_user_ssh_keys(test_user_email); assert!(!all_keys.is_empty(), "SSH key list should not be empty"); assert_eq!(all_keys.len(), 1, "Should have exactly 1 SSH key"); println!("โœ… SSH Key List: {} keys found", all_keys.len()); // Step 4: Test Set Default (simulating set default button) println!("๐Ÿ”ง Step 4: Testing Set Default Button Operation"); match ssh_service.set_default_ssh_key(test_user_email, &created_key_id) { Ok(()) => { println!("โœ… Set Default Button: WORKING"); // Verify it worked let updated_keys = ssh_service.get_user_ssh_keys(test_user_email); let default_key = updated_keys.iter().find(|k| k.is_default); assert!(default_key.is_some(), "Should have a default key"); assert_eq!(default_key.unwrap().id, created_key_id, "Default key ID should match"); println!("โœ… Set Default Verification: SUCCESS"); } Err(e) => { println!("โŒ Set Default Button: FAILED - {}", e); panic!("Set default button should work"); } } // Step 5: Test Update/Edit (simulating edit button) println!("๐Ÿ”ง Step 5: Testing Edit Button Operation"); match ssh_service.update_ssh_key(test_user_email, &created_key_id, Some("Updated UI Key Name"), None) { Ok(updated_key) => { println!("โœ… Edit Button: WORKING"); assert_eq!(updated_key.name, "Updated UI Key Name", "Name should be updated"); assert_eq!(updated_key.id, created_key_id, "Key ID should remain same"); println!("โœ… Edit Verification: SUCCESS"); } Err(e) => { println!("โŒ Edit Button: FAILED - {}", e); panic!("Edit button should work"); } } // Step 6: Test Delete (simulating delete button) println!("๐Ÿ”ง Step 6: Testing Delete Button Operation"); match ssh_service.delete_ssh_key(test_user_email, &created_key_id) { Ok(()) => { println!("โœ… Delete Button: WORKING"); // Verify deletion worked let remaining_keys = ssh_service.get_user_ssh_keys(test_user_email); assert!(remaining_keys.is_empty(), "Should have no keys after deletion"); println!("โœ… Delete Verification: SUCCESS (0 keys remaining)"); } Err(e) => { println!("โŒ Delete Button: FAILED - {}", e); panic!("Delete button should work"); } } // Clean up test data let _ = fs::remove_file(&user_data_path); println!("๐Ÿงน Cleaned up test user data: {}", user_data_path); // Summary println!("๐ŸŽฏ COMPLETE UI WORKFLOW TEST SUMMARY:"); println!("โœ… SSH Key Creation: WORKING"); println!("โœ… Set Default Button Backend: WORKING"); println!("โœ… Edit Button Backend: WORKING"); println!("โœ… Delete Button Backend: WORKING"); println!(""); println!("๐Ÿ” NEXT: Test frontend button click handlers and form data"); } /// Test the specific scenario that might be failing in the UI #[tokio::test] async fn test_ssh_key_button_scenarios() { println!("๐Ÿ”ง Testing SSH Key Button Error Scenarios"); let test_user_email = "ssh_button_test@example.com"; let test_ssh_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE8GmPXXXamp1eKfgzrFQJ7CVOXXXJQ6nKZZJhC button_test@example.com"; // Clean up any existing test data let user_data_path = format!("user_data/{}.json", test_user_email.replace("@", "_at_").replace(".", "_")); let _ = fs::remove_file(&user_data_path); let ssh_service = SSHKeyService::builder() .build() .expect("Failed to build SSH key service"); // Create a test key let created_key = ssh_service.add_ssh_key( test_user_email, "Button Test Key", test_ssh_key, false ).expect("Failed to add SSH key"); println!("๐Ÿ”ง Testing with Key ID: {}", created_key.id); // Test scenario 1: Set default with empty key ID println!("๐Ÿ”ง Test 1: Set default with empty key ID"); match ssh_service.set_default_ssh_key(test_user_email, "") { Ok(()) => println!("โŒ Should have failed with empty key ID"), Err(e) => println!("โœ… Correctly failed with empty key ID: {}", e), } // Test scenario 2: Set default with invalid key ID println!("๐Ÿ”ง Test 2: Set default with invalid key ID"); match ssh_service.set_default_ssh_key(test_user_email, "invalid-key-id") { Ok(()) => println!("โŒ Should have failed with invalid key ID"), Err(e) => println!("โœ… Correctly failed with invalid key ID: {}", e), } // Test scenario 3: Set default with correct key ID println!("๐Ÿ”ง Test 3: Set default with correct key ID"); match ssh_service.set_default_ssh_key(test_user_email, &created_key.id) { Ok(()) => println!("โœ… Set default worked with correct key ID"), Err(e) => println!("โŒ Set default should have worked: {}", e), } // Test scenario 4: Update with invalid key ID println!("๐Ÿ”ง Test 4: Update with invalid key ID"); match ssh_service.update_ssh_key(test_user_email, "invalid-key-id", Some("New Name"), None) { Ok(_) => println!("โŒ Should have failed with invalid key ID"), Err(e) => println!("โœ… Correctly failed with invalid key ID: {}", e), } // Test scenario 5: Delete with invalid key ID println!("๐Ÿ”ง Test 5: Delete with invalid key ID"); match ssh_service.delete_ssh_key(test_user_email, "invalid-key-id") { Ok(()) => println!("โŒ Should have failed with invalid key ID"), Err(e) => println!("โœ… Correctly failed with invalid key ID: {}", e), } // Clean up let _ = ssh_service.delete_ssh_key(test_user_email, &created_key.id); let _ = fs::remove_file(&user_data_path); println!("๐ŸŽฏ BUTTON SCENARIO TEST COMPLETED"); println!("๐Ÿ” If UI buttons are still failing, the issue is likely:"); println!(" 1. Key ID not being passed correctly from JavaScript"); println!(" 2. JavaScript event handlers not attaching properly"); println!(" 3. Form data not being constructed correctly"); }