@ -405,6 +405,33 @@ func TestSubmitSeedanceVideoTaskUsesVideoGenerationsEndpoint(t *testing.T) {
}
}
}
}
func TestSubmitSeedanceVideoTaskNormalizesFriendlyModelAlias ( t * testing . T ) {
var gotBody map [ string ] any
srv := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
if err := json . NewDecoder ( r . Body ) . Decode ( & gotBody ) ; err != nil {
t . Fatalf ( "decode request body: %v" , err )
}
w . Header ( ) . Set ( "Content-Type" , "application/json" )
_ , _ = w . Write ( [ ] byte ( ` { "id":"task_seedance_alias_123","status":"submitted"} ` ) )
} ) )
defer srv . Close ( )
client := newNewAPIClient ( Config { NewAPIBaseURL : srv . URL } )
taskID , err := client . submitSeedanceVideoTask ( context . Background ( ) , "sk-test" , "seedance2.0" , map [ string ] any {
"prompt" : "keep the motion natural" ,
"duration" : 5 ,
} )
if err != nil {
t . Fatalf ( "submitSeedanceVideoTask: %v" , err )
}
if taskID != "task_seedance_alias_123" {
t . Fatalf ( "unexpected task id: %q" , taskID )
}
if gotBody [ "model" ] != "doubao-seedance-2-0-260128" {
t . Fatalf ( "expected canonical Seedance model, got %#v" , gotBody [ "model" ] )
}
}
func TestHandleVideoGenerationsRelaysSeedanceRequest ( t * testing . T ) {
func TestHandleVideoGenerationsRelaysSeedanceRequest ( t * testing . T ) {
var gotBody map [ string ] any
var gotBody map [ string ] any
upstream := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
upstream := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
@ -466,6 +493,48 @@ func TestHandleVideoGenerationsRelaysSeedanceRequest(t *testing.T) {
}
}
}
}
func TestHandleVideoGenerationsNormalizesSeedanceAlias ( t * testing . T ) {
var gotBody map [ string ] any
upstream := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
if err := json . NewDecoder ( r . Body ) . Decode ( & gotBody ) ; err != nil {
t . Fatalf ( "decode upstream body: %v" , err )
}
w . Header ( ) . Set ( "Content-Type" , "application/json" )
_ , _ = w . Write ( [ ] byte ( ` { "code":"success","data": { "task_id":"task_seedance_alias_direct_123","status":"PENDING"}} ` ) )
} ) )
defer upstream . Close ( )
server , err := NewWithConfig ( Config {
NewAPIBaseURL : upstream . URL ,
SQLitePath : filepath . Join ( t . TempDir ( ) , "popiart.db" ) ,
SkillhubDir : makeEmptySkillhub ( t ) ,
SessionSecret : "test-secret" ,
} )
if err != nil {
t . Fatalf ( "NewWithConfig: %v" , err )
}
token , _ , ok , err := server . store . createSession ( "sk-test-upstream" )
if err != nil {
t . Fatalf ( "createSession: %v" , err )
}
if ! ok {
t . Fatal ( "expected session creation to succeed" )
}
req := httptest . NewRequest ( http . MethodPost , "/v1/video/generations" , strings . NewReader ( ` { "model":"seedance2.0","prompt":"ping"} ` ) )
req . Header . Set ( "Authorization" , "Bearer " + token )
req . Header . Set ( "Content-Type" , "application/json" )
rec := httptest . NewRecorder ( )
server . Handler ( ) . ServeHTTP ( rec , req )
if rec . Code != http . StatusAccepted {
t . Fatalf ( "expected 202, got %d body=%s" , rec . Code , rec . Body . String ( ) )
}
if gotBody [ "model" ] != "doubao-seedance-2-0-260128" {
t . Fatalf ( "expected canonical Seedance model, got %#v" , gotBody [ "model" ] )
}
}
func TestHandleVideoGenerationFetchSurfacesLastFrameURL ( t * testing . T ) {
func TestHandleVideoGenerationFetchSurfacesLastFrameURL ( t * testing . T ) {
upstream := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
upstream := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
if r . Method != http . MethodGet || r . URL . Path != "/v1/video/generations/task_seedance_direct_123" {
if r . Method != http . MethodGet || r . URL . Path != "/v1/video/generations/task_seedance_direct_123" {