* fix:修复响应污染问题 * fix:修改存储相关文件为中文注释 * fix:修复二次退款问题 * fix:修复多个考虑不全面问题 1.误删用户数据 2.R2存储默认区域 3.删除失败导致孤儿记录 4.网络抖动事变时重试 5.前端无限次请求获取图片 6.文件管理权限 * fix:修复字符串截断异常问题和文件下载超时问题 * fix:修复多图问题 * fix:异步生成图片时未配置oss提示错误信息 * fix:修复关闭异步后同步生成出错问题 * feat:新增文件存储测试功能,防止设置后不生效 * fix:修复同步图片转异步后计费错误 * fix:修复无下限扣款问题 * fix:修复结算重复扣款问题 * fix:修复计费出错导致的0费用结算 * fix:修复回调双重履约 * fix:修复预扣事务 * fix:修复费用字段类型问题 * fix:修复缓存问题 * fix:修复安全问题 * fix:修复数据库操作事务问题 * refactor:重构事务使用方式,改为官方推荐的dao形式 * fix:修复余额更新隐患 * fix:修复N+1查询问题 * fix:修复密钥安全问题 * fix:结算失败时打印错误日志 * improve:优化扣款 * fix:修复用户接口越权 --------- Co-authored-by: chengqian <wuchengqian@kkidc.com>
52 lines
1.7 KiB
Go
52 lines
1.7 KiB
Go
package constant
|
||
|
||
import (
|
||
"io"
|
||
"syscall"
|
||
"testing"
|
||
)
|
||
|
||
// TestIsRetryableForRequest 覆盖 DoRequest 阶段的 mode 感知重试判定:
|
||
// 对高成本非幂等生成(图片/视频),「可能已送达上游」的模糊网络错误不重试;
|
||
// 「确定未送达」的错误与状态码类错误仍照常重试;其它端点(chat)行为不变。
|
||
func TestIsRetryableForRequest(t *testing.T) {
|
||
relay502 := &RelayError{StatusCode: 502}
|
||
relay400 := &RelayError{StatusCode: 400}
|
||
|
||
cases := []struct {
|
||
name string
|
||
err error
|
||
expensive bool
|
||
want bool
|
||
}{
|
||
// chat(expensive=false):与 IsRetryable 一致,模糊错误照常重试。
|
||
{"chat/eof", io.EOF, false, true},
|
||
{"chat/reset", syscall.ECONNRESET, false, true},
|
||
{"chat/refused", syscall.ECONNREFUSED, false, true},
|
||
|
||
// 图片/视频(expensive=true):模糊「可能已送达」错误不重试。
|
||
{"image/eof", io.EOF, true, false},
|
||
{"image/unexpected_eof", io.ErrUnexpectedEOF, true, false},
|
||
{"image/reset", syscall.ECONNRESET, true, false},
|
||
|
||
// 图片/视频:确定未送达 → 仍重试。
|
||
{"image/refused", syscall.ECONNREFUSED, true, true},
|
||
|
||
// 状态码类错误:已拿到上游响应(未成功生成)→ 图片也可重试。
|
||
{"image/status_502", relay502, true, true},
|
||
|
||
// 本就不可重试的错误:任何情况都不重试。
|
||
{"image/status_400", relay400, true, false},
|
||
{"chat/status_400", relay400, false, false},
|
||
{"nil", nil, true, false},
|
||
}
|
||
|
||
for _, c := range cases {
|
||
t.Run(c.name, func(t *testing.T) {
|
||
if got := IsRetryableForRequest(c.err, c.expensive); got != c.want {
|
||
t.Fatalf("IsRetryableForRequest(%v, expensive=%v) = %v, want %v", c.err, c.expensive, got, c.want)
|
||
}
|
||
})
|
||
}
|
||
}
|