package storage import ( "context" "fmt" "strings" "testing" "time" "fashionapi/internal/config" ) // TestQiniuPurgeRoundTrip 真实验证七牛删除能力(管理凭证签名是否正确): // 上传一个临时 key → 删除(期望 200)→ 再删一次(期望 612 资源不存在,证明已被删)。 // 若管理 token 签名错误,七牛会返回 401(invalid token),测试即失败。 // 仅在七牛启用且能连通时运行;否则跳过。 func TestQiniuPurgeRoundTrip(t *testing.T) { cfg, err := config.Load("../../../configs/config.yml") if err != nil { t.Skipf("加载配置失败,跳过: %v", err) } if !cfg.Qiniu.Enabled { t.Skip("七牛未启用,跳过删除验证") } up := NewQiniuUploader(cfg.Qiniu.AK, cfg.Qiniu.SK, cfg.Qiniu.Bucket, cfg.Qiniu.Zone, "") key := fmt.Sprintf("runway/_purge_verify_%d.bin", time.Now().UnixNano()) ctx := context.Background() // 1) 上传临时对象(任意字节即可,七牛不校验内容格式) if _, err := up.Upload(ctx, key, []byte("purge-verify-test-content"), "application/octet-stream"); err != nil { t.Fatalf("上传临时对象失败(无法继续验证删除): %v", err) } t.Logf("已上传临时 key=%s", key) // 2) 删除(期望 200 / nil) if err := up.Delete(ctx, key); err != nil { // 401 表示管理 token 签名错误,是本次验证的核心目标 if strings.Contains(err.Error(), "401") { t.Fatalf("七牛删除返回 401,管理凭证签名错误: %v", err) } t.Fatalf("首次删除失败: %v", err) } t.Logf("首次删除成功(200),key=%s", key) // 3) 再删一次(期望 612 资源不存在,证明确实被删除) if err := up.Delete(ctx, key); err != nil { if !strings.Contains(err.Error(), "612") { t.Fatalf("二次删除期望 612(资源不存在),实际: %v", err) } t.Logf("二次删除返回 612,确认对象已删除: %s", key) } else { t.Fatalf("二次删除应返回 612(资源不存在),却返回 200,说明首次删除未生效") } }