mirror of https://github.com/cloudreve/Cloudreve
Test: get source URL of files
parent
9f26c0c8ab
commit
d0bb123e03
|
@ -7,18 +7,18 @@ MaxWidth = 400
|
||||||
MaxHeight = 300
|
MaxHeight = 300
|
||||||
FileSuffix = ._thumb
|
FileSuffix = ._thumb
|
||||||
|
|
||||||
; [Database]
|
[Database]
|
||||||
; Type = mysql
|
Type = mysql
|
||||||
; User = root
|
User = root
|
||||||
; Password = root
|
Password = root
|
||||||
; Host = 127.0.0.1:3306
|
Host = 127.0.0.1:3306
|
||||||
; Name = v3
|
Name = v3
|
||||||
; TablePrefix = v3_
|
TablePrefix = v3_
|
||||||
|
|
||||||
; [Redis]
|
[Redis]
|
||||||
; Server = 127.0.0.1:6379
|
Server = 127.0.0.1:6379
|
||||||
; Password =
|
Password =
|
||||||
; DB = 0
|
DB = 0
|
||||||
|
|
||||||
[Captcha]
|
[Captcha]
|
||||||
Height = 60
|
Height = 60
|
||||||
|
|
|
@ -9,7 +9,6 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// SignRequired 验证请求签名
|
// SignRequired 验证请求签名
|
||||||
// TODO 测试
|
|
||||||
func SignRequired() gin.HandlerFunc {
|
func SignRequired() gin.HandlerFunc {
|
||||||
return func(c *gin.Context) {
|
return func(c *gin.Context) {
|
||||||
err := auth.CheckURI(c.Request.URL)
|
err := auth.CheckURI(c.Request.URL)
|
||||||
|
|
|
@ -22,7 +22,6 @@ type Group struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAria2Option 获取用户离线下载设备
|
// GetAria2Option 获取用户离线下载设备
|
||||||
// TODO:测试
|
|
||||||
func (group *Group) GetAria2Option() [3]bool {
|
func (group *Group) GetAria2Option() [3]bool {
|
||||||
if len(group.Aria2Option) != 5 {
|
if len(group.Aria2Option) != 5 {
|
||||||
return [3]bool{false, false, false}
|
return [3]bool{false, false, false}
|
||||||
|
|
|
@ -196,6 +196,7 @@ func addDefaultGroups() {
|
||||||
if gorm.IsRecordNotFoundError(err) {
|
if gorm.IsRecordNotFoundError(err) {
|
||||||
defaultAdminGroup := Group{
|
defaultAdminGroup := Group{
|
||||||
Name: "游客",
|
Name: "游客",
|
||||||
|
Policies: "[]",
|
||||||
}
|
}
|
||||||
if err := DB.Create(&defaultAdminGroup).Error; err != nil {
|
if err := DB.Create(&defaultAdminGroup).Error; err != nil {
|
||||||
util.Log().Panic("无法创建初始游客用户组, %s", err)
|
util.Log().Panic("无法创建初始游客用户组, %s", err)
|
||||||
|
|
|
@ -140,3 +140,29 @@ func TestIsTrueVal(t *testing.T) {
|
||||||
asserts.False(IsTrueVal("0"))
|
asserts.False(IsTrueVal("0"))
|
||||||
asserts.False(IsTrueVal("false"))
|
asserts.False(IsTrueVal("false"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetSiteURL(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
|
||||||
|
// 正常
|
||||||
|
{
|
||||||
|
err := cache.Deletes([]string{"siteURL"}, "setting_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
|
||||||
|
mock.ExpectQuery("SELECT(.+)").WithArgs("siteURL").WillReturnRows(sqlmock.NewRows([]string{"id", "value"}).AddRow(1, "https://drive.cloudreve.org"))
|
||||||
|
siteURL := GetSiteURL()
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.Equal("https://drive.cloudreve.org", siteURL.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
// 失败 返回默认值
|
||||||
|
{
|
||||||
|
err := cache.Deletes([]string{"siteURL"}, "setting_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
|
||||||
|
mock.ExpectQuery("SELECT(.+)").WithArgs("siteURL").WillReturnRows(sqlmock.NewRows([]string{"id", "value"}).AddRow(1, ":][\\/\\]sdf"))
|
||||||
|
siteURL := GetSiteURL()
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.Equal("https://cloudreve.org", siteURL.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ type Auth interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SignURI 对URI进行签名,签名只针对Path部分,query部分不做验证
|
// SignURI 对URI进行签名,签名只针对Path部分,query部分不做验证
|
||||||
// TODO 测试
|
|
||||||
func SignURI(uri string, expires int64) (*url.URL, error) {
|
func SignURI(uri string, expires int64) (*url.URL, error) {
|
||||||
base, err := url.Parse(uri)
|
base, err := url.Parse(uri)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -33,6 +33,8 @@ type Driver interface {
|
||||||
Gets(keys []string, prefix string) (map[string]interface{}, []string)
|
Gets(keys []string, prefix string) (map[string]interface{}, []string)
|
||||||
// 批量设置值
|
// 批量设置值
|
||||||
Sets(values map[string]interface{}, prefix string) error
|
Sets(values map[string]interface{}, prefix string) error
|
||||||
|
// 删除值
|
||||||
|
Delete(keys []string, prefix string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set 设置缓存值
|
// Set 设置缓存值
|
||||||
|
@ -45,6 +47,11 @@ func Get(key string) (interface{}, bool) {
|
||||||
return Store.Get(key)
|
return Store.Get(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deletes 删除值
|
||||||
|
func Deletes(keys []string, prefix string) error {
|
||||||
|
return Store.Delete(keys, prefix)
|
||||||
|
}
|
||||||
|
|
||||||
// GetSettings 根据名称批量获取设置项缓存
|
// GetSettings 根据名称批量获取设置项缓存
|
||||||
func GetSettings(keys []string, prefix string) (map[string]string, []string) {
|
func GetSettings(keys []string, prefix string) (map[string]string, []string) {
|
||||||
raw, miss := Store.Gets(keys, prefix)
|
raw, miss := Store.Gets(keys, prefix)
|
||||||
|
|
|
@ -48,3 +48,11 @@ func (store *MemoStore) Sets(values map[string]interface{}, prefix string) error
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete 批量删除值
|
||||||
|
func (store *MemoStore) Delete(keys []string, prefix string) error {
|
||||||
|
for _, key := range keys {
|
||||||
|
store.Store.Delete(prefix + key)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -106,3 +106,22 @@ func TestMemoStore_Sets(t *testing.T) {
|
||||||
"4": "4.val",
|
"4": "4.val",
|
||||||
}, vals)
|
}, vals)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMemoStore_Delete(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
store := NewMemoStore()
|
||||||
|
|
||||||
|
err := store.Sets(map[string]interface{}{
|
||||||
|
"1": "1.val",
|
||||||
|
"2": "2.val",
|
||||||
|
"3": "3.val",
|
||||||
|
"4": "4.val",
|
||||||
|
}, "test_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
|
||||||
|
err = store.Delete([]string{"1", "2"}, "test_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
values, miss := store.Gets([]string{"1", "2", "3", "4"}, "test_")
|
||||||
|
asserts.Equal([]string{"1", "2"}, miss)
|
||||||
|
asserts.Equal(map[string]interface{}{"3": "3.val", "4": "4.val"}, values)
|
||||||
|
}
|
||||||
|
|
|
@ -169,13 +169,30 @@ func (store *RedisStore) Sets(values map[string]interface{}, prefix string) erro
|
||||||
setValues[prefix+key] = serialized
|
setValues[prefix+key] = serialized
|
||||||
}
|
}
|
||||||
|
|
||||||
if rc.Err() == nil {
|
|
||||||
_, err := rc.Do("MSET", redis.Args{}.AddFlat(setValues)...)
|
_, err := rc.Do("MSET", redis.Args{}.AddFlat(setValues)...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete 批量删除给定的键
|
||||||
|
func (store *RedisStore) Delete(keys []string, prefix string) error {
|
||||||
|
rc := store.pool.Get()
|
||||||
|
defer rc.Close()
|
||||||
|
if rc.Err() != nil {
|
||||||
return rc.Err()
|
return rc.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 处理前缀
|
||||||
|
for i := 0; i < len(keys); i++ {
|
||||||
|
keys[i] = prefix + keys[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := rc.Do("DEL", redis.Args{}.AddFlat(keys)...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -266,3 +266,47 @@ func TestRedisStore_Sets(t *testing.T) {
|
||||||
asserts.Error(err)
|
asserts.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRedisStore_Delete(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
conn := redigomock.NewConn()
|
||||||
|
pool := &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return conn, nil },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
store := &RedisStore{pool: pool}
|
||||||
|
|
||||||
|
// 正常
|
||||||
|
{
|
||||||
|
cmd := conn.Command("DEL", redigomock.NewAnyData(), redigomock.NewAnyData(), redigomock.NewAnyData(), redigomock.NewAnyData()).ExpectSlice("OK")
|
||||||
|
err := store.Delete([]string{"1", "2", "3", "4"}, "test_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 命令执行失败
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
cmd := conn.Command("DEL", redigomock.NewAnyData(), redigomock.NewAnyData(), redigomock.NewAnyData(), redigomock.NewAnyData()).ExpectError(errors.New("error"))
|
||||||
|
err := store.Delete([]string{"1", "2", "3", "4"}, "test_")
|
||||||
|
asserts.Error(err)
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 连接失败
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
store.pool = &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return nil, errors.New("error") },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
err := store.Delete([]string{"1", "2", "3", "4"}, "test_")
|
||||||
|
asserts.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -72,7 +72,6 @@ func (fs *FileSystem) GetDownloadContent(ctx context.Context, path string) (io.R
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetContent 获取文件内容,path为虚拟路径
|
// GetContent 获取文件内容,path为虚拟路径
|
||||||
// TODO:测试
|
|
||||||
func (fs *FileSystem) GetContent(ctx context.Context, path string) (io.ReadSeeker, error) {
|
func (fs *FileSystem) GetContent(ctx context.Context, path string) (io.ReadSeeker, error) {
|
||||||
// 触发`下载前`钩子
|
// 触发`下载前`钩子
|
||||||
err := fs.Trigger(ctx, fs.BeforeFileDownload)
|
err := fs.Trigger(ctx, fs.BeforeFileDownload)
|
||||||
|
@ -94,6 +93,7 @@ func (fs *FileSystem) GetContent(ctx context.Context, path string) (io.ReadSeeke
|
||||||
// 将当前存储策略重设为文件使用的
|
// 将当前存储策略重设为文件使用的
|
||||||
fs.Policy = fs.FileTarget[0].GetPolicy()
|
fs.Policy = fs.FileTarget[0].GetPolicy()
|
||||||
err = fs.dispatchHandler()
|
err = fs.dispatchHandler()
|
||||||
|
defer fs.CleanTargets()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,11 @@ func (fs *FileSystem) GetSource(ctx context.Context, fileID uint) (string, error
|
||||||
|
|
||||||
// 检查存储策略是否可以获得外链
|
// 检查存储策略是否可以获得外链
|
||||||
if !fs.Policy.IsOriginLinkEnable {
|
if !fs.Policy.IsOriginLinkEnable {
|
||||||
return "", serializer.NewError(serializer.CodePolicyNotAllowed, "当前存储策略无法获得外链", nil)
|
return "", serializer.NewError(
|
||||||
|
serializer.CodePolicyNotAllowed,
|
||||||
|
"当前存储策略无法获得外链",
|
||||||
|
nil,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成外链地址
|
// 生成外链地址
|
||||||
|
|
|
@ -4,6 +4,8 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/DATA-DOG/go-sqlmock"
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
model "github.com/HFO4/cloudreve/models"
|
model "github.com/HFO4/cloudreve/models"
|
||||||
|
"github.com/HFO4/cloudreve/pkg/auth"
|
||||||
|
"github.com/HFO4/cloudreve/pkg/cache"
|
||||||
"github.com/HFO4/cloudreve/pkg/filesystem/fsctx"
|
"github.com/HFO4/cloudreve/pkg/filesystem/fsctx"
|
||||||
"github.com/HFO4/cloudreve/pkg/filesystem/local"
|
"github.com/HFO4/cloudreve/pkg/filesystem/local"
|
||||||
"github.com/HFO4/cloudreve/pkg/serializer"
|
"github.com/HFO4/cloudreve/pkg/serializer"
|
||||||
|
@ -263,3 +265,109 @@ func TestFileSystem_deleteGroupedFile(t *testing.T) {
|
||||||
}, failed)
|
}, failed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFileSystem_GetSource(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
ctx := context.Background()
|
||||||
|
fs := FileSystem{
|
||||||
|
User: &model.User{Model: gorm.Model{ID: 1}},
|
||||||
|
}
|
||||||
|
auth.General = auth.HMACAuth{SecretKey: []byte("123")}
|
||||||
|
|
||||||
|
// 正常
|
||||||
|
{
|
||||||
|
// 清空缓存
|
||||||
|
err := cache.Deletes([]string{"siteURL"}, "setting_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
// 查找文件
|
||||||
|
mock.ExpectQuery("SELECT(.+)").
|
||||||
|
WithArgs(2, 1).
|
||||||
|
WillReturnRows(
|
||||||
|
sqlmock.NewRows([]string{"id", "policy_id", "source_name"}).
|
||||||
|
AddRow(2, 35, "1.txt"),
|
||||||
|
)
|
||||||
|
// 查找上传策略
|
||||||
|
mock.ExpectQuery("SELECT(.+)").
|
||||||
|
WillReturnRows(
|
||||||
|
sqlmock.NewRows([]string{"id", "type", "is_origin_link_enable"}).
|
||||||
|
AddRow(35, "local", true),
|
||||||
|
)
|
||||||
|
// 查找站点URL
|
||||||
|
mock.ExpectQuery("SELECT(.+)").WithArgs("siteURL").WillReturnRows(sqlmock.NewRows([]string{"id", "value"}).AddRow(1, "https://cloudreve.org"))
|
||||||
|
|
||||||
|
sourceURL, err := fs.GetSource(ctx, 2)
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.NoError(err)
|
||||||
|
asserts.NotEmpty(sourceURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 文件不存在
|
||||||
|
{
|
||||||
|
// 清空缓存
|
||||||
|
err := cache.Deletes([]string{"siteURL"}, "setting_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
// 查找文件
|
||||||
|
mock.ExpectQuery("SELECT(.+)").
|
||||||
|
WithArgs(2, 1).
|
||||||
|
WillReturnRows(
|
||||||
|
sqlmock.NewRows([]string{"id", "policy_id", "source_name"}),
|
||||||
|
)
|
||||||
|
|
||||||
|
sourceURL, err := fs.GetSource(ctx, 2)
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.Error(err)
|
||||||
|
asserts.Equal(ErrObjectNotExist.Code, err.(serializer.AppError).Code)
|
||||||
|
asserts.Empty(sourceURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 未知上传策略
|
||||||
|
{
|
||||||
|
// 清空缓存
|
||||||
|
err := cache.Deletes([]string{"siteURL"}, "setting_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
// 查找文件
|
||||||
|
mock.ExpectQuery("SELECT(.+)").
|
||||||
|
WithArgs(2, 1).
|
||||||
|
WillReturnRows(
|
||||||
|
sqlmock.NewRows([]string{"id", "policy_id", "source_name"}).
|
||||||
|
AddRow(2, 35, "1.txt"),
|
||||||
|
)
|
||||||
|
// 查找上传策略
|
||||||
|
mock.ExpectQuery("SELECT(.+)").
|
||||||
|
WillReturnRows(
|
||||||
|
sqlmock.NewRows([]string{"id", "type", "is_origin_link_enable"}).
|
||||||
|
AddRow(35, "?", true),
|
||||||
|
)
|
||||||
|
|
||||||
|
sourceURL, err := fs.GetSource(ctx, 2)
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.Error(err)
|
||||||
|
asserts.Empty(sourceURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 不允许获取外链
|
||||||
|
{
|
||||||
|
// 清空缓存
|
||||||
|
err := cache.Deletes([]string{"siteURL"}, "setting_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
// 查找文件
|
||||||
|
mock.ExpectQuery("SELECT(.+)").
|
||||||
|
WithArgs(2, 1).
|
||||||
|
WillReturnRows(
|
||||||
|
sqlmock.NewRows([]string{"id", "policy_id", "source_name"}).
|
||||||
|
AddRow(2, 35, "1.txt"),
|
||||||
|
)
|
||||||
|
// 查找上传策略
|
||||||
|
mock.ExpectQuery("SELECT(.+)").
|
||||||
|
WillReturnRows(
|
||||||
|
sqlmock.NewRows([]string{"id", "type", "is_origin_link_enable"}).
|
||||||
|
AddRow(35, "local", false),
|
||||||
|
)
|
||||||
|
|
||||||
|
sourceURL, err := fs.GetSource(ctx, 2)
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.Error(err)
|
||||||
|
asserts.Equal(serializer.CodePolicyNotAllowed, err.(serializer.AppError).Code)
|
||||||
|
asserts.Empty(sourceURL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -80,7 +80,6 @@ func NewFileSystem(user *model.User) (*FileSystem, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewAnonymousFileSystem 初始化匿名文件系统
|
// NewAnonymousFileSystem 初始化匿名文件系统
|
||||||
// TODO 测试
|
|
||||||
func NewAnonymousFileSystem() (*FileSystem, error) {
|
func NewAnonymousFileSystem() (*FileSystem, error) {
|
||||||
fs := &FileSystem{
|
fs := &FileSystem{
|
||||||
User: &model.User{},
|
User: &model.User{},
|
||||||
|
@ -160,3 +159,9 @@ func (fs *FileSystem) SetTargetFileByIDs(ids []uint) error {
|
||||||
fs.SetTargetFile(&files)
|
fs.SetTargetFile(&files)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CleanTargets 清空目标
|
||||||
|
func (fs *FileSystem) CleanTargets() {
|
||||||
|
fs.FileTarget = []model.File{}
|
||||||
|
fs.DirTarget = []model.Folder{}
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package filesystem
|
package filesystem
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
model "github.com/HFO4/cloudreve/models"
|
model "github.com/HFO4/cloudreve/models"
|
||||||
"github.com/HFO4/cloudreve/pkg/filesystem/local"
|
"github.com/HFO4/cloudreve/pkg/filesystem/local"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
@ -63,3 +64,63 @@ func TestDispatchHandler(t *testing.T) {
|
||||||
err = fs.dispatchHandler()
|
err = fs.dispatchHandler()
|
||||||
asserts.Error(err)
|
asserts.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFileSystem_SetTargetFileByIDs(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
|
||||||
|
// 成功
|
||||||
|
{
|
||||||
|
fs := &FileSystem{}
|
||||||
|
mock.ExpectQuery("SELECT(.+)").
|
||||||
|
WithArgs(1, 2).
|
||||||
|
WillReturnRows(sqlmock.NewRows([]string{"id", "name"}).AddRow(1, "1.txt"))
|
||||||
|
err := fs.SetTargetFileByIDs([]uint{1, 2})
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.Len(fs.FileTarget, 1)
|
||||||
|
asserts.NoError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 未找到
|
||||||
|
{
|
||||||
|
fs := &FileSystem{}
|
||||||
|
mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "name"}))
|
||||||
|
err := fs.SetTargetFileByIDs([]uint{1, 2})
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.Len(fs.FileTarget, 0)
|
||||||
|
asserts.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFileSystem_CleanTargets(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
fs := &FileSystem{
|
||||||
|
FileTarget: []model.File{{}, {}},
|
||||||
|
DirTarget: []model.Folder{{}, {}},
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.CleanTargets()
|
||||||
|
asserts.Len(fs.FileTarget, 0)
|
||||||
|
asserts.Len(fs.DirTarget, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewAnonymousFileSystem(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
|
||||||
|
// 正常
|
||||||
|
{
|
||||||
|
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policies"}).AddRow(3, "游客", "[]"))
|
||||||
|
fs, err := NewAnonymousFileSystem()
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.NoError(err)
|
||||||
|
asserts.Equal("游客", fs.User.Group.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 游客用户组不存在
|
||||||
|
{
|
||||||
|
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policies"}))
|
||||||
|
fs, err := NewAnonymousFileSystem()
|
||||||
|
asserts.NoError(mock.ExpectationsWereMet())
|
||||||
|
asserts.Error(err)
|
||||||
|
asserts.Nil(fs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -29,7 +29,6 @@ func (fs *FileSystem) GetThumb(ctx context.Context, id uint) (*response.ContentR
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.FileTarget = []model.File{file[0]}
|
fs.FileTarget = []model.File{file[0]}
|
||||||
|
|
||||||
res, err := fs.Handler.Thumb(ctx, file[0].SourceName)
|
res, err := fs.Handler.Thumb(ctx, file[0].SourceName)
|
||||||
|
|
||||||
// TODO 出错时重新生成缩略图
|
// TODO 出错时重新生成缩略图
|
||||||
|
|
|
@ -2,11 +2,16 @@ package local
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
model "github.com/HFO4/cloudreve/models"
|
||||||
|
"github.com/HFO4/cloudreve/pkg/auth"
|
||||||
"github.com/HFO4/cloudreve/pkg/conf"
|
"github.com/HFO4/cloudreve/pkg/conf"
|
||||||
|
"github.com/HFO4/cloudreve/pkg/filesystem/fsctx"
|
||||||
"github.com/HFO4/cloudreve/pkg/util"
|
"github.com/HFO4/cloudreve/pkg/util"
|
||||||
|
"github.com/jinzhu/gorm"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -112,3 +117,37 @@ func TestHandler_Thumb(t *testing.T) {
|
||||||
asserts.Error(err)
|
asserts.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHandler_Source(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
handler := Handler{}
|
||||||
|
ctx := context.Background()
|
||||||
|
auth.General = auth.HMACAuth{SecretKey: []byte("test")}
|
||||||
|
|
||||||
|
// 成功
|
||||||
|
{
|
||||||
|
file := model.File{
|
||||||
|
Model: gorm.Model{
|
||||||
|
ID: 1,
|
||||||
|
},
|
||||||
|
Name: "test.jpg",
|
||||||
|
}
|
||||||
|
ctx := context.WithValue(ctx, fsctx.FileModelCtx, file)
|
||||||
|
baseURL, err := url.Parse("https://cloudreve.org")
|
||||||
|
asserts.NoError(err)
|
||||||
|
sourceURL, err := handler.Source(ctx, "", *baseURL, 0)
|
||||||
|
asserts.NoError(err)
|
||||||
|
asserts.NotEmpty(sourceURL)
|
||||||
|
asserts.Contains(sourceURL, "sign=")
|
||||||
|
asserts.Contains(sourceURL, "https://cloudreve.org")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 无法获取上下文
|
||||||
|
{
|
||||||
|
baseURL, err := url.Parse("https://cloudreve.org")
|
||||||
|
asserts.NoError(err)
|
||||||
|
sourceURL, err := handler.Source(ctx, "", *baseURL, 0)
|
||||||
|
asserts.Error(err)
|
||||||
|
asserts.Empty(sourceURL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ func TestCaptcha(t *testing.T) {
|
||||||
|
|
||||||
req, _ := http.NewRequest(
|
req, _ := http.NewRequest(
|
||||||
"GET",
|
"GET",
|
||||||
"/api/v3/captcha",
|
"/api/v3/site/captcha",
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -239,7 +239,7 @@ func TestSiteConfigRoute(t *testing.T) {
|
||||||
)
|
)
|
||||||
router.ServeHTTP(w, req)
|
router.ServeHTTP(w, req)
|
||||||
asserts.Equal(200, w.Code)
|
asserts.Equal(200, w.Code)
|
||||||
asserts.Contains(w.Body.String(), "\"title\":\"\"")
|
asserts.Contains(w.Body.String(), "\"title\"")
|
||||||
|
|
||||||
model.DB.Model(&model.Setting{
|
model.DB.Model(&model.Setting{
|
||||||
Model: gorm.Model{
|
Model: gorm.Model{
|
||||||
|
|
Loading…
Reference in New Issue