Files
sub2api/backend/internal/service/account_test_service_opencode_go_test.go
T
刘佳林 7c008bd8c1 fix(opencode): apply account model mapping in connection tests
Responses probes used the requested model as-is, so aliases like
opencode/muse-spark-* were sent upstream instead of the mapped ID.
2026-09-11 14:19:23 +08:00

125 lines
5.1 KiB
Go

//go:build unit
package service
import (
"strings"
"testing"
"github.com/stretchr/testify/require"
"github.com/tidwall/gjson"
)
func openCodeGoTestAccount(id int64) *Account {
return &Account{
ID: id,
Name: "oc",
Platform: PlatformOpenCodeGo,
Type: AccountTypeAPIKey,
Status: StatusActive,
Concurrency: 1,
Credentials: map[string]any{
"api_key": "sk-opencode-go-test",
"api_protocol": APIProtocolAdaptive,
"base_url": "https://opencode.ai/zen/go/v1",
"api_base_urls": map[string]any{
APIProtocolChatCompletions: "https://opencode.ai/zen/go/v1",
APIProtocolAnthropic: "https://opencode.ai/zen/go",
APIProtocolResponses: "https://opencode.ai/zen/go/v1",
},
},
}
}
func TestAccountTestService_OpenCodeGoDeepSeekFlashUsesChatCompletions(t *testing.T) {
account := openCodeGoTestAccount(401)
svc, upstream := adaptiveCNAccountTestService(account, adaptiveCNChatTestResponse())
c, recorder := newTestContext()
err := svc.TestAccountConnection(c, account.ID, "deepseek-v4-flash", "hi", AccountTestModeDefault)
require.NoError(t, err)
require.Len(t, upstream.requests, 1)
require.Equal(t, "https://opencode.ai/zen/go/v1/chat/completions", upstream.requests[0].URL.String())
require.Equal(t, "Bearer sk-opencode-go-test", upstream.requests[0].Header.Get("Authorization"))
require.NotEmpty(t, upstream.requests[0].Header.Get("X-OpenCode-Session"))
require.Contains(t, recorder.Body.String(), `"type":"test_complete"`)
require.NotContains(t, upstream.requests[0].URL.Path, "/messages")
}
func TestAccountTestService_OpenCodeGoGrokUsesResponses(t *testing.T) {
account := openCodeGoTestAccount(402)
svc, upstream := adaptiveCNAccountTestService(account, adaptiveCNResponsesTestResponse())
c, recorder := newTestContext()
err := svc.TestAccountConnection(c, account.ID, "grok-4.6", "hi", AccountTestModeDefault)
require.NoError(t, err)
require.Len(t, upstream.requests, 1)
require.Equal(t, "https://opencode.ai/zen/go/v1/responses", upstream.requests[0].URL.String())
require.Equal(t, "Bearer sk-opencode-go-test", upstream.requests[0].Header.Get("Authorization"))
require.NotEmpty(t, upstream.requests[0].Header.Get("X-OpenCode-Session"))
require.Contains(t, recorder.Body.String(), `"type":"test_complete"`)
}
func TestAccountTestService_OpenCodeGoMiniMaxUsesAnthropicMessages(t *testing.T) {
account := openCodeGoTestAccount(403)
svc, upstream := adaptiveCNAccountTestService(account, adaptiveCNAnthropicTestResponse())
c, recorder := newTestContext()
err := svc.TestAccountConnection(c, account.ID, "minimax-m3", "hi", AccountTestModeDefault)
require.NoError(t, err)
require.Len(t, upstream.requests, 1)
req := upstream.requests[0]
require.Equal(t, "https://opencode.ai/zen/go/v1/messages", req.URL.String())
require.Empty(t, req.URL.RawQuery)
require.Equal(t, "sk-opencode-go-test", req.Header.Get("x-api-key"))
require.NotEmpty(t, req.Header.Get("X-OpenCode-Session"))
require.Contains(t, recorder.Body.String(), `"type":"test_complete"`)
}
func TestAccountTestService_OpenCodeGoPinnedChatProtocolIgnoresCatalog(t *testing.T) {
account := openCodeGoTestAccount(404)
account.Credentials["api_protocol"] = APIProtocolChatCompletions
svc, upstream := adaptiveCNAccountTestService(account, adaptiveCNChatTestResponse())
c, _ := newTestContext()
err := svc.TestAccountConnection(c, account.ID, "grok-4.6", "hi", AccountTestModeDefault)
require.NoError(t, err)
require.Len(t, upstream.requests, 1)
require.Equal(t, "https://opencode.ai/zen/go/v1/chat/completions", upstream.requests[0].URL.String())
}
func TestAccountTestService_OpenCodeGoAppliesModelMappingOnResponses(t *testing.T) {
account := openCodeGoTestAccount(406)
account.Credentials["model_mapping"] = map[string]any{
"opencode/muse-spark-1.3-contributior-free": "muse-spark-1.3-contributior-free",
}
svc, upstream := adaptiveCNAccountTestService(account, adaptiveCNResponsesTestResponse())
c, recorder := newTestContext()
err := svc.TestAccountConnection(c, account.ID, "opencode/muse-spark-1.3-contributior-free", "hi", AccountTestModeDefault)
require.NoError(t, err)
require.Len(t, upstream.requests, 1)
require.Equal(t, "https://opencode.ai/zen/go/v1/responses", upstream.requests[0].URL.String())
require.Equal(t, "muse-spark-1.3-contributior-free", gjson.GetBytes(upstream.lastBody, "model").String())
require.Contains(t, recorder.Body.String(), `"model":"muse-spark-1.3-contributior-free"`)
require.NotContains(t, string(upstream.lastBody), "opencode/muse-spark-1.3-contributior-free")
}
func TestAccountTestService_OpenCodeGoEmptyModelDefaultsToChatCatalogID(t *testing.T) {
account := openCodeGoTestAccount(405)
svc, upstream := adaptiveCNAccountTestService(account, adaptiveCNChatTestResponse())
c, recorder := newTestContext()
err := svc.TestAccountConnection(c, account.ID, "", "hi", AccountTestModeDefault)
require.NoError(t, err)
require.Len(t, upstream.requests, 1)
require.Equal(t, "https://opencode.ai/zen/go/v1/chat/completions", upstream.requests[0].URL.String())
require.True(t, strings.Contains(recorder.Body.String(), DefaultOpenCodeGoTestModel))
}