Files
popiart-server/internal/server/routes_test.go
T
wtgoku 6ff9ad6997 Restore MiniMax media routing parity across image and video flows
The server now keeps portable image ratio normalization, enforces documented Seedream size presets, routes MiniMax img2img through generations-style payloads, and submits Hailuo video variants through the video generations API with proper reference-image handling.

Constraint: The deployed test chain relies on popiartServer as the lowest-risk place to adapt provider-specific routing without broad newapi changes
Rejected: Expand newapi relay modes for every MiniMax image/video branch | larger blast radius than needed for the verified server-managed flows
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: Keep MiniMax-specific media routing in popiartServer unless upstream newapi adapters are upgraded to the same contract
Tested: go test ./internal/server -run TestInferRouteKeyForModelRecognizesViduAsVideo|TestGenerate|TestResolve|TestSubmitMiniMaxVideoTask|TestExecuteImageToImageJobUsesGenerationsPathForMiniMax|TestExecuteImageToVideoJob|TestResolveVideoReferencesSupportsImagesArray
Not-tested: Full PopiNewAPI unit suite (blocked earlier by external module checksum drift in local checkout)
2026-04-15 11:57:05 +08:00

59 lines
2.0 KiB
Go

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",
"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)
}
}
}