Files
ttstd-infinite-canvas/backend/internal/protocol/dola_pool_video_test.go
ddcat666 f030204541 feat(media): Dola-pool 视频插件 - 新增独立 Seedance 任务协议并避免 Kling 轮询路径不兼容
新增 Dola-pool 官方插件包,按其接口文档配置创建、轮询和视频下载路径,并补充显式 duration、参考图映射与协议契约测试。
2026-10-02 18:10:34 +08:00

83 lines
3.0 KiB
Go

package protocol
import (
"context"
"testing"
)
func TestOfficialDolaPoolVideoProfile(t *testing.T) {
adapter := officialPackageAdapter(t, "dola-pool.yingce-plugin", "dola-pool")
request := GenerationRequest{
Capability: CapabilityVideo,
Model: "seedance-2.5",
Prompt: "A cat chasing butterflies in a meadow",
Duration: 30,
AspectRatio: "720x1280",
Images: []MediaReference{{URL: "https://assets.example/character.png", Kind: "image"}},
}
create, err := adapter.BuildCreate(context.Background(), RequestContext{Request: request})
if err != nil {
t.Fatal(err)
}
if create.Method != "POST" || create.Path != "/v1/videos/generations" || create.ContentType != "application/json" {
t.Fatalf("Dola-pool create = %#v", create)
}
body := manifestTestBody(t, create)
if body["model"] != request.Model || body["prompt"] != request.Prompt || body["duration"] != float64(30) {
t.Fatalf("Dola-pool create body = %#v", body)
}
if body["ratio"] != request.AspectRatio || body["size"] != request.AspectRatio {
t.Fatalf("Dola-pool frame fields = %#v", body)
}
images, _ := body["reference_images"].([]any)
if len(images) != 1 || images[0] != request.Images[0].URL {
t.Fatalf("Dola-pool reference_images = %#v", images)
}
created, err := adapter.ParseCreate(context.Background(), []byte(`{"id":"video-task-1","status":"queued"}`))
if err != nil {
t.Fatal(err)
}
if created.TaskID != "video-task-1" || created.Status != StatusPending {
t.Fatalf("Dola-pool create result = %#v", created)
}
poll, err := adapter.BuildPoll(context.Background(), PollContext{TaskID: created.TaskID})
if err != nil {
t.Fatal(err)
}
if poll.Method != "GET" || poll.Path != "/v1/videos/video-task-1" {
t.Fatalf("Dola-pool poll = %#v", poll)
}
state, err := adapter.ParsePoll(context.Background(), PollContext{TaskID: created.TaskID}, []byte(`{"id":"video-task-1","status":"completed","video_url":"https://dolasd.xyz/videos/result.mp4"}`))
if err != nil {
t.Fatal(err)
}
if state.Status != StatusSucceeded || state.Result == nil || len(state.Result.Videos) != 1 || state.Result.Videos[0].URL != "https://dolasd.xyz/videos/result.mp4" {
t.Fatalf("Dola-pool poll result = %#v", state)
}
resultAdapter, ok := adapter.(ResultAdapter)
if !ok {
t.Fatal("Dola-pool adapter does not expose binary result download")
}
result, err := resultAdapter.BuildResult(context.Background(), PollContext{TaskID: created.TaskID})
if err != nil {
t.Fatal(err)
}
if result.Method != "GET" || result.Path != "/v1/videos/video-task-1/content" || result.Headers["Accept"] != "video/mp4" {
t.Fatalf("Dola-pool result download = %#v", result)
}
}
func TestOfficialDolaPoolRequiresExplicitDuration(t *testing.T) {
adapter := officialPackageAdapter(t, "dola-pool.yingce-plugin", "dola-pool")
_, err := adapter.BuildCreate(context.Background(), RequestContext{Request: GenerationRequest{
Model: "seedance-2.5",
Prompt: "A cat chasing butterflies in a meadow",
}})
if err == nil {
t.Fatal("Dola-pool accepted a request without an explicit duration")
}
}