group_mapper_profit_visibility_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package dto
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "github.com/Wei-Shaw/sub2api/internal/service"
  6. )
  7. // profitControlJSONFields 是分组利润控制的三个 JSON 字段。它们与同响应中的
  8. // rate_multiplier 相乘即可反推出运营方的上游采购成本上限,属于内部经营信息,
  9. // 只能出现在管理员 DTO 中。
  10. var profitControlJSONFields = []string{
  11. "profit_control_enabled",
  12. "profit_min_margin",
  13. "profit_safety_buffer",
  14. }
  15. func profitControlServiceGroup() *service.Group {
  16. return &service.Group{
  17. ID: 7,
  18. Name: "profit-gated",
  19. Platform: service.PlatformAnthropic,
  20. RateMultiplier: 2.0,
  21. Status: service.StatusActive,
  22. ProfitControlEnabled: true,
  23. ProfitMinMargin: 0.3,
  24. ProfitSafetyBuffer: 0.05,
  25. }
  26. }
  27. func marshalToMap(t *testing.T, v any) map[string]any {
  28. t.Helper()
  29. raw, err := json.Marshal(v)
  30. if err != nil {
  31. t.Fatalf("marshal: %v", err)
  32. }
  33. var out map[string]any
  34. if err := json.Unmarshal(raw, &out); err != nil {
  35. t.Fatalf("unmarshal: %v", err)
  36. }
  37. return out
  38. }
  39. // TestGroupFromServiceOmitsProfitControl 钉死普通用户侧的分组 DTO 不泄露利润控制配置。
  40. func TestGroupFromServiceOmitsProfitControl(t *testing.T) {
  41. for name, got := range map[string]any{
  42. "GroupFromService": GroupFromService(profitControlServiceGroup()),
  43. "GroupFromServiceShallow": GroupFromServiceShallow(profitControlServiceGroup()),
  44. } {
  45. fields := marshalToMap(t, got)
  46. for _, f := range profitControlJSONFields {
  47. if _, ok := fields[f]; ok {
  48. t.Errorf("%s: 普通用户 DTO 不得包含 %q", name, f)
  49. }
  50. }
  51. if _, ok := fields["rate_multiplier"]; !ok {
  52. t.Errorf("%s: 应仍返回 rate_multiplier", name)
  53. }
  54. }
  55. }
  56. // TestGroupFromServiceAdminIncludesProfitControl 钉死管理端仍能读写利润控制配置。
  57. func TestGroupFromServiceAdminIncludesProfitControl(t *testing.T) {
  58. admin := GroupFromServiceAdmin(profitControlServiceGroup())
  59. if admin.ProfitControlEnabled != true || admin.ProfitMinMargin != 0.3 || admin.ProfitSafetyBuffer != 0.05 {
  60. t.Fatalf("管理员 DTO 未透传利润控制配置: %+v", admin)
  61. }
  62. fields := marshalToMap(t, admin)
  63. for _, f := range profitControlJSONFields {
  64. if _, ok := fields[f]; !ok {
  65. t.Errorf("管理员 DTO 应包含 %q", f)
  66. }
  67. }
  68. }