Private
Public Access
1
0
Files
u-desk/internal/oss/qiniu/client_test.go

191 lines
4.3 KiB
Go

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
}