Files
zhengchiliu b94dd6dffb feat(order): 重构退款全流程并新增申请退款中状态
- 订单状态新增「6 申请退款中」,用户申请退款原子流转并落待审核退款流水
- 退款失败回退订单至已支付并恢复被取消的权益发放任务
- 新增虚拟支付退款查单兜底任务,反查超时订单并自动订正
- 会员包来源额度不叠加,扣减/回退/回收口径统一为只取生效一份
- 退款回收流水按吊销前后有效剩余差值记账,避免无效回收记录
- 同步更新 README 与 Stitch 设计文档
2026-09-16 03:44:09 +08:00

30 lines
979 B
Go

package service
import (
"strings"
"testing"
"unicode/utf8"
)
// TestTruncateCallbackRaw 回调报文截断:短报文原样保留,长报文按上限截断且不产生非法 UTF-8
// (退款流水 callback_raw 为 utf8mb4 列,写入非法字节会直接报错)。
func TestTruncateCallbackRaw(t *testing.T) {
short := `{"Event":"xpay_refund_notify","MchOrderId":"OD1"}`
if got := truncateCallbackRaw(short); got != short {
t.Fatalf("short raw should be kept as-is, got %q", got)
}
// 构造跨越截断边界的多字节报文:4KB 边界前后都是中文字符。
long := strings.Repeat("退", 3000)
got := truncateCallbackRaw(long)
if len(got) > 4096 {
t.Fatalf("truncated length = %d, want <= 4096", len(got))
}
if !utf8.ValidString(got) {
t.Fatal("truncated raw must be valid UTF-8")
}
if got == "" || !strings.HasPrefix(long, got) {
t.Fatalf("truncated raw should be a prefix of the original, got prefix=%q", got[:min(8, len(got))])
}
}