package controller import ( "context" "github.com/QuantumNous/new-api/common" "github.com/QuantumNous/new-api/model" "github.com/QuantumNous/new-api/pkg/billingexpr" "github.com/QuantumNous/new-api/service" "github.com/glebarez/sqlite" "github.com/stretchr/testify/require" "gorm.io/gorm" "net/http" "net/http/httptest" "testing" "time" ) func TestLocalPelicanGeneratesOnceWithUnknownVerdict(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) old := model.DB model.DB = db t.Cleanup(func() { model.DB = old; _ = conn.Close() }) require.NoError(t, db.AutoMigrate(&model.Channel{}, &model.DetectionRun{}, &model.DetectionCall{}, &model.DetectionSchedule{})) calls := 0 upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { calls++ w.Header().Set("Content-Type", "application/json") _, _ = w.Write([]byte(`{"status":"completed","usage":{"input_tokens":10,"output_tokens":5},"output":[{"type":"message","content":[{"type":"output_text","text":"pelican"}]}]}`)) })) defer upstream.Close() url := upstream.URL channel := model.Channel{Type: 1, Key: "test-only", BaseURL: &url, Status: common.ChannelStatusEnabled, Models: "gpt-6-astra"} require.NoError(t, db.Create(&channel).Error) price, _ := common.Marshal(service.DetectionPrice{Snapshot: billingexpr.BillingSnapshot{ExprString: "p+c", ExprHash: billingexpr.ExprHashString("p+c"), GroupRatio: 1, QuotaPerUnit: 500000, ExprVersion: 1}}) run := model.DetectionRun{ID: "local-test", RequestKey: "local-test", Kind: "pelican", ChannelID: channel.Id, Status: "running", Deadline: time.Now().Unix() + 60, Reserved: 100, Price: string(price)} require.NoError(t, db.Create(&run).Error) require.NoError(t, db.Create(&model.DetectionCall{ID: run.ID, RunID: run.ID, SecretHash: model.DetectionSecretHash(pelicanCredential(run.ID)), State: "ready", ExpiresAt: run.Deadline}).Error) processLocalPelican(context.Background(), run) require.NoError(t, db.First(&run, "id = ?", run.ID).Error) require.Equal(t, "succeeded", run.Status) require.Equal(t, "unknown", run.Quality) require.Contains(t, run.HTML, "pelican") require.True(t, run.Settled) processLocalPelican(context.Background(), run) require.Equal(t, 1, calls) }