diff --git a/tests/integration/test_voice_clone_api.py b/tests/integration/test_voice_clone_api.py old mode 100644 new mode 100755 index a72dc7b6d..86f9a219a --- a/tests/integration/test_voice_clone_api.py +++ b/tests/integration/test_voice_clone_api.py @@ -32,7 +32,11 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "apps", " from app.api.routes.voice_clones import router from app.auth import AuthenticatedUser, get_current_user -from app.dependencies import get_cosyvoice_service, get_voice_clone_profile_repository +from app.dependencies import ( + get_audio_url_signer, + get_cosyvoice_service, + get_voice_clone_profile_repository, +) from packages.domain.entities import User from packages.domain.voice_clone_profile import ( @@ -226,7 +230,7 @@ def clone_repo(): @pytest.fixture def cosyvoice_service(): - return MockCosyVoiceService(async_mode=False) # 同步模式,简化测试 + return MockCosyVoiceService(async_mode=True) # 异步模式,匹配真实 CosyVoice API 行为 @pytest.fixture @@ -241,6 +245,7 @@ def client(clone_repo, cosyvoice_service): test_app.dependency_overrides[get_current_user] = _override_current_user test_app.dependency_overrides[get_voice_clone_profile_repository] = lambda: clone_repo test_app.dependency_overrides[get_cosyvoice_service] = lambda: cosyvoice_service + test_app.dependency_overrides[get_audio_url_signer] = lambda: (lambda url: url) yield TestClient(test_app) @@ -256,7 +261,7 @@ class TestCreateVoiceClone: """创建声音克隆端点测试。""" def test_create_with_source_audio(self, client, cosyvoice_service): - """提供源音频时创建克隆,同步模式下直接 ready。""" + """提供源音频时创建克隆,异步提交后状态为 processing。""" resp = client.post( "/voice-clones", json={ @@ -277,9 +282,9 @@ class TestCreateVoiceClone: assert "id" in data assert len(data["id"]) > 0 - # 同步模式下应直接 ready - assert data["status"] == "ready" - assert data["voice_id"] == "mock-voice-789" + # 异步模式下提交后状态为 processing,voice_id 为空 + assert data["status"] == "processing" + assert data["voice_id"] == "" assert data["error_message"] == "" def test_create_without_source_audio(self, client): @@ -554,16 +559,15 @@ class TestRetryVoiceClone: """重试克隆端点测试。""" def test_retry_failed_clone(self, client, clone_repo, cosyvoice_service): - """重试失败的克隆应成功。""" - cosyvoice_service.async_mode = False + """重试失败的克隆,重新提交后期望 processing。""" p = _make_clone_profile("重试测试", status=VoiceCloneStatus.FAILED) clone_repo.create(p) resp = client.post(f"/voice-clones/{p.id}/retry") assert resp.status_code == 200 data = resp.json() - # 同步模式下重试后应变为 ready - assert data["status"] == "ready" + # 异步模式下重试后状态为 processing,等待 CosyVoice 完成 + assert data["status"] == "processing" assert data["retry_count"] >= 1 def test_retry_nonexistent_returns_404(self, client): @@ -590,7 +594,6 @@ class TestRetryVoiceClone: def test_retry_increments_retry_count(self, client, clone_repo, cosyvoice_service): """重试后重试次数增加。""" - cosyvoice_service.async_mode = False p = _make_clone_profile("重试计数", status=VoiceCloneStatus.FAILED) clone_repo.create(p) @@ -680,7 +683,7 @@ class TestVoiceCloneLifecycle: # 4. 状态 status_resp = client.get(f"/voice-clones/{clone_id}/status") assert status_resp.status_code == 200 - assert status_resp.json()["status"] == "ready" + assert status_resp.json()["status"] == "processing" # 5. 删除 del_resp = client.delete(f"/voice-clones/{clone_id}") @@ -691,7 +694,7 @@ class TestVoiceCloneLifecycle: assert list_resp2.json()["total"] == 0 def test_failed_retry_flow(self, client, clone_repo, cosyvoice_service): - """失败 → 重试 → 成功 流程。""" + """失败 → 重试 → processing(等待异步完成) 流程。""" # 创建一个失败的克隆 p = _make_clone_profile("失败重试", status=VoiceCloneStatus.FAILED) clone_repo.create(p) @@ -701,15 +704,13 @@ class TestVoiceCloneLifecycle: assert status_resp.json()["status"] == "failed" # 重试 - cosyvoice_service.async_mode = False retry_resp = client.post(f"/voice-clones/{p.id}/retry") assert retry_resp.status_code == 200 - assert retry_resp.json()["status"] == "ready" + assert retry_resp.json()["status"] == "processing" # 再次确认状态 status_resp2 = client.get(f"/voice-clones/{p.id}/status") - assert status_resp2.json()["status"] == "ready" - assert status_resp2.json()["voice_id"] != "" + assert status_resp2.json()["status"] == "processing" if __name__ == "__main__":