Files
tutti/services/tuttid/api/daemon_agent_target_account_usage_test.go
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

104 lines
3.4 KiB
Go

package api
import (
"context"
"encoding/json"
"net/http"
"testing"
agentextensionservice "github.com/tutti-os/tutti/services/tuttid/service/agentextension"
)
type stubAgentTargetAccountUsageService struct {
probe func(context.Context, string) (agentextensionservice.AccountUsageResult, error)
}
func (service stubAgentTargetAccountUsageService) Probe(
ctx context.Context,
targetID string,
) (agentextensionservice.AccountUsageResult, error) {
return service.probe(ctx, targetID)
}
func TestDaemonAgentTargetAccountUsageReturnsTargetScopedStandardResult(t *testing.T) {
mux := http.NewServeMux()
RegisterRoutes(mux, NewRoutes(DaemonAPI{
AgentTargetAccountUsage: stubAgentTargetAccountUsageService{
probe: func(_ context.Context, targetID string) (agentextensionservice.AccountUsageResult, error) {
if targetID != "extension:kimi-code" {
t.Fatalf("target id = %q", targetID)
}
reset := int64(1_800_000_000_000)
return agentextensionservice.AccountUsageResult{
SchemaVersion: agentextensionservice.AccountUsageSchemaVersion,
AgentTargetID: targetID,
Provider: "acp:kimi-code",
Outcome: "available",
CapturedAtUnixMS: 1_700_000_000_000,
BillingMode: "subscription",
QuotaState: "complete",
Quotas: []agentextensionservice.AccountUsageQuota{{
QuotaType: "weekly", PercentRemaining: 72, ResetsAtUnixMS: &reset,
}},
}, nil
},
},
}))
recorder := performGeneratedRouteRequest(
t,
mux,
http.MethodPost,
"/v1/agent-targets/extension:kimi-code/account-usage",
nil,
)
if recorder.Code != http.StatusOK {
t.Fatalf("status = %d, body = %s", recorder.Code, recorder.Body.String())
}
var response map[string]any
if err := json.Unmarshal(recorder.Body.Bytes(), &response); err != nil {
t.Fatal(err)
}
if response["schemaVersion"] != agentextensionservice.AccountUsageSchemaVersion ||
response["agentTargetId"] != "extension:kimi-code" ||
response["provider"] != "acp:kimi-code" ||
response["outcome"] != "available" {
t.Fatalf("response identity/outcome = %#v", response)
}
if _, exists := response["errorMessage"]; exists {
t.Fatalf("response exposed free-form error text: %#v", response)
}
}
func TestProjectAgentTargetAccountUsagePreservesCompleteCredits(t *testing.T) {
remaining := 1050.5
limit := 2101.0
projected, err := projectAgentTargetAccountUsage(agentextensionservice.AccountUsageResult{
SchemaVersion: agentextensionservice.AccountUsageSchemaVersion,
AgentTargetID: "extension:codebuddy",
Provider: "acp:codebuddy",
Outcome: "available",
CapturedAtUnixMS: 1,
BillingMode: "provider_account",
QuotaState: "complete",
Quotas: []agentextensionservice.AccountUsageQuota{{
QuotaType: "credits", PercentRemaining: 50,
AmountRemaining: &remaining, AmountLimit: &limit, AmountUnit: "credits",
}},
})
if err != nil {
t.Fatal(err)
}
available, err := projected.AsAgentTargetAccountUsageAvailableResult()
if err != nil {
t.Fatal(err)
}
if available.QuotaState != "complete" || available.BillingMode != "provider_account" || len(available.Quotas) != 1 {
t.Fatalf("projected credits result = %#v", available)
}
quota := available.Quotas[0]
if quota.AmountRemaining == nil || *quota.AmountRemaining != remaining || quota.AmountLimit == nil || *quota.AmountLimit != limit || quota.AmountUnit == nil || *quota.AmountUnit != "credits" {
t.Fatalf("projected credits quota = %#v", quota)
}
}