191 lines
4.3 KiB
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
|
|
}
|