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
76 lines
2.3 KiB
Go
76 lines
2.3 KiB
Go
package dto
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/Wei-Shaw/sub2api/internal/service"
|
|
)
|
|
|
|
// profitControlJSONFields 是分组利润控制的三个 JSON 字段。它们与同响应中的
|
|
// rate_multiplier 相乘即可反推出运营方的上游采购成本上限,属于内部经营信息,
|
|
// 只能出现在管理员 DTO 中。
|
|
var profitControlJSONFields = []string{
|
|
"profit_control_enabled",
|
|
"profit_min_margin",
|
|
"profit_safety_buffer",
|
|
}
|
|
|
|
func profitControlServiceGroup() *service.Group {
|
|
return &service.Group{
|
|
ID: 7,
|
|
Name: "profit-gated",
|
|
Platform: service.PlatformAnthropic,
|
|
RateMultiplier: 2.0,
|
|
Status: service.StatusActive,
|
|
ProfitControlEnabled: true,
|
|
ProfitMinMargin: 0.3,
|
|
ProfitSafetyBuffer: 0.05,
|
|
}
|
|
}
|
|
|
|
func marshalToMap(t *testing.T, v any) map[string]any {
|
|
t.Helper()
|
|
raw, err := json.Marshal(v)
|
|
if err != nil {
|
|
t.Fatalf("marshal: %v", err)
|
|
}
|
|
var out map[string]any
|
|
if err := json.Unmarshal(raw, &out); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
return out
|
|
}
|
|
|
|
// TestGroupFromServiceOmitsProfitControl 钉死普通用户侧的分组 DTO 不泄露利润控制配置。
|
|
func TestGroupFromServiceOmitsProfitControl(t *testing.T) {
|
|
for name, got := range map[string]any{
|
|
"GroupFromService": GroupFromService(profitControlServiceGroup()),
|
|
"GroupFromServiceShallow": GroupFromServiceShallow(profitControlServiceGroup()),
|
|
} {
|
|
fields := marshalToMap(t, got)
|
|
for _, f := range profitControlJSONFields {
|
|
if _, ok := fields[f]; ok {
|
|
t.Errorf("%s: 普通用户 DTO 不得包含 %q", name, f)
|
|
}
|
|
}
|
|
if _, ok := fields["rate_multiplier"]; !ok {
|
|
t.Errorf("%s: 应仍返回 rate_multiplier", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestGroupFromServiceAdminIncludesProfitControl 钉死管理端仍能读写利润控制配置。
|
|
func TestGroupFromServiceAdminIncludesProfitControl(t *testing.T) {
|
|
admin := GroupFromServiceAdmin(profitControlServiceGroup())
|
|
if admin.ProfitControlEnabled != true || admin.ProfitMinMargin != 0.3 || admin.ProfitSafetyBuffer != 0.05 {
|
|
t.Fatalf("管理员 DTO 未透传利润控制配置: %+v", admin)
|
|
}
|
|
fields := marshalToMap(t, admin)
|
|
for _, f := range profitControlJSONFields {
|
|
if _, ok := fields[f]; !ok {
|
|
t.Errorf("管理员 DTO 应包含 %q", f)
|
|
}
|
|
}
|
|
}
|