feat: track generation jobs

This commit is contained in:
2026-04-18 16:29:22 +08:00
parent 16fafe0fe0
commit 96dfc677e2
18 changed files with 709 additions and 71 deletions

View File

@@ -72,23 +72,26 @@ story_json="$(post_json "$APP_URL/api/generations" '{
}')"
story_id="$(jq -r '.id' <<<"$story_json")"
assert_jq "$story_json" '.mode == "generated" and .generation_status == "narrative_ready"' "story should be readable before assets"
echo "$story_json" | jq '{id,title,mode,generation_status,image_status,audio_status}'
assert_jq "$story_json" '(.retryable_assets | index("image")) != null and (.retryable_assets | index("audio")) != null' "story should expose image/audio as retryable assets"
echo "$story_json" | jq '{id,title,mode,generation_status,image_status,audio_status,retryable_assets}'
say "Retrying story cover image"
story_image_json="$(post_json "$APP_URL/api/generations/$story_id/retry-assets" '{"assets":["image"]}')"
assert_jq "$story_image_json" '.image_status == "ready" and (.image_url != null)' "story cover should be ready after retry"
echo "$story_image_json" | jq '{id,title,generation_status,image_status,audio_status}'
assert_jq "$story_image_json" '(.retryable_assets | index("image")) == null and (.retryable_assets | index("audio")) != null' "story image retry should leave only audio retryable"
echo "$story_image_json" | jq '{id,title,generation_status,image_status,audio_status,retryable_assets}'
if [[ "$SMOKE_AUDIO" == "1" ]]; then
say "Retrying story audio"
story_audio_json="$(post_json "$APP_URL/api/generations/$story_id/retry-assets" '{"assets":["audio"]}')"
assert_jq "$story_audio_json" '.audio_status == "ready"' "story audio should be ready after retry"
assert_jq "$story_audio_json" '(.retryable_assets | length) == 0' "story should have no retryable assets after image and audio are ready"
audio_probe="$(curl -fsS -b "$COOKIE_JAR" -o /tmp/dreamweaver-smoke-audio.mp3 -w '%{http_code} %{content_type} %{size_download}' "$APP_URL/api/audio/$story_id")"
if [[ "$audio_probe" != 200\ audio/mpeg* ]]; then
echo "Unexpected audio response: $audio_probe" >&2
exit 1
fi
echo "$story_audio_json" | jq '{id,title,generation_status,image_status,audio_status}'
echo "$story_audio_json" | jq '{id,title,generation_status,image_status,audio_status,retryable_assets}'
else
say "Skipping audio smoke; set SMOKE_AUDIO=1 to include TTS"
fi
@@ -104,17 +107,19 @@ storybook_json="$(post_json "$APP_URL/api/generations" '{
}')"
storybook_id="$(jq -r '.id' <<<"$storybook_json")"
assert_jq "$storybook_json" '.mode == "storybook" and .image_status == "not_requested" and (.pages | length) >= 4' "storybook should be readable before images"
echo "$storybook_json" | jq '{id,title,mode,generation_status,image_status,audio_status,pages:(.pages | length)}'
assert_jq "$storybook_json" '(.retryable_assets | index("image")) != null and (.retryable_assets | index("audio")) == null' "storybook should expose images as retryable assets"
echo "$storybook_json" | jq '{id,title,mode,generation_status,image_status,audio_status,retryable_assets,pages:(.pages | length)}'
say "Retrying storybook images"
storybook_image_json="$(post_json "$APP_URL/api/generations/$storybook_id/retry-assets" '{"assets":["image"]}')"
assert_jq "$storybook_image_json" '.image_status == "ready" and (.pages | length) >= 4 and ([.pages[] | select(.image_url != null)] | length) == (.pages | length)' "storybook images should be ready after retry"
echo "$storybook_image_json" | jq '{id,title,generation_status,image_status,audio_status,pages:(.pages | length), ready_pages:([.pages[] | select(.image_url != null)] | length)}'
assert_jq "$storybook_image_json" '(.retryable_assets | length) == 0' "storybook should have no retryable assets after images are ready"
echo "$storybook_image_json" | jq '{id,title,generation_status,image_status,audio_status,retryable_assets,pages:(.pages | length), ready_pages:([.pages[] | select(.image_url != null)] | length)}'
say "Checking story list"
list_json="$(get_json "$APP_URL/api/stories?limit=5")"
assert_jq "$list_json" "map(.id) | index($story_id) != null" "story list should include generated story"
assert_jq "$list_json" "map(.id) | index($storybook_id) != null" "story list should include generated storybook"
echo "$list_json" | jq '.[] | {id,title,mode,generation_status,image_status,audio_status}'
echo "$list_json" | jq '.[] | {id,title,mode,generation_status,image_status,audio_status,retryable_assets}'
say "DreamWeaver demo smoke passed"