package controller import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/QuantumNous/new-api/model" "github.com/glebarez/sqlite" "github.com/stretchr/testify/require" "github.com/tidwall/gjson" "gorm.io/gorm" ) type manxueTestTransport func(*http.Request) (*http.Response, error) func (f manxueTestTransport) RoundTrip(r *http.Request) (*http.Response, error) { return f(r) } func TestManxuePublicDetectionResumesAndReturnsPublicURL(t *testing.T) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) require.NoError(t, err) conn, err := db.DB() require.NoError(t, err) conn.SetMaxOpenConns(1) oldDB, oldTransport := model.DB, http.DefaultTransport model.DB = db t.Cleanup(func() { model.DB = oldDB; http.DefaultTransport = oldTransport; _ = conn.Close() }) require.NoError(t, db.AutoMigrate(&model.DetectionRun{})) configCalls, createCalls := 0, 0 http.DefaultTransport = manxueTestTransport(func(r *http.Request) (*http.Response, error) { w := httptest.NewRecorder() w.Header().Set("Content-Type", "application/json") switch r.URL.Path { case "/api/visitor/config": configCalls++ http.SetCookie(w, &http.Cookie{Name: "gallery_visitor", Value: "test-session", Path: "/api/visitor/", Secure: true, HttpOnly: true}) _, _ = w.WriteString(`{"prompt":"pelican"}`) case "/api/visitor/tests": createCalls++ cookie, err := r.Cookie("gallery_visitor") require.NoError(t, err) require.Equal(t, "test-session", cookie.Value) require.Equal(t, "stable-key", r.Header.Get("Idempotency-Key")) var body map[string]any require.NoError(t, json.NewDecoder(r.Body).Decode(&body)) require.Equal(t, true, body["public"]) _, _ = w.WriteString(`{"id":"remote-one","status":"running"}`) case "/api/visitor/tests/remote-one": _, err := r.Cookie("gallery_visitor") require.NoError(t, err) _, _ = w.WriteString(`{"status":"succeeded","public_id":"community-one","result":{"html":"pelican"}}`) case "/api/v1/tests/legacy": require.Empty(t, r.Header.Get("Cookie")) _, _ = w.WriteString(`{"status":"succeeded"}`) default: t.Fatalf("unexpected path: %s", r.URL.Path) } return w.Result(), nil }) run := model.DetectionRun{ID: "public-test", RequestKey: "public-test", Kind: "pelican"} require.NoError(t, db.Create(&run).Error) input := map[string]any{"benchmark": "pelican"} _, err = manxueRunRequest(context.Background(), &run, http.MethodPost, "/api/v1/tests", input, "stable-key") require.NoError(t, err) require.NotContains(t, input, "public") var resumed model.DetectionRun require.NoError(t, db.First(&resumed, "id = ?", run.ID).Error) resumed.RemoteID = "remote-one" result, err := manxueRunRequest(context.Background(), &resumed, http.MethodGet, "/api/v1/tests/remote-one", nil, "") require.NoError(t, err) require.Equal(t, "https://manxue.ai/?result=community-one", manxueArtworkURL(result)) require.Equal(t, 1, configCalls) require.Equal(t, 1, createCalls) legacy := model.DetectionRun{RemoteID: "legacy"} _, err = manxueRunRequest(context.Background(), &legacy, http.MethodGet, "/api/v1/tests/legacy", nil, "") require.NoError(t, err) require.Empty(t, manxueArtworkURL(gjson.Parse(`{"id":"private","public":false}`))) }