Files
sub2api/backend/internal/service/account_test_service_opencode_go_test.go
T
刘佳林 242907854d feat(opencode): add OpenCode platform with Zen and GO account types
Keep the internal platform ID opencode_go. Product surface is OpenCode
with account_mode zen|go, model-aware routing across Chat Completions,
Responses, and Anthropic Messages, and X-OpenCode-Session derived from
prompt_cache_key / metadata.user_id so prompt cache can hit.

Unmatched models fall back to /v1/chat/completions. Related to #6742.
2026-09-11 10:05:24 +08:00

106 lines
4.1 KiB
Go

//go:build unit
package service
import (
"strings"
"testing"
"github.com/stretchr/testify/require"
)
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_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))
}