mirror of
https://github.com/Awuqing/BackupX.git
synced 2026-05-16 23:37:37 +08:00
80 lines
2.7 KiB
Go
80 lines
2.7 KiB
Go
package webdav
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"backupx/server/internal/storage"
|
|
)
|
|
|
|
type fakeFileInfo struct {
|
|
name string
|
|
size int64
|
|
mod time.Time
|
|
dir bool
|
|
}
|
|
|
|
func (f fakeFileInfo) Name() string { return f.name }
|
|
func (f fakeFileInfo) Size() int64 { return f.size }
|
|
func (f fakeFileInfo) Mode() os.FileMode { return 0 }
|
|
func (f fakeFileInfo) ModTime() time.Time { return f.mod }
|
|
func (f fakeFileInfo) IsDir() bool { return f.dir }
|
|
func (f fakeFileInfo) Sys() any { return nil }
|
|
|
|
type fakeClient struct{ data map[string]string }
|
|
|
|
func (c *fakeClient) ReadDir(_ string) ([]os.FileInfo, error) {
|
|
return []os.FileInfo{fakeFileInfo{name: "backup.tar.gz", size: int64(len(c.data["/storage/backup.tar.gz"])), mod: time.Now().UTC()}}, nil
|
|
}
|
|
func (c *fakeClient) WriteStream(path string, stream io.Reader, _ os.FileMode) error {
|
|
content, _ := io.ReadAll(stream)
|
|
c.data[path] = string(content)
|
|
return nil
|
|
}
|
|
func (c *fakeClient) ReadStream(path string) (io.ReadCloser, error) {
|
|
return io.NopCloser(strings.NewReader(c.data[path])), nil
|
|
}
|
|
func (c *fakeClient) Remove(path string) error { delete(c.data, path); return nil }
|
|
func (c *fakeClient) MkdirAll(_ string, _ os.FileMode) error { return nil }
|
|
func (c *fakeClient) Stat(path string) (os.FileInfo, error) {
|
|
return fakeFileInfo{name: path, dir: true}, nil
|
|
}
|
|
|
|
func TestWebDAVProviderCRUD(t *testing.T) {
|
|
factory := Factory{newClient: func(storage.WebDAVConfig) client { return &fakeClient{data: make(map[string]string)} }}
|
|
providerAny, err := factory.New(context.Background(), map[string]any{"endpoint": "http://dav.example.com", "basePath": "/storage"})
|
|
if err != nil {
|
|
t.Fatalf("Factory.New returned error: %v", err)
|
|
}
|
|
provider := providerAny.(*Provider)
|
|
if err := provider.TestConnection(context.Background()); err != nil {
|
|
t.Fatalf("TestConnection returned error: %v", err)
|
|
}
|
|
if err := provider.Upload(context.Background(), "backup.tar.gz", strings.NewReader("payload"), 7, nil); err != nil {
|
|
t.Fatalf("Upload returned error: %v", err)
|
|
}
|
|
reader, err := provider.Download(context.Background(), "backup.tar.gz")
|
|
if err != nil {
|
|
t.Fatalf("Download returned error: %v", err)
|
|
}
|
|
defer reader.Close()
|
|
content, _ := io.ReadAll(reader)
|
|
if string(content) != "payload" {
|
|
t.Fatalf("unexpected content: %s", string(content))
|
|
}
|
|
items, err := provider.List(context.Background(), "storage")
|
|
if err != nil {
|
|
t.Fatalf("List returned error: %v", err)
|
|
}
|
|
if len(items) != 1 || items[0].Key != "storage/backup.tar.gz" {
|
|
t.Fatalf("unexpected list result: %#v", items)
|
|
}
|
|
if err := provider.Delete(context.Background(), "backup.tar.gz"); err != nil {
|
|
t.Fatalf("Delete returned error: %v", err)
|
|
}
|
|
}
|