Files
sub2api/backend/internal/service/content_moderation_systemone_test.go
T
shaw 2d8a386811 fix(typesafe): 补齐平台迁移、审计覆盖、端点隔离与错误策略
- 新增 241 迁移:user_platform_quotas / composite_model_routes 的 CHECK 约束
  加入 typesafe。此前设置 typesafe 默认配额会让注册时的多行配额快照整体
  违约(fail-open 后新用户所有平台配额丢失),单用户配额与 Composite 路由保存 500。
- Prompt 审计新增 typesafe_systemone 协议提取(state + 各问题 instructions/
  criteria/选项标签,键排序保证哈希稳定);此前提取为空,阻断与异步审计均被放行。
  旧内容审核同样覆盖问题文本,且不再丢弃含 <system-reminder> 的 System One 文本。
- TypeSafe 分组及路由到 TypeSafe 的 Composite 请求访问 Messages / count_tokens /
  Chat Completions / Responses 时返回 404,避免以 x-api-key 打到错误上游路径并
  污染账号状态;TypeSafe 账号 base_url 为空时不再回退 api.anthropic.com。
- SystemOne 补在途余额预留、利润控制准入终检、wrapReleaseOnDone,失败切换改用
  共享 FailoverState(同账号重试 / 池模式 / 临时封禁)。
- 上游错误沿用共享账号错误策略:402/403、自定义错误码、临时不可调度规则生效,
  记录 ops 上游错误;400/422 仍不切换且永不改变账号状态。
- 账号测试改走原生 System One 探测,可用模型只返回 jev-latest;
  响应超限显式报错,响应 Content-Type 仅透传 JSON 类型。
2026-10-02 13:08:40 +08:00

34 lines
1.5 KiB
Go

package service
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestExtractContentModerationInputTypeSafeSystemOne(t *testing.T) {
for _, tc := range []struct {
name string
body string
want string
}{
{"string", `{"state":"plain text"}`, "plain text"},
{"object", `{"state":{"title":"hello","nested":{"body":"world"}}}`, "hello world"},
{"array", `{"state":["first",{"text":"second"},3]}`, "first second"},
{"questions", `{"state":"state text","questions":{"c":{"type":"choice","instructions":"pick one","criteria":{"label a":{"description":"desc a"},"label b":null}},"s":{"type":"score","criteria":["low",{"text":"high"}]},"n":{"type":"noul","instructions":["judge"],"criteria":{"true":"yes"}}}}`, "state text pick one label a desc a label b low high judge yes"},
} {
t.Run(tc.name, func(t *testing.T) {
input := ExtractContentModerationInput(ContentModerationProtocolTypeSafeSystemOne, []byte(tc.body))
require.Equal(t, tc.want, input.Text)
require.Empty(t, input.Images)
})
}
}
func TestExtractContentModerationInputTypeSafeSystemOneKeepsReminderText(t *testing.T) {
body := `{"state":"<system-reminder>hidden payload</system-reminder>","questions":{"q":{"type":"noul","instructions":"<system-reminder>hidden instructions</system-reminder>"}}}`
input := ExtractContentModerationInput(ContentModerationProtocolTypeSafeSystemOne, []byte(body))
require.Contains(t, input.Text, "hidden payload")
require.Contains(t, input.Text, "hidden instructions")
}