| import importlib |
| import sys |
| from types import SimpleNamespace |
|
|
| import pytest |
|
|
| import gradio as gr |
|
|
|
|
| def test_start_render_api_registers_one_streamed_output() -> None: |
| sys.modules.pop("app", None) |
| module = importlib.import_module("app") |
|
|
| with gr.Blocks() as demo: |
| dependency = gr.api(module.start_render_api, api_name="start_render") |
|
|
| assert dependency.get("outputs") |
| assert len(dependency["outputs"]) == 1 |
|
|
|
|
| def test_start_render_api_adds_public_audio_url_to_completed_chapters(monkeypatch) -> None: |
| sys.modules.pop("app", None) |
| module = importlib.import_module("app") |
|
|
| class FakePipeline: |
| def get_job(self, session_id): |
| return SimpleNamespace(status="idle") |
|
|
| def render(self, **kwargs): |
| yield { |
| "type": "chapter_done", |
| "session_id": kwargs["session_id"], |
| "chapter_id": "c1", |
| "duration_seconds": 12, |
| "overall_progress": 0.5, |
| "output_path": "/tmp/scriptorium/session-a/renders/001-c1.wav", |
| } |
| yield { |
| "type": "completed", |
| "session_id": kwargs["session_id"], |
| "outputs": ["/tmp/scriptorium/session-a/renders/001-c1.wav"], |
| } |
|
|
| monkeypatch.setattr(module, "pipeline", FakePipeline()) |
| monkeypatch.setattr(module, "_selected_book", lambda session_id, selected_ids: {"chapters": [{"id": "c1", "included": True}]}) |
| monkeypatch.setattr(module, "_voice_config_for_backend", lambda voice_config, session_id: voice_config) |
| monkeypatch.setattr(module.store, "save_json", lambda *args, **kwargs: None) |
|
|
| events = list( |
| module.start_render_api( |
| session_id="session-a", |
| selected_chapter_ids=["c1"], |
| voice_config={"mode": "auto"}, |
| diffusion_steps=32, |
| speed=1.0, |
| ) |
| ) |
|
|
| chapter_done = events[0] |
| assert chapter_done["type"] == "chapter_done" |
| assert chapter_done["url"] == "/files/session-a/renders/001-c1.wav" |
|
|