package server import "testing" func TestConfigFromEnvDefaultsVideoRouteToViduQ2(t *testing.T) { t.Setenv("POPIART_DEFAULT_VIDEO_MODEL", "") t.Setenv("POPIART_DEFAULT_IMAGE_MODEL", "") t.Setenv("POPIART_NEWAPI_BASE_URL", "") t.Setenv("POPIART_NEWAPI_TOKEN", "") t.Setenv("POPIART_DATA_DIR", "") t.Setenv("POPIART_SQLITE_PATH", "") t.Setenv("POPIART_SESSION_SECRET", "") t.Setenv("POPIART_SKILLHUB_DIR", "") cfg := ConfigFromEnv() if cfg.DefaultVideoModel != "viduq2" { t.Fatalf("expected default video model viduq2, got %q", cfg.DefaultVideoModel) } if cfg.DefaultImageModel != "gemini-3.1-flash-image-preview" { t.Fatalf("expected default image model gemini-3.1-flash-image-preview, got %q", cfg.DefaultImageModel) } } func TestInferRouteKeyForModelRecognizesViduAsVideo(t *testing.T) { cases := map[string]string{ "viduq2": "video.image2video", "vidu2.0": "video.image2video", "sora-2": "video.image2video", "runway-gen4": "video.image2video", "T2V-01": "video.image2video", "I2V-01": "video.image2video", "S2V-01": "video.image2video", "MiniMax-Hailuo-2.3": "video.image2video", "MiniMax-Hailuo-02": "video.image2video", "doubao-seedance-2-0-260128": "video.image2video", "seedance-2-0-fast-260128": "video.image2video", "jimeng_dreamactor_m20_gen_video": "video.image2video", "jimeng_i2v_first_v30": "video.image2video", "gpt-image-1": "image.text2image", } for modelID, want := range cases { if got := inferRouteKeyForModel(modelID, nil); got != want { t.Fatalf("inferRouteKeyForModel(%q) = %q, want %q", modelID, got, want) } } } func TestInferRouteKeyForModelRecognizesImageEditInputs(t *testing.T) { cases := []map[string]any{ {"image": "https://example.com/reference.jpg"}, {"image_url": "https://example.com/reference.jpg"}, {"reference_image_url": "https://example.com/reference.jpg"}, {"source_artifact_id": "art_123"}, } for _, input := range cases { if got := inferRouteKeyForModel("seedream-4-5-251128", input); got != "image.img2img" { t.Fatalf("inferRouteKeyForModel(seedream, %#v) = %q, want image.img2img", input, got) } } } func TestInferRouteKeyForModelRecognizesMusic(t *testing.T) { cases := []string{ "music-2.6", "music-2.6-free", "music-cover", "music-cover-free", } for _, modelID := range cases { if got := inferRouteKeyForModel(modelID, nil); got != "music.generate" { t.Fatalf("inferRouteKeyForModel(%q) = %q, want music.generate", modelID, got) } } if got := inferRouteKeyForModelType("custom-model", "music", nil); got != "music.generate" { t.Fatalf("inferRouteKeyForModelType(custom-model, music) = %q, want music.generate", got) } } func TestInferRouteKeyForModelRecognizesSpeech(t *testing.T) { if got := inferRouteKeyForModel("speech-2.8-hd", nil); got != "speech.synthesize" { t.Fatalf("inferRouteKeyForModel(speech-2.8-hd) = %q, want speech.synthesize", got) } if got := inferRouteKeyForModelType("custom-model", "speech", nil); got != "speech.synthesize" { t.Fatalf("inferRouteKeyForModelType(custom-model, speech) = %q, want speech.synthesize", got) } }