package qiniu import ( "bytes" "context" "encoding/json" "fmt" "net/http" "testing" "time" "u-desk/internal/oss" ) // 临时测试配置 — 提交前删除此文件 func testConfig() *Config { return &Config{ AccessKey: "eUjiDJGy9CkRb3-Ad3jCubPrm49xeBTesHYckIwc", SecretKey: "LE8XL-LmoMkpy0jNK-kDhgL_w7A6MRXD1Msqd1Y4", Bucket: "u-res", Region: "as0", UseHTTPS: true, } } const testKey = "music/03.一人一首成名曲【特调音源】/001.雨一直下-张宇.mp3" // TestListBuckets 列举桶 func TestListBuckets(t *testing.T) { buckets, err := ListBuckets("eUjiDJGy9CkRb3-Ad3jCubPrm49xeBTesHYckIwc", "LE8XL-LmoMkpy0jNK-kDhgL_w7A6MRXD1Msqd1Y4") if err != nil { t.Fatalf("ListBuckets 失败: %v", err) } for _, b := range buckets { t.Logf("桶: %s 区域: %s", b.Name, b.Region) } } // TestGetBucketDomains 获取桶域名 func TestGetBucketDomains(t *testing.T) { c, err := NewClient(testConfig()) if err != nil { t.Fatal(err) } defer c.Close() domains, err := c.GetBucketDomains(context.Background()) if err != nil { t.Fatalf("获取域名失败: %v", err) } t.Logf("桶域名: %v", domains) } // TestDownloadDirect 裸 URL 下载(测试桶公开/私有) func TestDownloadDirect(t *testing.T) { c, err := NewClient(testConfig()) if err != nil { t.Fatal(err) } defer c.Close() domain, err := c.resolveDownloadDomain() if err != nil { t.Fatalf("获取下载域名失败: %v", err) } t.Logf("下载域名: %s", domain) rawURL := fmt.Sprintf("%s/%s", domain, testKey) t.Logf("裸 URL: %s", rawURL) httpResp, err := http.Get(rawURL) if err != nil { t.Fatalf("请求失败: %v", err) } defer httpResp.Body.Close() t.Logf("裸 URL 状态码: %d", httpResp.StatusCode) var buf bytes.Buffer buf.ReadFrom(httpResp.Body) t.Logf("响应大小: %d bytes", buf.Len()) } // TestDownloadSigned 签名 URL 下载 func TestDownloadSigned(t *testing.T) { c, err := NewClient(testConfig()) if err != nil { t.Fatal(err) } defer c.Close() signedURL, err := c.GetSignedURL(context.Background(), testKey, 1*time.Hour) if err != nil { t.Fatalf("生成签名 URL 失败: %v", err) } t.Logf("签名 URL: %s...", signedURL[:min(120, len(signedURL))]) httpResp, err := http.Get(signedURL) if err != nil { t.Fatalf("请求失败: %v", err) } defer httpResp.Body.Close() t.Logf("签名 URL 状态码: %d", httpResp.StatusCode) var buf bytes.Buffer buf.ReadFrom(httpResp.Body) t.Logf("下载大小: %d bytes", buf.Len()) if httpResp.StatusCode != 200 { t.Errorf("下载失败: %d, body: %s", httpResp.StatusCode, buf.String()[:min(200, buf.Len())]) } } // TestDownloadViaClient 通过 Client.Download 方法下载 func TestDownloadViaClient(t *testing.T) { c, err := NewClient(testConfig()) if err != nil { t.Fatal(err) } defer c.Close() var buf bytes.Buffer err = c.Download(context.Background(), testKey, &buf) if err != nil { t.Errorf("Client.Download 失败: %v", err) } else { t.Logf("Client.Download 成功,大小: %d bytes (预期 ~7MB)", buf.Len()) } } // TestGetFileInfo 获取文件信息 func TestGetFileInfo(t *testing.T) { c, err := NewClient(testConfig()) if err != nil { t.Fatal(err) } defer c.Close() info, err := c.GetFileInfo(context.Background(), testKey) if err != nil { t.Errorf("GetFileInfo 失败: %v", err) } else { t.Logf("GetFileInfo: key=%s size=%d", info.Key, info.Size) } } // TestListFiles 列举文件 func TestListFiles(t *testing.T) { c, err := NewClient(testConfig()) if err != nil { t.Fatal(err) } defer c.Close() result, err := c.ListFiles(context.Background(), &oss.ListOptions{Prefix: "music/", MaxKeys: 10}) if err != nil { t.Fatalf("ListFiles 失败: %v", err) } for _, f := range result.Files { t.Logf("文件: %-80s size: %d", f.Key, f.Size) } } // TestListFilesRaw 原始 RSF 请求查看响应结构 func TestListFilesRaw(t *testing.T) { c, err := NewClient(testConfig()) if err != nil { t.Fatal(err) } defer c.Close() resp, err := c.doRSFRequest("GET", fmt.Sprintf("/list?bucket=%s&limit=3&prefix=music/", testConfig().Bucket)) if err != nil { t.Fatal(err) } defer resp.Body.Close() var buf bytes.Buffer buf.ReadFrom(resp.Body) var pretty bytes.Buffer json.Indent(&pretty, buf.Bytes(), "", " ") t.Logf("原始响应:\n%s", pretty.String()) } func min(a, b int) int { if a < b { return a } return b }