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) } }