feat: queue voice session cover generation jobs
This commit is contained in:
@@ -8,7 +8,7 @@ from httpx import ASGITransport, AsyncClient
|
||||
from sqlalchemy import select
|
||||
|
||||
from app.db.database import get_db
|
||||
from app.db.models import GenerationJob, GenerationJobEvent
|
||||
from app.db.models import GenerationJob, GenerationJobEvent, Story
|
||||
from app.main import app
|
||||
from app.services.adapters import AdapterConfig
|
||||
from app.services.adapters.storybook.primary import Storybook, StorybookPage
|
||||
@@ -20,7 +20,7 @@ from app.services.generation_jobs import (
|
||||
mark_stale_generation_jobs,
|
||||
record_generation_event,
|
||||
)
|
||||
from app.services.story_service import run_generation_job_service
|
||||
from app.services.story_service import queue_story_asset_generation, run_generation_job_service
|
||||
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
@@ -225,6 +225,86 @@ async def test_asset_retry_records_job_events_and_updates_retryable_assets(
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
|
||||
async def test_queue_story_asset_generation_dispatches_background_job(
|
||||
db_session,
|
||||
test_story,
|
||||
):
|
||||
task_delay_path = "app.tasks.generation_workflow.run_generation_workflow_task.delay"
|
||||
|
||||
with patch(task_delay_path) as mock_delay:
|
||||
summary = await queue_story_asset_generation(
|
||||
test_story.id,
|
||||
test_story.user_id,
|
||||
["image"],
|
||||
db_session,
|
||||
)
|
||||
|
||||
assert summary["output_mode"] == "asset_generation"
|
||||
assert summary["input_type"] == "image"
|
||||
assert summary["status"] == "running"
|
||||
assert summary["current_step"] == "request_accepted"
|
||||
mock_delay.assert_called_once_with(summary["id"])
|
||||
|
||||
job = (
|
||||
await db_session.execute(
|
||||
select(GenerationJob).where(GenerationJob.id == summary["id"])
|
||||
)
|
||||
).scalar_one()
|
||||
assert job.story_id == test_story.id
|
||||
assert job.output_mode == "asset_generation"
|
||||
|
||||
|
||||
async def test_asset_generation_job_worker_completes_cover_image(
|
||||
db_session,
|
||||
test_story,
|
||||
):
|
||||
job = await create_generation_job(
|
||||
db_session,
|
||||
user_id=test_story.user_id,
|
||||
output_mode="asset_generation",
|
||||
input_type="image",
|
||||
request_payload={"story_id": test_story.id, "assets": ["image"]},
|
||||
story_id=test_story.id,
|
||||
)
|
||||
|
||||
with patch(
|
||||
"app.services.story_service.generate_image",
|
||||
new_callable=AsyncMock,
|
||||
) as mock_generate_image:
|
||||
mock_generate_image.return_value = "https://example.com/async-cover.png"
|
||||
|
||||
await run_generation_job_service(job.id, db_session)
|
||||
|
||||
refreshed_job = (
|
||||
await db_session.execute(select(GenerationJob).where(GenerationJob.id == job.id))
|
||||
).scalar_one()
|
||||
assert refreshed_job.status == "completed"
|
||||
assert refreshed_job.current_step == "asset_generation_completed"
|
||||
assert refreshed_job.result_snapshot["image_status"] == "ready"
|
||||
|
||||
story = (
|
||||
await db_session.execute(
|
||||
select(Story).where(Story.id == test_story.id)
|
||||
)
|
||||
).scalar_one()
|
||||
assert story.image_url == "https://example.com/async-cover.png"
|
||||
|
||||
events = (
|
||||
await db_session.execute(
|
||||
select(GenerationJobEvent)
|
||||
.where(GenerationJobEvent.job_id == job.id)
|
||||
.order_by(GenerationJobEvent.id)
|
||||
)
|
||||
).scalars().all()
|
||||
assert [event.event_type for event in events] == [
|
||||
"request_accepted",
|
||||
"worker_started",
|
||||
"cover_image_started",
|
||||
"cover_image_succeeded",
|
||||
"asset_generation_completed",
|
||||
]
|
||||
|
||||
|
||||
async def test_storybook_generation_is_queued_then_worker_records_page_image_events(
|
||||
db_session,
|
||||
auth_token,
|
||||
|
||||
Reference in New Issue
Block a user