101 lines
3.0 KiB
Go
101 lines
3.0 KiB
Go
package service
|
||
|
||
import (
|
||
"context"
|
||
"testing"
|
||
|
||
"infinite-canvas/backend/internal/model"
|
||
)
|
||
|
||
func TestCanRunProviderTaskRequiresVideoConfig(t *testing.T) {
|
||
tests := []struct {
|
||
name string
|
||
task model.Task
|
||
want bool
|
||
}{
|
||
{
|
||
name: "channel config",
|
||
task: model.Task{Type: "video_generate", InputJSON: `{"mode":"video","config":{"model":"veo","channelId":"channel-1"}}`},
|
||
want: true,
|
||
},
|
||
{
|
||
name: "direct config",
|
||
task: model.Task{Type: "video_generate", InputJSON: `{"mode":"video","config":{"model":"veo","baseUrl":"https://example.test","apiKey":"secret"}}`},
|
||
want: true,
|
||
},
|
||
{
|
||
name: "missing model",
|
||
task: model.Task{Type: "video_generate", InputJSON: `{"mode":"video","config":{"channelId":"channel-1"}}`},
|
||
want: false,
|
||
},
|
||
{
|
||
name: "missing direct credentials",
|
||
task: model.Task{Type: "video_generate", InputJSON: `{"mode":"video","config":{"model":"veo","baseUrl":"https://example.test"}}`},
|
||
want: false,
|
||
},
|
||
{
|
||
name: "non video task",
|
||
task: model.Task{Type: "agent_storyboard", InputJSON: `{"mode":"video","config":{"model":"veo","channelId":"channel-1"}}`},
|
||
want: false,
|
||
},
|
||
}
|
||
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
if got := canRunProviderTask(tt.task); got != tt.want {
|
||
t.Fatalf("canRunProviderTask() = %v, want %v", got, tt.want)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestProcessTaskRejectsVideoTaskWithoutProviderConfig(t *testing.T) {
|
||
svc := &Service{}
|
||
_, _, err := svc.processTask(context.Background(), model.Task{
|
||
Type: "video_generate",
|
||
InputJSON: `{"mode":"video","config":{"model":""}}`,
|
||
})
|
||
if err == nil {
|
||
t.Fatal("processTask() error = nil, want missing provider configuration error")
|
||
}
|
||
if err.Error() != "视频任务缺少可执行的模型配置" {
|
||
t.Fatalf("processTask() error = %q, want explicit provider configuration error", err)
|
||
}
|
||
}
|
||
|
||
func TestValidateTaskType(t *testing.T) {
|
||
tests := []struct {
|
||
name string
|
||
taskType string
|
||
wantErr bool
|
||
}{
|
||
{name: "missing", taskType: "", wantErr: true},
|
||
{name: "canvas image", taskType: "canvas_image"},
|
||
{name: "storyboard rows", taskType: "agent_storyboard_rows"},
|
||
{name: "video operation", taskType: "video_image_to_video"},
|
||
{name: "unknown canvas type", taskType: "canvas_unknown", wantErr: true},
|
||
{name: "unknown type", taskType: "workflow_router", wantErr: true},
|
||
}
|
||
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
if err := validateTaskType(tt.taskType); (err != nil) != tt.wantErr {
|
||
t.Fatalf("validateTaskType(%q) error = %v, wantErr %v", tt.taskType, err, tt.wantErr)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestProcessTaskRejectsUnknownType(t *testing.T) {
|
||
_, _, err := (&Service{}).processTask(context.Background(), model.Task{
|
||
Type: "workflow_router",
|
||
InputJSON: `{}`,
|
||
})
|
||
if err == nil {
|
||
t.Fatal("processTask() error = nil, want unsupported task type error")
|
||
}
|
||
if err.Error() != "不支持的任务类型:workflow_router" {
|
||
t.Fatalf("processTask() error = %q, want unsupported task type error", err)
|
||
}
|
||
}
|