mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-29 22:06:38 +08:00
528240026d
- make format 现在与 code-check 使用同一格式化器(golangci-lint fmt),消除 goimports -local 与 gofumpt 的格式拉锯 - .golangci.yml 关闭默认 50/3 截断,完整上报所有问题(只增强不弱化) - 全库 gofumpt 规范化(203 files, 纯格式无行为变更)
100 lines
2.5 KiB
Go
100 lines
2.5 KiB
Go
// Copyright 2026 Arctel.net
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package storage_test
|
|
|
|
import (
|
|
"Wavelet/core"
|
|
"Wavelet/core/contracts"
|
|
"Wavelet/plugins/infra/storage"
|
|
"Wavelet/plugins/infra/storage/objectstore"
|
|
"bytes"
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type mockStorageBackend struct {
|
|
mu sync.RWMutex
|
|
files map[string][]byte
|
|
}
|
|
|
|
func newMockStorageBackend() *mockStorageBackend {
|
|
return &mockStorageBackend{files: make(map[string][]byte)}
|
|
}
|
|
|
|
func (m *mockStorageBackend) Put(ctx context.Context, key string, body io.Reader, size int64, contentType string) (objectstore.PutResult, error) {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
data, err := io.ReadAll(body)
|
|
if err != nil {
|
|
return objectstore.PutResult{}, err
|
|
}
|
|
m.files[key] = data
|
|
return objectstore.PutResult{Key: key, Bucket: "mock-bucket"}, nil
|
|
}
|
|
|
|
func (m *mockStorageBackend) Get(ctx context.Context, key string) (*objectstore.Object, error) {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
data, ok := m.files[key]
|
|
if !ok {
|
|
return nil, errors.New("file not found")
|
|
}
|
|
return &objectstore.Object{
|
|
Body: io.NopCloser(bytes.NewReader(data)),
|
|
ContentLength: int64(len(data)),
|
|
ContentType: "application/octet-stream",
|
|
}, nil
|
|
}
|
|
|
|
func (m *mockStorageBackend) Delete(ctx context.Context, key string) error {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
delete(m.files, key)
|
|
return nil
|
|
}
|
|
|
|
func (m *mockStorageBackend) Test(ctx context.Context) error {
|
|
return nil
|
|
}
|
|
|
|
func TestStoragePluginOperations(t *testing.T) {
|
|
backend := newMockStorageBackend()
|
|
p := storage.New(storage.WithBackend(backend))
|
|
assert.Equal(t, "storage", p.Name())
|
|
|
|
ctx := core.NewContext(context.Background())
|
|
require.NoError(t, p.Apply(ctx))
|
|
|
|
svc, err := core.Inject[contracts.StorageService](ctx)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, svc)
|
|
|
|
testCtx := context.Background()
|
|
|
|
// Put
|
|
content := []byte("wavelet storage content")
|
|
putRes, err := svc.Put(testCtx, "avatar/user1.png", bytes.NewReader(content), int64(len(content)), "image/png")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "avatar/user1.png", putRes.Key)
|
|
assert.Equal(t, "mock-bucket", putRes.Bucket)
|
|
|
|
// Get
|
|
obj, err := svc.Get(testCtx, "avatar/user1.png")
|
|
require.NoError(t, err)
|
|
data, err := io.ReadAll(obj.Body)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, content, data)
|
|
|
|
// Delete
|
|
require.NoError(t, svc.Delete(testCtx, "avatar/user1.png"))
|
|
_, err = svc.Get(testCtx, "avatar/user1.png")
|
|
assert.Error(t, err)
|
|
}
|