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
104 lines
3.4 KiB
Go
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)
|
|
}
|
|
}
|