You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.8 KiB
114 lines
2.8 KiB
package server
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestExecuteImageToImageJobUsesGenerationsPathForMiniMax(t *testing.T) {
|
|
var gotPath string
|
|
var gotBody map[string]any
|
|
|
|
var apiSrv *httptest.Server
|
|
apiSrv = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
switch r.URL.Path {
|
|
case "/reference.png":
|
|
w.Header().Set("Content-Type", "image/png")
|
|
_, _ = w.Write(tinyPNG(t))
|
|
case "/v1/images/generations":
|
|
gotPath = r.URL.Path
|
|
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(`{
|
|
"created": 1711234567,
|
|
"data": [{"url":"` + strings.TrimRight(apiSrv.URL, "/") + `/generated.png"}]
|
|
}`))
|
|
case "/generated.png":
|
|
w.Header().Set("Content-Type", "image/png")
|
|
_, _ = w.Write(tinyPNG(t))
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
}))
|
|
defer apiSrv.Close()
|
|
|
|
cfg := Config{
|
|
NewAPIBaseURL: apiSrv.URL,
|
|
SQLitePath: filepath.Join(t.TempDir(), "popiart.db"),
|
|
SkillhubDir: makeEmptySkillhub(t),
|
|
SessionSecret: "test-secret",
|
|
PublicBaseURL: "http://127.0.0.1:8080",
|
|
}
|
|
server, err := NewWithConfig(cfg)
|
|
if err != nil {
|
|
t.Fatalf("NewWithConfig: %v", err)
|
|
}
|
|
server.newapi.httpClient = apiSrv.Client()
|
|
|
|
sessionToken, _, 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")
|
|
}
|
|
current, exists, err := server.store.session(sessionToken)
|
|
if err != nil {
|
|
t.Fatalf("load session: %v", err)
|
|
}
|
|
if !exists {
|
|
t.Fatal("expected stored session")
|
|
}
|
|
|
|
record, _, err := server.store.createJob(
|
|
"",
|
|
"image.img2img",
|
|
"image-01",
|
|
"sync_result",
|
|
map[string]any{
|
|
"prompt": "turn this into a poster",
|
|
"image": apiSrv.URL + "/reference.png",
|
|
"aspect_ratio": "3:4",
|
|
"response_format": "url",
|
|
},
|
|
"",
|
|
"normal",
|
|
"",
|
|
current,
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("createJob: %v", err)
|
|
}
|
|
|
|
server.executeImageToImageJob(record)
|
|
|
|
if gotPath != "/v1/images/generations" {
|
|
t.Fatalf("expected minimax img2img to use /v1/images/generations, got %q", gotPath)
|
|
}
|
|
if gotBody["model"] != "image-01" {
|
|
t.Fatalf("unexpected model payload: %#v", gotBody["model"])
|
|
}
|
|
if gotBody["image"] != apiSrv.URL+"/reference.png" {
|
|
t.Fatalf("expected generations payload image field, got %#v", gotBody["image"])
|
|
}
|
|
|
|
done, exists, err := server.store.getJob(current.User.ID, record.JobID)
|
|
if err != nil {
|
|
t.Fatalf("getJob: %v", err)
|
|
}
|
|
if !exists {
|
|
t.Fatal("expected stored job")
|
|
}
|
|
if done.Status != "done" {
|
|
t.Fatalf("expected job done, got %#v", done.Status)
|
|
}
|
|
if len(done.ArtifactIDs) != 1 {
|
|
t.Fatalf("expected one artifact id, got %#v", done.ArtifactIDs)
|
|
}
|
|
}
|
|
|