Private
Public Access
1
0
Files
u-desk/internal/ossdrv/service_test.go

222 lines
5.0 KiB
Go

package ossdrv
import (
"os"
"testing"
)
func getEnvOrSkip(t *testing.T, key string) string {
t.Helper()
v := os.Getenv(key)
if v == "" {
t.Skipf("跳过:环境变量 %s 未设置", key)
}
return v
}
func TestQiniuConnect(t *testing.T) {
ak := getEnvOrSkip(t, "QINIU_AK")
sk := getEnvOrSkip(t, "QINIU_SK")
m := &Manager{}
err := m.Connect("qiniu", ak, sk, "")
if err != nil {
t.Fatalf("七牛云连接失败: %v", err)
}
cred, ok := m.accounts.Load("qiniu")
if !ok {
t.Fatal("凭据未存储")
}
c := cred.(*accountCredentials)
if c.AccessKey != ak {
t.Errorf("AccessKey 不匹配: got %s", c.AccessKey)
}
}
func TestQiniuListBuckets(t *testing.T) {
ak := getEnvOrSkip(t, "QINIU_AK")
sk := getEnvOrSkip(t, "QINIU_SK")
m := &Manager{}
if err := m.Connect("qiniu", ak, sk, ""); err != nil {
t.Skipf("跳过:连接失败: %v", err)
}
svc := &Service{manager: m}
items, err := svc.ListDir("qiniu", "/")
if err != nil {
t.Fatalf("列桶失败: %v", err)
}
if len(items) == 0 {
t.Fatal("没有返回任何桶")
}
t.Logf("七牛云桶数量: %d", len(items))
for _, item := range items {
t.Logf(" 桶: %s (path=%s, is_dir=%v)", item["name"], item["path"], item["is_dir"])
}
}
func TestQiniuBucketListDir(t *testing.T) {
ak := getEnvOrSkip(t, "QINIU_AK")
sk := getEnvOrSkip(t, "QINIU_SK")
m := &Manager{}
if err := m.Connect("qiniu", ak, sk, ""); err != nil {
t.Skipf("跳过:连接失败: %v", err)
}
svc := &Service{manager: m}
items, err := svc.ListDir("qiniu", "/")
if err != nil || len(items) == 0 {
t.Skipf("跳过:无法列桶")
}
bucketName, _ := items[0]["name"].(string)
t.Logf("进入桶: %s", bucketName)
path := "/" + bucketName + "/"
files, err := svc.ListDir("qiniu", path)
if err != nil {
t.Fatalf("列桶内文件失败: %v", err)
}
t.Logf("桶内文件数量: %d", len(files))
for _, f := range files {
t.Logf(" %s (is_dir=%v, size=%v)", f["name"], f["is_dir"], f["size"])
}
client := m.GetClient("qiniu", bucketName)
if client == nil {
t.Error("桶级客户端未缓存")
}
}
func TestAliyunConnect(t *testing.T) {
ak := getEnvOrSkip(t, "ALIYUN_AK")
sk := getEnvOrSkip(t, "ALIYUN_SK")
ep := os.Getenv("ALIYUN_EP")
if ep == "" {
ep = "oss-cn-shenzhen.aliyuncs.com"
}
m := &Manager{}
err := m.Connect("aliyun", ak, sk, ep)
if err != nil {
t.Fatalf("阿里云连接失败: %v", err)
}
}
func TestAliyunListBuckets(t *testing.T) {
ak := getEnvOrSkip(t, "ALIYUN_AK")
sk := getEnvOrSkip(t, "ALIYUN_SK")
ep := os.Getenv("ALIYUN_EP")
if ep == "" {
ep = "oss-cn-shenzhen.aliyuncs.com"
}
m := &Manager{}
if err := m.Connect("aliyun", ak, sk, ep); err != nil {
t.Skipf("跳过:连接失败: %v", err)
}
svc := &Service{manager: m}
items, err := svc.ListDir("aliyun", "/")
if err != nil {
t.Fatalf("列桶失败: %v", err)
}
if len(items) == 0 {
t.Fatal("没有返回任何桶")
}
t.Logf("阿里云桶数量: %d", len(items))
for _, item := range items {
t.Logf(" 桶: %s (path=%s)", item["name"], item["path"])
}
}
func TestAliyunBucketListDir(t *testing.T) {
ak := getEnvOrSkip(t, "ALIYUN_AK")
sk := getEnvOrSkip(t, "ALIYUN_SK")
ep := os.Getenv("ALIYUN_EP")
if ep == "" {
ep = "oss-cn-shenzhen.aliyuncs.com"
}
m := &Manager{}
if err := m.Connect("aliyun", ak, sk, ep); err != nil {
t.Skipf("跳过:连接失败: %v", err)
}
svc := &Service{manager: m}
items, err := svc.ListDir("aliyun", "/")
if err != nil || len(items) == 0 {
t.Skipf("跳过:无法列桶")
}
var bucketName string
for _, item := range items {
if item["name"] == "f-kit" {
bucketName = "f-kit"
break
}
}
if bucketName == "" {
bucketName, _ = items[0]["name"].(string)
}
t.Logf("进入桶: %s", bucketName)
path := "/" + bucketName + "/"
files, err := svc.ListDir("aliyun", path)
if err != nil {
t.Fatalf("列桶内文件失败: %v", err)
}
t.Logf("桶内文件数量: %d", len(files))
for _, f := range files {
t.Logf(" %s (is_dir=%v)", f["name"], f["is_dir"])
}
}
func TestParseBucketPath(t *testing.T) {
tests := []struct {
input string
wantBucket string
wantKey string
}{
{"/bucket/file.txt", "bucket", "file.txt"},
{"/bucket/dir/file.txt", "bucket", "dir/file.txt"},
{"/bucket/", "bucket", ""},
{"/bucket", "bucket", ""},
{"/", "", ""},
{"", "", ""},
}
for _, tt := range tests {
bucket, key := parseBucketPath(tt.input)
if bucket != tt.wantBucket || key != tt.wantKey {
t.Errorf("parseBucketPath(%q) = (%q, %q), want (%q, %q)",
tt.input, bucket, key, tt.wantBucket, tt.wantKey)
}
}
}
func TestDisconnect(t *testing.T) {
ak := getEnvOrSkip(t, "QINIU_AK")
sk := getEnvOrSkip(t, "QINIU_SK")
m := &Manager{}
if err := m.Connect("qiniu", ak, sk, ""); err != nil {
t.Skipf("跳过:连接失败: %v", err)
}
svc := &Service{manager: m}
items, _ := svc.ListDir("qiniu", "/")
if len(items) > 0 {
bucket, _ := items[0]["name"].(string)
svc.ListDir("qiniu", "/"+bucket+"/")
}
m.Disconnect("qiniu")
if _, ok := m.accounts.Load("qiniu"); ok {
t.Error("账户凭据未被清除")
}
}