Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| Test script for Hiroyuki SLM and API | |
| """ | |
| import requests | |
| import json | |
| import sys | |
| import time | |
| import argparse | |
| import subprocess | |
| API_BASE = "http://localhost:8080" | |
| def test_health(): | |
| """Test health endpoint""" | |
| print("\n=== Testing /health ===") | |
| try: | |
| response = requests.get(f"{API_BASE}/health", timeout=5) | |
| assert response.status_code == 200 | |
| data = response.json() | |
| assert data['status'] == 'healthy' | |
| print(f"✓ Health check passed: {data}") | |
| return True | |
| except Exception as e: | |
| print(f"✗ Health check failed: {e}") | |
| return False | |
| def test_models_info(): | |
| """Test models info endpoint""" | |
| print("\n=== Testing /models/info ===") | |
| try: | |
| response = requests.get(f"{API_BASE}/models/info", timeout=5) | |
| assert response.status_code == 200 | |
| data = response.json() | |
| print(f"✓ Models info: {data}") | |
| return True | |
| except Exception as e: | |
| print(f"✗ Models info failed: {e}") | |
| return False | |
| def test_exact_match(): | |
| """Test exact match responses""" | |
| print("\n=== Testing Exact Match Responses ===") | |
| test_cases = [ | |
| ("嘘", "嘘 related"), | |
| ("データ", "データ related"), | |
| ("学校", "学校 related"), | |
| ("Programming", None), # Should use SLM | |
| ] | |
| success = True | |
| for message, expected_key in test_cases: | |
| try: | |
| response = requests.post( | |
| f"{API_BASE}/chat", | |
| json={"message": message}, | |
| timeout=10 | |
| ) | |
| assert response.status_code == 200 | |
| data = response.json() | |
| print(f" Input: '{message}' -> Response: '{data['response'][:50]}...'") | |
| except Exception as e: | |
| print(f" ✗ Failed for '{message}': {e}") | |
| success = False | |
| return success | |
| def test_slm_generation(): | |
| """Test SLM generation""" | |
| print("\n=== Testing SLM Generation ===") | |
| test_messages = [ | |
| "こんにちは", | |
| "どう思いますか?", | |
| "プログラミングについて", | |
| "頭の悪い人について", | |
| "お前は馬鹿なのか?", | |
| ] | |
| success = True | |
| for message in test_messages: | |
| try: | |
| response = requests.post( | |
| f"{API_BASE}/chat", | |
| json={"message": message}, | |
| timeout=15 | |
| ) | |
| assert response.status_code == 200 | |
| data = response.json() | |
| print(f" Input: '{message}'") | |
| print(f" Output: '{data['response'][:60]}...'") | |
| print() | |
| except Exception as e: | |
| print(f" ✗ Failed for '{message}': {e}") | |
| success = False | |
| return success | |
| def test_error_cases(): | |
| """Test error handling""" | |
| print("\n=== Testing Error Cases ===") | |
| # Missing message | |
| try: | |
| response = requests.post(f"{API_BASE}/chat", json={}, timeout=5) | |
| assert response.status_code == 400 | |
| print("✓ Missing message correctly rejected") | |
| except Exception as e: | |
| print(f"✗ Missing message test failed: {e}") | |
| return False | |
| # Invalid message type | |
| try: | |
| response = requests.post(f"{API_BASE}/chat", json={"message": 123}, timeout=5) | |
| assert response.status_code == 400 | |
| print("✓ Invalid message type correctly rejected") | |
| except Exception as e: | |
| print(f"✗ Invalid message type test failed: {e}") | |
| return False | |
| return True | |
| def run_all_tests(): | |
| """Run all tests""" | |
| print("=" * 50) | |
| print("Hiroyuki SLM API Test Suite") | |
| print("=" * 50) | |
| # Wait for server to be ready | |
| print("\nWaiting for API server...") | |
| max_retries = 10 | |
| for i in range(max_retries): | |
| try: | |
| requests.get(f"{API_BASE}/health", timeout=2) | |
| print("API server is ready!") | |
| break | |
| except: | |
| if i < max_retries - 1: | |
| time.sleep(1) | |
| else: | |
| print("ERROR: API server not responding") | |
| print("Make sure the server is running: python api.py") | |
| sys.exit(1) | |
| # Run tests | |
| results = [] | |
| results.append(("Health", test_health())) | |
| results.append(("Models Info", test_models_info())) | |
| results.append(("Exact Match", test_exact_match())) | |
| results.append(("SLM Generation", test_slm_generation())) | |
| results.append(("Error Cases", test_error_cases())) | |
| # Summary | |
| print("\n" + "=" * 50) | |
| print("Test Summary") | |
| print("=" * 50) | |
| passed = sum(1 for _, r in results if r) | |
| total = len(results) | |
| for name, result in results: | |
| status = "✓ PASS" if result else "✗ FAIL" | |
| print(f" {name}: {status}") | |
| print(f"\nTotal: {passed}/{total} tests passed") | |
| return passed == total | |
| if __name__ == '__main__': | |
| parser = argparse.ArgumentParser(description='Test script for Hiroyuki SLM and API') | |
| parser.add_argument('--standalone', action='store_true', help='Run API server, test, and shutdown') | |
| parser.add_argument('--api-base', default='http://localhost:8080', help='API base URL') | |
| args = parser.parse_args() | |
| API_BASE = args.api_base | |
| if args.standalone: | |
| print("Starting API server in standalone mode...") | |
| server_process = subprocess.Popen([sys.executable, 'api.py']) | |
| time.sleep(5) # Wait for server to start | |
| try: | |
| success = run_all_tests() | |
| finally: | |
| print("Shutting down API server...") | |
| server_process.terminate() | |
| server_process.wait() | |
| else: | |
| success = run_all_tests() | |
| sys.exit(0 if success else 1) | |