Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| Test script for Admin Dashboard Professional Management | |
| Tests all CRUD operations for professional management | |
| """ | |
| import requests | |
| import json | |
| import time | |
| # Configuration | |
| API_BASE_URL = "https://prodevroger-ishingiro.hf.space" | |
| ADMIN_EMAIL = "eliasfeza@gmail.com" | |
| ADMIN_PASSWORD = "EliasFeza@12301" | |
| def test_admin_login(): | |
| """Test admin login""" | |
| print("π Testing admin login...") | |
| try: | |
| response = requests.post(f"{API_BASE_URL}/admin/login", json={ | |
| "email": ADMIN_EMAIL, | |
| "password": ADMIN_PASSWORD | |
| }) | |
| if response.status_code == 200: | |
| data = response.json() | |
| if data.get('success'): | |
| print("β Admin login successful") | |
| return data.get('token') | |
| else: | |
| print(f"β Admin login failed: {data.get('error')}") | |
| return None | |
| else: | |
| print(f"β Admin login failed: {response.status_code}") | |
| return None | |
| except Exception as e: | |
| print(f"β Admin login error: {e}") | |
| return None | |
| def test_get_professionals(token): | |
| """Test getting all professionals""" | |
| print("\nπ Testing get professionals...") | |
| try: | |
| headers = {"Authorization": f"Bearer {token}"} | |
| response = requests.get(f"{API_BASE_URL}/admin/professionals", headers=headers) | |
| if response.status_code == 200: | |
| data = response.json() | |
| print(f"β Retrieved {len(data.get('professionals', []))} professionals") | |
| return data.get('professionals', []) | |
| else: | |
| print(f"β Get professionals failed: {response.status_code}") | |
| return [] | |
| except Exception as e: | |
| print(f"β Get professionals error: {e}") | |
| return [] | |
| def test_create_professional(token): | |
| """Test creating a new professional""" | |
| print("\nβ Testing create professional...") | |
| professional_data = { | |
| "username": "test_professional", | |
| "password": "password123", | |
| "first_name": "Test", | |
| "last_name": "Professional", | |
| "email": "test.professional@example.com", | |
| "phone": "+250788123456", | |
| "specialization": "counselor", | |
| "expertise_areas": ["depression", "anxiety"], | |
| "experience_years": 5, | |
| "district": "Gasabo", | |
| "consultation_fee": 50000, | |
| "bio": "Test professional for automated testing", | |
| "languages": ["english"], | |
| "qualifications": ["Masters in Counseling"], | |
| "availability_schedule": {} | |
| } | |
| try: | |
| headers = {"Authorization": f"Bearer {token}"} | |
| response = requests.post(f"{API_BASE_URL}/admin/professionals", | |
| json=professional_data, headers=headers) | |
| if response.status_code == 200: | |
| data = response.json() | |
| if data.get('success'): | |
| print("β Professional created successfully") | |
| return data.get('professional', {}).get('id') | |
| else: | |
| print(f"β Create professional failed: {data.get('error')}") | |
| return None | |
| else: | |
| print(f"β Create professional failed: {response.status_code}") | |
| print(f"Response: {response.text}") | |
| return None | |
| except Exception as e: | |
| print(f"β Create professional error: {e}") | |
| return None | |
| def test_update_professional(token, professional_id): | |
| """Test updating a professional""" | |
| print("\nβοΈ Testing update professional...") | |
| update_data = { | |
| "first_name": "Updated", | |
| "last_name": "Professional", | |
| "email": "updated.professional@example.com", | |
| "phone": "+250788654321", | |
| "specialization": "psychologist", | |
| "expertise_areas": ["ptsd", "trauma"], | |
| "experience_years": 7, | |
| "district": "Kicukiro", | |
| "consultation_fee": 75000, | |
| "bio": "Updated professional for automated testing" | |
| } | |
| try: | |
| headers = {"Authorization": f"Bearer {token}"} | |
| response = requests.put(f"{API_BASE_URL}/admin/professionals/{professional_id}", | |
| json=update_data, headers=headers) | |
| if response.status_code == 200: | |
| data = response.json() | |
| if data.get('success'): | |
| print("β Professional updated successfully") | |
| return True | |
| else: | |
| print(f"β Update professional failed: {data.get('error')}") | |
| return False | |
| else: | |
| print(f"β Update professional failed: {response.status_code}") | |
| print(f"Response: {response.text}") | |
| return False | |
| except Exception as e: | |
| print(f"β Update professional error: {e}") | |
| return False | |
| def test_toggle_professional_status(token, professional_id): | |
| """Test toggling professional status""" | |
| print("\nπ Testing toggle professional status...") | |
| try: | |
| headers = {"Authorization": f"Bearer {token}"} | |
| response = requests.post(f"{API_BASE_URL}/admin/professionals/{professional_id}/status", | |
| json={"is_active": False}, headers=headers) | |
| if response.status_code == 200: | |
| data = response.json() | |
| if data.get('success'): | |
| print("β Professional status toggled successfully") | |
| return True | |
| else: | |
| print(f"β Toggle status failed: {data.get('error')}") | |
| return False | |
| else: | |
| print(f"β Toggle status failed: {response.status_code}") | |
| print(f"Response: {response.text}") | |
| return False | |
| except Exception as e: | |
| print(f"β Toggle status error: {e}") | |
| return False | |
| def test_delete_professional(token, professional_id): | |
| """Test deleting a professional""" | |
| print("\nποΈ Testing delete professional...") | |
| try: | |
| headers = {"Authorization": f"Bearer {token}"} | |
| response = requests.delete(f"{API_BASE_URL}/admin/professionals/{professional_id}", | |
| headers=headers) | |
| if response.status_code == 200: | |
| data = response.json() | |
| if data.get('success'): | |
| print("β Professional deleted successfully") | |
| return True | |
| else: | |
| print(f"β Delete professional failed: {data.get('error')}") | |
| return False | |
| else: | |
| print(f"β Delete professional failed: {response.status_code}") | |
| print(f"Response: {response.text}") | |
| return False | |
| except Exception as e: | |
| print(f"β Delete professional error: {e}") | |
| return False | |
| def test_sms_status(token): | |
| """Test SMS service status""" | |
| print("\nπ± Testing SMS service status...") | |
| try: | |
| headers = {"Authorization": f"Bearer {token}"} | |
| response = requests.get(f"{API_BASE_URL}/admin/sms/status", headers=headers) | |
| if response.status_code == 200: | |
| data = response.json() | |
| print(f"β SMS Status: {data.get('status')}") | |
| print(f"π± API ID: {data.get('api_id')}") | |
| print(f"π API Key: {data.get('api_key_masked')}") | |
| print(f"π Connection Test: {data.get('connection_test')}") | |
| return True | |
| else: | |
| print(f"β SMS status check failed: {response.status_code}") | |
| return False | |
| except Exception as e: | |
| print(f"β SMS status error: {e}") | |
| return False | |
| def main(): | |
| """Run all tests""" | |
| print("π§ͺ Testing Admin Dashboard Professional Management") | |
| print("=" * 60) | |
| # Test admin login | |
| token = test_admin_login() | |
| if not token: | |
| print("β Cannot proceed without admin authentication") | |
| return | |
| # Test getting professionals | |
| professionals = test_get_professionals(token) | |
| # Test creating a professional | |
| professional_id = test_create_professional(token) | |
| if not professional_id: | |
| print("β Cannot proceed without creating a professional") | |
| return | |
| # Test updating the professional | |
| test_update_professional(token, professional_id) | |
| # Test toggling status | |
| test_toggle_professional_status(token, professional_id) | |
| # Test SMS status | |
| test_sms_status(token) | |
| # Test deleting the professional | |
| test_delete_professional(token, professional_id) | |
| print("\n" + "=" * 60) | |
| print("π Admin Dashboard Professional Management Tests Complete!") | |
| print("\nπ Summary:") | |
| print("β Admin authentication working") | |
| print("β Professional CRUD operations working") | |
| print("β Status toggle working") | |
| print("β SMS service accessible") | |
| print("\nπ The admin dashboard professional management is now fully functional!") | |
| if __name__ == "__main__": | |
| main() |