0220df8429
Pre-fill BillingRequestInput from dto.Request before ModelPriceHelper, so tiered_expr billing resolves param() from the structured request instead of reading HTTP body (which is empty in channel-test context). - attachTestBillingRequestInput: marshal dto.Request → RequestInput - ResolveIncomingBillingExprRequestInput: early-return when pre-filled - settleTestQuota / buildTestLogOther: align test settlement & logging with production TryTieredSettle / InjectTieredBillingInfo paths
72 lines
2.0 KiB
Go
72 lines
2.0 KiB
Go
package controller
|
|
|
|
import (
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/QuantumNous/new-api/common"
|
|
"github.com/QuantumNous/new-api/dto"
|
|
"github.com/QuantumNous/new-api/pkg/billingexpr"
|
|
relaycommon "github.com/QuantumNous/new-api/relay/common"
|
|
"github.com/QuantumNous/new-api/types"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestSettleTestQuotaUsesTieredBilling(t *testing.T) {
|
|
info := &relaycommon.RelayInfo{
|
|
TieredBillingSnapshot: &billingexpr.BillingSnapshot{
|
|
BillingMode: "tiered_expr",
|
|
ExprString: `param("stream") == true ? tier("stream", p * 3) : tier("base", p * 2)`,
|
|
ExprHash: billingexpr.ExprHashString(`param("stream") == true ? tier("stream", p * 3) : tier("base", p * 2)`),
|
|
GroupRatio: 1,
|
|
EstimatedTier: "stream",
|
|
QuotaPerUnit: common.QuotaPerUnit,
|
|
ExprVersion: 1,
|
|
},
|
|
BillingRequestInput: &billingexpr.RequestInput{
|
|
Body: []byte(`{"stream":true}`),
|
|
},
|
|
}
|
|
|
|
quota, result := settleTestQuota(info, types.PriceData{
|
|
ModelRatio: 1,
|
|
CompletionRatio: 2,
|
|
}, &dto.Usage{
|
|
PromptTokens: 1000,
|
|
})
|
|
|
|
require.Equal(t, 1500, quota)
|
|
require.NotNil(t, result)
|
|
require.Equal(t, "stream", result.MatchedTier)
|
|
}
|
|
|
|
func TestBuildTestLogOtherInjectsTieredInfo(t *testing.T) {
|
|
gin.SetMode(gin.TestMode)
|
|
ctx, _ := gin.CreateTestContext(httptest.NewRecorder())
|
|
|
|
info := &relaycommon.RelayInfo{
|
|
TieredBillingSnapshot: &billingexpr.BillingSnapshot{
|
|
BillingMode: "tiered_expr",
|
|
ExprString: `tier("base", p * 2)`,
|
|
},
|
|
ChannelMeta: &relaycommon.ChannelMeta{},
|
|
}
|
|
priceData := types.PriceData{
|
|
GroupRatioInfo: types.GroupRatioInfo{GroupRatio: 1},
|
|
}
|
|
usage := &dto.Usage{
|
|
PromptTokensDetails: dto.InputTokenDetails{
|
|
CachedTokens: 12,
|
|
},
|
|
}
|
|
|
|
other := buildTestLogOther(ctx, info, priceData, usage, &billingexpr.TieredResult{
|
|
MatchedTier: "base",
|
|
})
|
|
|
|
require.Equal(t, "tiered_expr", other["billing_mode"])
|
|
require.Equal(t, "base", other["matched_tier"])
|
|
require.NotEmpty(t, other["expr_b64"])
|
|
}
|