mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-02 20:40:52 +08:00
121 lines
4.3 KiB
Go
121 lines
4.3 KiB
Go
package openai
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/router-for-me/CLIProxyAPI/v6/internal/registry"
|
|
"github.com/router-for-me/CLIProxyAPI/v6/sdk/api/handlers"
|
|
coreauth "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/auth"
|
|
coreexecutor "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/executor"
|
|
sdkconfig "github.com/router-for-me/CLIProxyAPI/v6/sdk/config"
|
|
)
|
|
|
|
type compactCaptureExecutor struct {
|
|
alt string
|
|
sourceFormat string
|
|
calls int
|
|
}
|
|
|
|
func (e *compactCaptureExecutor) Identifier() string { return "test-provider" }
|
|
|
|
func (e *compactCaptureExecutor) Execute(ctx context.Context, auth *coreauth.Auth, req coreexecutor.Request, opts coreexecutor.Options) (coreexecutor.Response, error) {
|
|
e.calls++
|
|
e.alt = opts.Alt
|
|
e.sourceFormat = opts.SourceFormat.String()
|
|
return coreexecutor.Response{Payload: []byte(`{"ok":true}`)}, nil
|
|
}
|
|
|
|
func (e *compactCaptureExecutor) ExecuteStream(context.Context, *coreauth.Auth, coreexecutor.Request, coreexecutor.Options) (<-chan coreexecutor.StreamChunk, error) {
|
|
return nil, errors.New("not implemented")
|
|
}
|
|
|
|
func (e *compactCaptureExecutor) Refresh(ctx context.Context, auth *coreauth.Auth) (*coreauth.Auth, error) {
|
|
return auth, nil
|
|
}
|
|
|
|
func (e *compactCaptureExecutor) CountTokens(context.Context, *coreauth.Auth, coreexecutor.Request, coreexecutor.Options) (coreexecutor.Response, error) {
|
|
return coreexecutor.Response{}, errors.New("not implemented")
|
|
}
|
|
|
|
func (e *compactCaptureExecutor) HttpRequest(context.Context, *coreauth.Auth, *http.Request) (*http.Response, error) {
|
|
return nil, errors.New("not implemented")
|
|
}
|
|
|
|
func TestOpenAIResponsesCompactRejectsStream(t *testing.T) {
|
|
gin.SetMode(gin.TestMode)
|
|
executor := &compactCaptureExecutor{}
|
|
manager := coreauth.NewManager(nil, nil, nil)
|
|
manager.RegisterExecutor(executor)
|
|
|
|
auth := &coreauth.Auth{ID: "auth1", Provider: executor.Identifier(), Status: coreauth.StatusActive}
|
|
if _, err := manager.Register(context.Background(), auth); err != nil {
|
|
t.Fatalf("Register auth: %v", err)
|
|
}
|
|
registry.GetGlobalRegistry().RegisterClient(auth.ID, auth.Provider, []*registry.ModelInfo{{ID: "test-model"}})
|
|
t.Cleanup(func() {
|
|
registry.GetGlobalRegistry().UnregisterClient(auth.ID)
|
|
})
|
|
|
|
base := handlers.NewBaseAPIHandlers(&sdkconfig.SDKConfig{}, manager)
|
|
h := NewOpenAIResponsesAPIHandler(base)
|
|
router := gin.New()
|
|
router.POST("/v1/responses/compact", h.Compact)
|
|
|
|
req := httptest.NewRequest(http.MethodPost, "/v1/responses/compact", strings.NewReader(`{"model":"test-model","stream":true}`))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
resp := httptest.NewRecorder()
|
|
router.ServeHTTP(resp, req)
|
|
|
|
if resp.Code != http.StatusBadRequest {
|
|
t.Fatalf("status = %d, want %d", resp.Code, http.StatusBadRequest)
|
|
}
|
|
if executor.calls != 0 {
|
|
t.Fatalf("executor calls = %d, want 0", executor.calls)
|
|
}
|
|
}
|
|
|
|
func TestOpenAIResponsesCompactExecute(t *testing.T) {
|
|
gin.SetMode(gin.TestMode)
|
|
executor := &compactCaptureExecutor{}
|
|
manager := coreauth.NewManager(nil, nil, nil)
|
|
manager.RegisterExecutor(executor)
|
|
|
|
auth := &coreauth.Auth{ID: "auth2", Provider: executor.Identifier(), Status: coreauth.StatusActive}
|
|
if _, err := manager.Register(context.Background(), auth); err != nil {
|
|
t.Fatalf("Register auth: %v", err)
|
|
}
|
|
registry.GetGlobalRegistry().RegisterClient(auth.ID, auth.Provider, []*registry.ModelInfo{{ID: "test-model"}})
|
|
t.Cleanup(func() {
|
|
registry.GetGlobalRegistry().UnregisterClient(auth.ID)
|
|
})
|
|
|
|
base := handlers.NewBaseAPIHandlers(&sdkconfig.SDKConfig{}, manager)
|
|
h := NewOpenAIResponsesAPIHandler(base)
|
|
router := gin.New()
|
|
router.POST("/v1/responses/compact", h.Compact)
|
|
|
|
req := httptest.NewRequest(http.MethodPost, "/v1/responses/compact", strings.NewReader(`{"model":"test-model","input":"hello"}`))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
resp := httptest.NewRecorder()
|
|
router.ServeHTTP(resp, req)
|
|
|
|
if resp.Code != http.StatusOK {
|
|
t.Fatalf("status = %d, want %d", resp.Code, http.StatusOK)
|
|
}
|
|
if executor.alt != "responses/compact" {
|
|
t.Fatalf("alt = %q, want %q", executor.alt, "responses/compact")
|
|
}
|
|
if executor.sourceFormat != "openai-response" {
|
|
t.Fatalf("source format = %q, want %q", executor.sourceFormat, "openai-response")
|
|
}
|
|
if strings.TrimSpace(resp.Body.String()) != `{"ok":true}` {
|
|
t.Fatalf("body = %s", resp.Body.String())
|
|
}
|
|
}
|