import json from pathlib import Path import pytest def test_health(client): response = client.get("/health") assert response.status_code == 200 payload = response.get_json() assert payload["status"] == "healthy" assert payload["streaming_enabled"] is True def test_voice_detection_success_with_sample_base64(client, api_headers, sample_audio_base64): payload = { "language": "English", "audioFormat": "mp3", "audioBase64": sample_audio_base64 } response = client.post("/api/voice-detection", data=json.dumps(payload), headers=api_headers) assert response.status_code == 200 data = response.get_json() assert data["status"] == "success" assert data["classification"] == "AI_GENERATED" def test_voice_detection_success_with_test_audio(client, api_headers, test_audio_base64): path, audio_b64 = test_audio_base64 if path.suffix.lower() != ".mp3": pytest.skip("test_audio file is not mp3 (endpoint only supports mp3).") payload = { "language": "English", "audioFormat": "mp3", "audioBase64": audio_b64 } response = client.post("/api/voice-detection", data=json.dumps(payload), headers=api_headers) assert response.status_code == 200 data = response.get_json() assert data["status"] == "success" def test_voice_detection_missing_api_key(client, sample_audio_base64): payload = { "language": "English", "audioFormat": "mp3", "audioBase64": sample_audio_base64 } response = client.post("/api/voice-detection", json=payload) assert response.status_code == 401 def test_voice_detection_invalid_api_key(client, api_headers, sample_audio_base64): payload = { "language": "English", "audioFormat": "mp3", "audioBase64": sample_audio_base64 } headers = dict(api_headers) headers["x-api-key"] = "wrong_key" response = client.post("/api/voice-detection", json=payload, headers=headers) assert response.status_code == 403 def test_voice_detection_invalid_content_type(client, api_headers): response = client.post("/api/voice-detection", data="not json", headers=api_headers) assert response.status_code == 400 def test_voice_detection_missing_fields(client, api_headers): payload = {"language": "English"} response = client.post("/api/voice-detection", json=payload, headers=api_headers) assert response.status_code == 400 def test_voice_detection_unsupported_language(client, api_headers, sample_audio_base64): payload = { "language": "Spanish", "audioFormat": "mp3", "audioBase64": sample_audio_base64 } response = client.post("/api/voice-detection", json=payload, headers=api_headers) assert response.status_code == 400 def test_voice_detection_unsupported_audio_format(client, api_headers, sample_audio_base64): payload = { "language": "English", "audioFormat": "wav", "audioBase64": sample_audio_base64 } response = client.post("/api/voice-detection", json=payload, headers=api_headers) assert response.status_code == 400 def test_voice_detection_invalid_audio_payload(client, api_headers): payload = { "language": "English", "audioFormat": "mp3", "audioBase64": "short" } response = client.post("/api/voice-detection", json=payload, headers=api_headers) assert response.status_code == 400 def test_voice_detection_analysis_error(app_module, client, api_headers, sample_audio_base64): def error_analyze(*args, **kwargs): return {"status": "error", "error": "boom"} app_module.detector.analyze = error_analyze payload = { "language": "English", "audioFormat": "mp3", "audioBase64": sample_audio_base64 } response = client.post("/api/voice-detection", json=payload, headers=api_headers) assert response.status_code == 500 def test_reload_calibration_not_found(client, api_headers): response = client.post("/api/reload-calibration", headers=api_headers) assert response.status_code == 404 def test_reload_calibration_success(app_module, client, api_headers): calibration_file = Path(app_module.CALIBRATION_PATH) calibration_file.parent.mkdir(parents=True, exist_ok=True) calibration_file.write_text("{}", encoding="utf-8") response = client.post("/api/reload-calibration", headers=api_headers) assert response.status_code == 200 def test_backup_and_rollback_calibration(app_module, client, api_headers): calibration_file = Path(app_module.CALIBRATION_PATH) calibration_file.parent.mkdir(parents=True, exist_ok=True) calibration_file.write_text('{"version": "original"}', encoding="utf-8") backup_response = client.post("/api/backup-calibration", headers=api_headers) assert backup_response.status_code == 200 backup_payload = backup_response.get_json() version_id = backup_payload["versionId"] calibration_file.write_text('{"version": "new"}', encoding="utf-8") rollback_response = client.post( "/api/rollback-calibration", json={"versionId": version_id}, headers=api_headers ) assert rollback_response.status_code == 200 assert calibration_file.read_text(encoding="utf-8") == '{"version": "original"}' def test_backup_calibration_missing_file(client, api_headers): response = client.post("/api/backup-calibration", headers=api_headers) assert response.status_code == 404 def test_rollback_calibration_missing_version(client, api_headers): response = client.post("/api/rollback-calibration", json={}, headers=api_headers) assert response.status_code == 400 def test_calibration_history_list(app_module, client, api_headers): history_dir = Path(app_module.CALIBRATION_HISTORY_DIR) history_dir.mkdir(parents=True, exist_ok=True) history_file = history_dir / "calibration_20260207T120000Z_deadbeef.json" history_file.write_text("{}", encoding="utf-8") response = client.get("/api/calibration-history", headers=api_headers) assert response.status_code == 200 payload = response.get_json() assert payload["status"] == "success" assert payload["history"]