85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
|
|
package storage
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"context"
|
||
|
|
"io"
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
type fakeHostStorage struct {
|
||
|
|
files map[string][]byte
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *fakeHostStorage) DefaultProvider(context.Context) (string, error) {
|
||
|
|
return "system", nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *fakeHostStorage) Upload(
|
||
|
|
_ context.Context,
|
||
|
|
provider, key, _, _ string,
|
||
|
|
_ int64,
|
||
|
|
reader io.Reader,
|
||
|
|
) (string, error) {
|
||
|
|
data, err := io.ReadAll(reader)
|
||
|
|
if err != nil {
|
||
|
|
return "", err
|
||
|
|
}
|
||
|
|
s.files[provider+":"+key] = data
|
||
|
|
return "/files/" + key, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *fakeHostStorage) Open(_ context.Context, provider, key string) (io.ReadCloser, error) {
|
||
|
|
return io.NopCloser(bytes.NewReader(s.files[provider+":"+key])), nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (*fakeHostStorage) URL(_ context.Context, _ string, key string) (string, error) {
|
||
|
|
return "/files/" + key, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *fakeHostStorage) Delete(_ context.Context, provider, key string) error {
|
||
|
|
delete(s.files, provider+":"+key)
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestHostStorageProvider(t *testing.T) {
|
||
|
|
host := &fakeHostStorage{files: make(map[string][]byte)}
|
||
|
|
SetHostStorage(host)
|
||
|
|
t.Cleanup(func() { SetHostStorage(nil) })
|
||
|
|
|
||
|
|
provider, err := GetDefault()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("GetDefault() error = %v", err)
|
||
|
|
}
|
||
|
|
if got := string(provider.ProviderType()); got != "system" {
|
||
|
|
t.Fatalf("ProviderType() = %q, want system", got)
|
||
|
|
}
|
||
|
|
|
||
|
|
stored, err := provider.Upload(strings.NewReader("hello"), "chat/a.txt", UploadInfo{
|
||
|
|
Filename: "a.txt",
|
||
|
|
FileSize: 5,
|
||
|
|
MimeType: "text/plain",
|
||
|
|
})
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("Upload() error = %v", err)
|
||
|
|
}
|
||
|
|
if stored.URL != "/files/chat/a.txt" {
|
||
|
|
t.Fatalf("stored URL = %q", stored.URL)
|
||
|
|
}
|
||
|
|
|
||
|
|
reader, err := provider.Read("chat/a.txt")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("Read() error = %v", err)
|
||
|
|
}
|
||
|
|
defer reader.Close()
|
||
|
|
data, err := io.ReadAll(reader)
|
||
|
|
if err != nil || string(data) != "hello" {
|
||
|
|
t.Fatalf("Read() = %q, %v", data, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
if err = provider.Delete("chat/a.txt"); err != nil {
|
||
|
|
t.Fatalf("Delete() error = %v", err)
|
||
|
|
}
|
||
|
|
}
|