|
|
|
package filesystem
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
|
|
model "github.com/HFO4/cloudreve/models"
|
|
|
|
"github.com/HFO4/cloudreve/pkg/conf"
|
|
|
|
"github.com/HFO4/cloudreve/pkg/filesystem/response"
|
|
|
|
"github.com/HFO4/cloudreve/pkg/util"
|
|
|
|
"github.com/jinzhu/gorm"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
testMock "github.com/stretchr/testify/mock"
|
|
|
|
"image"
|
|
|
|
"image/jpeg"
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func CreateTestImage() *os.File {
|
|
|
|
file, err := os.Create("TestFileSystem_GenerateThumbnail.jpeg")
|
|
|
|
alpha := image.NewAlpha(image.Rect(0, 0, 500, 200))
|
|
|
|
jpeg.Encode(file, alpha, nil)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
_, _ = file.Seek(0, 0)
|
|
|
|
return file
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFileSystem_GetThumb(t *testing.T) {
|
|
|
|
asserts := assert.New(t)
|
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
// 正常
|
|
|
|
{
|
|
|
|
fs := FileSystem{
|
|
|
|
User: &model.User{
|
|
|
|
Model: gorm.Model{ID: 1},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
testHandler := new(FileHeaderMock)
|
|
|
|
testHandler.On("Thumb", testMock.Anything, "123.jpg").Return(&response.ContentResponse{URL: "123"}, nil)
|
|
|
|
fs.Handler = testHandler
|
|
|
|
mock.ExpectQuery("SELECT(.+)").
|
|
|
|
WithArgs(10, 1).
|
|
|
|
WillReturnRows(
|
|
|
|
sqlmock.NewRows(
|
|
|
|
[]string{"id", "pic_info", "source_name", "policy_id"}).
|
|
|
|
AddRow(10, "10,10", "123.jpg", 154),
|
|
|
|
)
|
|
|
|
mock.ExpectQuery("SELECT(.+)").
|
|
|
|
WillReturnRows(
|
|
|
|
sqlmock.NewRows(
|
|
|
|
[]string{"id", "type"}).
|
|
|
|
AddRow(154, "mock"),
|
|
|
|
)
|
|
|
|
|
|
|
|
res, err := fs.GetThumb(ctx, 10)
|
|
|
|
asserts.NoError(mock.ExpectationsWereMet())
|
|
|
|
testHandler.AssertExpectations(t)
|
|
|
|
asserts.NoError(err)
|
|
|
|
asserts.Equal("123", res.URL)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 文件不存在
|
|
|
|
{
|
|
|
|
fs := FileSystem{
|
|
|
|
User: &model.User{
|
|
|
|
Model: gorm.Model{ID: 1},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
mock.ExpectQuery("SELECT(.+)").
|
|
|
|
WithArgs(10, 1).
|
|
|
|
WillReturnRows(
|
|
|
|
sqlmock.NewRows(
|
|
|
|
[]string{"id", "pic_info", "source_name"}),
|
|
|
|
)
|
|
|
|
|
|
|
|
_, err := fs.GetThumb(ctx, 10)
|
|
|
|
asserts.NoError(mock.ExpectationsWereMet())
|
|
|
|
asserts.Error(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFileSystem_GenerateThumbnail(t *testing.T) {
|
|
|
|
asserts := assert.New(t)
|
|
|
|
fs := FileSystem{
|
|
|
|
User: &model.User{
|
|
|
|
Model: gorm.Model{ID: 1},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
// 成功
|
|
|
|
{
|
|
|
|
src := CreateTestImage()
|
|
|
|
testHandler := new(FileHeaderMock)
|
|
|
|
testHandler.On("Get", testMock.Anything, "TestFileSystem_GenerateThumbnail.jpeg").Return(src, nil)
|
|
|
|
fs.Handler = testHandler
|
|
|
|
|
|
|
|
mock.ExpectBegin()
|
|
|
|
mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1))
|
|
|
|
mock.ExpectCommit()
|
|
|
|
|
|
|
|
file := &model.File{
|
|
|
|
Model: gorm.Model{ID: 1},
|
|
|
|
Name: "123.jpg",
|
|
|
|
SourceName: "TestFileSystem_GenerateThumbnail.jpeg",
|
|
|
|
}
|
|
|
|
|
|
|
|
fs.GenerateThumbnail(ctx, file)
|
|
|
|
asserts.NoError(mock.ExpectationsWereMet())
|
|
|
|
testHandler.AssertExpectations(t)
|
|
|
|
asserts.True(util.Exists("TestFileSystem_GenerateThumbnail.jpeg" + conf.ThumbConfig.FileSuffix))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 成功,不进行数据库更新
|
|
|
|
{
|
|
|
|
src := CreateTestImage()
|
|
|
|
testHandler := new(FileHeaderMock)
|
|
|
|
testHandler.On("Get", testMock.Anything, "TestFileSystem_GenerateThumbnail.jpeg").Return(src, nil)
|
|
|
|
fs.Handler = testHandler
|
|
|
|
|
|
|
|
file := &model.File{
|
|
|
|
Name: "123.jpg",
|
|
|
|
SourceName: "TestFileSystem_GenerateThumbnail.jpeg",
|
|
|
|
}
|
|
|
|
|
|
|
|
fs.GenerateThumbnail(ctx, file)
|
|
|
|
asserts.NoError(mock.ExpectationsWereMet())
|
|
|
|
testHandler.AssertExpectations(t)
|
|
|
|
asserts.True(util.Exists("TestFileSystem_GenerateThumbnail.jpeg" + conf.ThumbConfig.FileSuffix))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 更新信息失败后删除文件
|
|
|
|
{
|
|
|
|
src := CreateTestImage()
|
|
|
|
testHandler := new(FileHeaderMock)
|
|
|
|
testHandler.On("Get", testMock.Anything, "TestFileSystem_GenerateThumbnail.jpeg").Return(src, nil)
|
|
|
|
testHandler.On("Delete", testMock.Anything, testMock.Anything).Return([]string{}, nil)
|
|
|
|
fs.Handler = testHandler
|
|
|
|
|
|
|
|
mock.ExpectBegin()
|
|
|
|
mock.ExpectExec("UPDATE(.+)").WillReturnError(errors.New("error"))
|
|
|
|
mock.ExpectRollback()
|
|
|
|
|
|
|
|
file := &model.File{
|
|
|
|
Model: gorm.Model{ID: 1},
|
|
|
|
Name: "123.jpg",
|
|
|
|
SourceName: "TestFileSystem_GenerateThumbnail.jpeg",
|
|
|
|
}
|
|
|
|
|
|
|
|
fs.GenerateThumbnail(ctx, file)
|
|
|
|
asserts.NoError(mock.ExpectationsWereMet())
|
|
|
|
testHandler.AssertExpectations(t)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 不能生成缩略图
|
|
|
|
{
|
|
|
|
file := &model.File{
|
|
|
|
Model: gorm.Model{ID: 1},
|
|
|
|
Name: "123.123",
|
|
|
|
SourceName: "TestFileSystem_GenerateThumbnail.jpeg",
|
|
|
|
}
|
|
|
|
|
|
|
|
fs.GenerateThumbnail(ctx, file)
|
|
|
|
asserts.NoError(mock.ExpectationsWereMet())
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFileSystem_GenerateThumbnailSize(t *testing.T) {
|
|
|
|
asserts := assert.New(t)
|
|
|
|
fs := FileSystem{
|
|
|
|
User: &model.User{
|
|
|
|
Model: gorm.Model{ID: 1},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
asserts.NotPanics(func() {
|
|
|
|
_, _ = fs.GenerateThumbnailSize(0, 0)
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|