Files
sub2api/backend/internal/handler/openai_quota_platform_contract_test.go
李建琦 6d655c9903
Release / update-version (push) Has been cancelled
Release / build-frontend (push) Has been cancelled
Release / release (push) Has been cancelled
Release / sync-version-file (push) Has been cancelled
CI / shell (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / golangci-lint (push) Canceled after 0s
Security Scan / backend-security (push) Canceled after 0s
Security Scan / frontend-security (push) Canceled after 0s
Sub2API v1.0 - AI API 网关(二开初始版本,基于上游 Wei-Shaw/sub2api)
2026-08-21 18:30:13 +08:00

66 lines
1.5 KiB
Go

package handler
import (
"go/ast"
"go/parser"
"go/token"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
)
func TestOpenAIRecordUsageInputsCarryQuotaPlatform(t *testing.T) {
files := []string{
"openai_gateway_handler.go",
"openai_chat_completions.go",
"openai_embeddings.go",
"openai_images.go",
}
for _, name := range files {
t.Run(name, func(t *testing.T) {
fset := token.NewFileSet()
file, err := parser.ParseFile(fset, filepath.Join(".", name), nil, 0)
require.NoError(t, err)
var missing []token.Position
ast.Inspect(file, func(node ast.Node) bool {
literal, ok := node.(*ast.CompositeLit)
if !ok || !isOpenAIRecordUsageInputLiteral(literal.Type) {
return true
}
if !compositeLiteralHasKey(literal, "QuotaPlatform") {
missing = append(missing, fset.Position(literal.Lbrace))
}
return true
})
require.Empty(t, missing, "OpenAI usage post-billing must receive request-time QuotaPlatform")
})
}
}
func isOpenAIRecordUsageInputLiteral(expr ast.Expr) bool {
selector, ok := expr.(*ast.SelectorExpr)
if !ok {
return false
}
pkg, ok := selector.X.(*ast.Ident)
return ok && pkg.Name == "service" && selector.Sel.Name == "OpenAIRecordUsageInput"
}
func compositeLiteralHasKey(literal *ast.CompositeLit, key string) bool {
for _, elt := range literal.Elts {
pair, ok := elt.(*ast.KeyValueExpr)
if !ok {
continue
}
ident, ok := pair.Key.(*ast.Ident)
if ok && ident.Name == key {
return true
}
}
return false
}