| import requests |
| import json |
| import logging |
| from datetime import datetime |
| import time |
| import os |
| import sys |
|
|
| |
| logging.basicConfig( |
| level=logging.INFO, |
| format='%(asctime)s - %(levelname)s - %(message)s', |
| handlers=[ |
| logging.FileHandler('endpoint_testing.log', encoding='utf-8'), |
| logging.StreamHandler() |
| ] |
| ) |
|
|
| logger = logging.getLogger(__name__) |
|
|
| class EndpointTester: |
| def __init__(self, base_url='http://127.0.0.1:8000/api'): |
| self.base_url = base_url |
| self.results_dir = 'test_results1' |
| |
| os.makedirs(self.results_dir, exist_ok=True) |
|
|
| def test_translation_endpoint(self): |
| """Test the translation endpoint""" |
| endpoint = f'{self.base_url}/translate' |
| test_cases = [ |
| { |
| "user_message": "toilet me paani nahi aa rha hain", |
| "target_language": "en" |
| }, |
| { |
| "user_message": "AC not working properly", |
| "target_language": "hi" |
| }, |
| { |
| "user_message": "ਪੱਖਾ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ", |
| "target_language": "en" |
| } |
| ] |
|
|
| results = [] |
| for case in test_cases: |
| logger.info(f"\nTesting translation endpoint:") |
| logger.info(f"Input: {case}") |
| |
| try: |
| response = requests.post(endpoint, json=case) |
| result = response.json() |
| |
| logger.info(f"Status Code: {response.status_code}") |
| logger.info(f"Response: {result}") |
| |
| results.append({ |
| 'test_case': case, |
| 'status_code': response.status_code, |
| 'response': result |
| }) |
| |
| except Exception as e: |
| logger.error(f"Error testing translation: {str(e)}") |
| |
| time.sleep(1) |
| |
| return results |
|
|
| def test_sentiment_analysis_endpoint(self): |
| """Test the sentiment analysis endpoint""" |
| endpoint = f'{self.base_url}/analyze-sentiment' |
| test_cases = [ |
| { |
| "grievance_id": "G12347", |
| "text": "I am extremely frustrated with the constant power outages in my room." |
| }, |
| { |
| "grievance_id": "G12348", |
| "text": "Thank you for quickly fixing the water issue." |
| }, |
| { |
| "grievance_id": "G12349", |
| "text": "The AC has been making strange noises all night." |
| } |
| ] |
|
|
| results = [] |
| for case in test_cases: |
| logger.info(f"\nTesting sentiment analysis endpoint:") |
| logger.info(f"Input: {case}") |
| |
| try: |
| response = requests.post(endpoint, json=case) |
| result = response.json() |
| |
| logger.info(f"Status Code: {response.status_code}") |
| logger.info(f"Response: {result}") |
| |
| results.append({ |
| 'test_case': case, |
| 'status_code': response.status_code, |
| 'response': result |
| }) |
| |
| except Exception as e: |
| logger.error(f"Error testing sentiment analysis: {str(e)}") |
| |
| time.sleep(1) |
| |
| return results |
|
|
| def test_routing_endpoint(self): |
| """Test the grievance routing endpoint""" |
| endpoint = f'{self.base_url}/route-grievance' |
| test_cases = [ |
| { |
| "grievance_id": "G67890", |
| "category": "water_cooler", |
| "submission_timestamp": "2024-10-28T04:22:13Z", |
| "student_room_no": "148", |
| "hostel_name": "bh2", |
| "floor_number": 3, |
| "current_staff_status": [ |
| { |
| "staff_id": "S84148", |
| "department": "water_cooler", |
| "current_workload": 0, |
| "availability_status": "Unavailable", |
| "past_resolution_rate": 0.98 |
| }, |
| { |
| "staff_id": "S57369", |
| "department": "water_cooler", |
| "current_workload": 0, |
| "availability_status": "Available", |
| "past_resolution_rate": 0.96 |
| } |
| ], |
| "floor_metrics": { |
| "number_of_requests": 0, |
| "total_delays": 4 |
| }, |
| "availability_data": { |
| "staff_availability": [ |
| { |
| "staff_id": "S84148", |
| "time_slot": "08:00-12:00", |
| "availability_status": "Available" |
| } |
| ], |
| "student_availability": [ |
| { |
| "student_id": "STU200", |
| "time_slot": "16:00-20:00", |
| "availability_status": "Available" |
| } |
| ] |
| } |
| }, |
| { |
| "grievance_id": "G67891", |
| "category": "carpenter", |
| "submission_timestamp": "2024-10-28T04:18:13Z", |
| "student_room_no": "213", |
| "hostel_name": "bh1", |
| "floor_number": 2, |
| "current_staff_status": [ |
| { |
| "staff_id": "S52775", |
| "department": "carpenter", |
| "current_workload": 5, |
| "availability_status": "Unavailable", |
| "past_resolution_rate": 0.98 |
| }, |
| { |
| "staff_id": "S24943", |
| "department": "carpenter", |
| "current_workload": 3, |
| "availability_status": "Unavailable", |
| "past_resolution_rate": 0.85 |
| } |
| ], |
| "floor_metrics": { |
| "number_of_requests": 29, |
| "total_delays": 4 |
| }, |
| "availability_data": { |
| "staff_availability": [ |
| { |
| "staff_id": "S52775", |
| "time_slot": "12:00-16:00", |
| "availability_status": "Unavailable" |
| } |
| ], |
| "student_availability": [ |
| { |
| "student_id": "STU201", |
| "time_slot": "08:00-12:00", |
| "availability_status": "Available" |
| } |
| ] |
| } |
| }, |
| { |
| "grievance_id": "G67892", |
| "category": "electricity", |
| "submission_timestamp": "2024-10-28T04:00:13Z", |
| "student_room_no": "275", |
| "hostel_name": "bh3", |
| "floor_number": 2, |
| "current_staff_status": [ |
| { |
| "staff_id": "S33368", |
| "department": "electricity", |
| "current_workload": 1, |
| "availability_status": "Available", |
| "past_resolution_rate": 0.95 |
| }, |
| { |
| "staff_id": "S20522", |
| "department": "electricity", |
| "current_workload": 5, |
| "availability_status": "Available", |
| "past_resolution_rate": 0.87 |
| } |
| ], |
| "floor_metrics": { |
| "number_of_requests": 2, |
| "total_delays": 3 |
| }, |
| "availability_data": { |
| "staff_availability": [ |
| { |
| "staff_id": "S33368", |
| "time_slot": "12:00-16:00", |
| "availability_status": "Unavailable" |
| } |
| ], |
| "student_availability": [ |
| { |
| "student_id": "STU202", |
| "time_slot": "08:00-12:00", |
| "availability_status": "Unavailable" |
| } |
| ] |
| } |
| } |
| ] |
|
|
| results = [] |
| for case in test_cases: |
| logger.info(f"\nTesting routing endpoint:") |
| logger.info(f"Input: {case}") |
| |
| try: |
| response = requests.post(endpoint, json=case) |
| result = response.json() |
| |
| logger.info(f"Status Code: {response.status_code}") |
| logger.info(f"Response: {result}") |
| |
| results.append({ |
| 'test_case': case, |
| 'status_code': response.status_code, |
| 'response': result |
| }) |
| |
| except Exception as e: |
| logger.error(f"Error testing routing: {str(e)}") |
| |
| time.sleep(1) |
| |
| return results |
|
|
| def test_job_recommendation_endpoint(self): |
| """Test the job recommendation endpoint""" |
| endpoint = f'{self.base_url}/recommend-job' |
| test_cases = [ |
| { |
| "job_id": "J60000", |
| "type": "IT", |
| "description": "IT issue in room 358.", |
| "urgency_level": "Low", |
| "location": { |
| "hostel_name": "Hostel B", |
| "floor_number": 3, |
| "room_number": "358" |
| }, |
| "workers": [ |
| { |
| "worker_id": "W97053", |
| "department": "IT", |
| "current_workload": 3, |
| "availability_status": "Available", |
| "job_success_rate": 0.95, |
| "current_location": { |
| "hostel_name": "Hostel A", |
| "floor_number": 3, |
| "room_number": "468" |
| } |
| }, |
| { |
| "worker_id": "W97054", |
| "department": "IT", |
| "current_workload": 1, |
| "availability_status": "Available", |
| "job_success_rate": 0.92, |
| "current_location": { |
| "hostel_name": "Hostel B", |
| "floor_number": 3, |
| "room_number": "360" |
| } |
| } |
| ] |
| } |
| ] |
|
|
| results = [] |
| for case in test_cases: |
| logger.info(f"\nTesting job recommendation endpoint:") |
| logger.info(f"Input: {case}") |
| |
| try: |
| response = requests.post(endpoint, json=case) |
| result = response.json() |
| |
| logger.info(f"Status Code: {response.status_code}") |
| logger.info(f"Response: {result}") |
| |
| results.append({ |
| 'test_case': case, |
| 'status_code': response.status_code, |
| 'response': result |
| }) |
| |
| except Exception as e: |
| logger.error(f"Error testing job recommendation: {str(e)}") |
| |
| time.sleep(1) |
| |
| return results |
|
|
| def test_health_endpoint(self): |
| """Test the health check endpoint""" |
| endpoint = f'{self.base_url}/health' |
| |
| try: |
| response = requests.get(endpoint) |
| result = response.json() |
| |
| logger.info("\nTesting health endpoint:") |
| logger.info(f"Status Code: {response.status_code}") |
| logger.info(f"Response: {result}") |
| |
| return { |
| 'status_code': response.status_code, |
| 'response': result |
| } |
| |
| except Exception as e: |
| logger.error(f"Error testing health endpoint: {str(e)}") |
| return None |
|
|
| def run_all_tests(self): |
| """Run all endpoint tests""" |
| try: |
| |
| health_result = self.test_health_endpoint() |
| if not health_result or health_result['status_code'] != 200: |
| logger.error("Health check failed. Skipping other tests.") |
| return |
| |
| |
| results = { |
| 'timestamp': datetime.utcnow().isoformat(), |
| 'health_check': health_result, |
| 'translation_tests': self.test_translation_endpoint(), |
| 'sentiment_analysis_tests': self.test_sentiment_analysis_endpoint(), |
| 'routing_tests': self.test_routing_endpoint(), |
| 'job_recommendation_tests': self.test_job_recommendation_endpoint() |
| } |
| |
| |
| try: |
| results_file = os.path.join(self.results_dir, 'endpoint_test_results.json') |
| with open(results_file, 'w', encoding='utf-8') as f: |
| json.dump(results, f, indent=2, ensure_ascii=False) |
| logger.info(f"Test results saved to {results_file}") |
| except Exception as e: |
| logger.error(f"Error saving results: {str(e)}") |
| |
| |
| logger.info("All tests completed successfully") |
| return results |
| |
| except Exception as e: |
| logger.error(f"Error running tests: {str(e)}") |
| return { |
| 'timestamp': datetime.utcnow().isoformat(), |
| 'error': str(e), |
| 'completed_tests': [] |
| } |
|
|
| def main(): |
| try: |
| tester = EndpointTester() |
| results = tester.run_all_tests() |
| |
| if not results: |
| logger.error("No test results available") |
| return |
| |
| |
| print("\nTest Results Summary:") |
| for test_type, test_results in results.items(): |
| if test_type in ['timestamp', 'error']: |
| continue |
| |
| print(f"\n{test_type.replace('_', ' ').title()}:") |
| if isinstance(test_results, list): |
| success = sum(1 for r in test_results if r['status_code'] == 200) |
| total = len(test_results) |
| print(f"Total: {total}") |
| print(f"Successful: {success}") |
| print(f"Failed: {total - success}") |
| else: |
| status = test_results.get('status_code') == 200 if test_results else False |
| print(f"Status: {'Success' if status else 'Failed'}") |
| |
| except Exception as e: |
| logger.error(f"Error in main: {str(e)}") |
| raise |
|
|
| if __name__ == "__main__": |
| main() |
|
|