* 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.9 KiB
Go
52 lines
1.9 KiB
Go
package common
|
||
|
||
import "testing"
|
||
|
||
// TestProviderFullKeyAppliesPrefixOnce 守护 storage_path 前缀不变量:每个 provider 恰好
|
||
// 为 key 加一次配置的路径前缀,且对已带前缀的 key 幂等。新行持久化 raw key(相对前缀),
|
||
// 旧行持久化的是 Upload 返回的已带前缀 key。两者都必须解析到同一个「只加一次前缀」的对象,
|
||
// 从而 Download/Delete/PresignedURL 无需数据迁移即可正常工作。
|
||
func TestProviderFullKeyAppliesPrefixOnce(t *testing.T) {
|
||
const prefix = "team-api"
|
||
const rawKey = "42/1700000000/task_abc.png"
|
||
const want = prefix + "/" + rawKey
|
||
|
||
cases := []struct {
|
||
name string
|
||
fullKey func(string) string
|
||
}{
|
||
{"s3", (&S3StorageProvider{prefix: prefix}).fullKey},
|
||
{"oss", (&OSSStorageProvider{prefix: prefix}).fullKey},
|
||
{"cos", (&COSStorageProvider{prefix: prefix}).fullKey},
|
||
}
|
||
|
||
for _, c := range cases {
|
||
t.Run(c.name, func(t *testing.T) {
|
||
// 新行(raw key)-> 只加一次前缀。
|
||
if got := c.fullKey(rawKey); got != want {
|
||
t.Fatalf("fullKey(raw) = %q, want %q", got, want)
|
||
}
|
||
// 旧行(已带前缀的 key)-> 原样返回(幂等),不再二次加前缀。
|
||
// 这正是让旧 fil_files 行仍能正确解析的关键。
|
||
if got := c.fullKey(want); got != want {
|
||
t.Fatalf("fullKey(prefixed) = %q, want %q (must be idempotent for legacy rows)", got, want)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
// TestProviderFullKeyNoPrefix 验证前缀为空时 key 原样返回,即未配置前缀时 key 往返一致。
|
||
func TestProviderFullKeyNoPrefix(t *testing.T) {
|
||
const rawKey = "exports/tenant_7/20240101_000000.json"
|
||
providers := map[string]func(string) string{
|
||
"s3": (&S3StorageProvider{}).fullKey,
|
||
"oss": (&OSSStorageProvider{}).fullKey,
|
||
"cos": (&COSStorageProvider{}).fullKey,
|
||
}
|
||
for name, fullKey := range providers {
|
||
if got := fullKey(rawKey); got != rawKey {
|
||
t.Fatalf("%s: fullKey(%q) with empty prefix = %q, want unchanged", name, rawKey, got)
|
||
}
|
||
}
|
||
}
|