You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudreve/middleware/share_test.go

191 lines
3.9 KiB

package middleware
import (
"net/http/httptest"
"testing"
"github.com/DATA-DOG/go-sqlmock"
model "github.com/cloudreve/Cloudreve/v3/models"
"github.com/cloudreve/Cloudreve/v3/pkg/conf"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
"github.com/stretchr/testify/assert"
)
func TestShareAvailable(t *testing.T) {
asserts := assert.New(t)
rec := httptest.NewRecorder()
testFunc := ShareAvailable()
// 分享不存在
{
c, _ := gin.CreateTestContext(rec)
c.Params = []gin.Param{
{"id", "empty"},
}
testFunc(c)
asserts.True(c.IsAborted())
}
// 通过
{
conf.SystemConfig.HashIDSalt = ""
// 用户组
mock.ExpectQuery("SELECT(.+)groups(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(3))
mock.ExpectQuery("SELECT(.+)shares(.+)").
WillReturnRows(
sqlmock.NewRows(
[]string{"id", "remain_downloads", "source_id"}).
AddRow(1, 1, 2),
)
mock.ExpectQuery("SELECT(.+)files(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(2))
c, _ := gin.CreateTestContext(rec)
c.Params = []gin.Param{
{"id", "x9T4"},
}
testFunc(c)
asserts.NoError(mock.ExpectationsWereMet())
asserts.False(c.IsAborted())
asserts.NotNil(c.Get("user"))
asserts.NotNil(c.Get("share"))
}
}
func TestShareCanPreview(t *testing.T) {
asserts := assert.New(t)
rec := httptest.NewRecorder()
testFunc := ShareCanPreview()
// 无分享上下文
{
c, _ := gin.CreateTestContext(rec)
testFunc(c)
asserts.True(c.IsAborted())
}
// 可以预览
{
c, _ := gin.CreateTestContext(rec)
c.Set("share", &model.Share{PreviewEnabled: true})
testFunc(c)
asserts.False(c.IsAborted())
}
// 未开启预览
{
c, _ := gin.CreateTestContext(rec)
c.Set("share", &model.Share{PreviewEnabled: false})
testFunc(c)
asserts.True(c.IsAborted())
}
}
func TestCheckShareUnlocked(t *testing.T) {
asserts := assert.New(t)
rec := httptest.NewRecorder()
testFunc := CheckShareUnlocked()
// 无分享上下文
{
c, _ := gin.CreateTestContext(rec)
testFunc(c)
asserts.True(c.IsAborted())
}
// 无密码
{
c, _ := gin.CreateTestContext(rec)
c.Set("share", &model.Share{})
testFunc(c)
asserts.False(c.IsAborted())
}
}
func TestBeforeShareDownload(t *testing.T) {
asserts := assert.New(t)
rec := httptest.NewRecorder()
testFunc := BeforeShareDownload()
// 无分享上下文
{
c, _ := gin.CreateTestContext(rec)
testFunc(c)
asserts.True(c.IsAborted())
c, _ = gin.CreateTestContext(rec)
c.Set("share", &model.Share{})
testFunc(c)
asserts.True(c.IsAborted())
}
// 用户不能下载
{
c, _ := gin.CreateTestContext(rec)
c.Set("share", &model.Share{})
c.Set("user", &model.User{
Group: model.Group{OptionsSerialized: model.GroupOption{}},
})
testFunc(c)
asserts.True(c.IsAborted())
}
// 可以下载
{
c, _ := gin.CreateTestContext(rec)
c.Set("share", &model.Share{})
c.Set("user", &model.User{
Model: gorm.Model{ID: 1},
Group: model.Group{OptionsSerialized: model.GroupOption{
ShareDownload: true,
}},
})
testFunc(c)
asserts.False(c.IsAborted())
}
}
func TestShareOwner(t *testing.T) {
asserts := assert.New(t)
rec := httptest.NewRecorder()
testFunc := ShareOwner()
// 未登录
{
c, _ := gin.CreateTestContext(rec)
testFunc(c)
asserts.True(c.IsAborted())
c, _ = gin.CreateTestContext(rec)
c.Set("share", &model.Share{})
testFunc(c)
asserts.True(c.IsAborted())
}
// 非用户所创建分享
{
c, _ := gin.CreateTestContext(rec)
testFunc(c)
asserts.True(c.IsAborted())
c, _ = gin.CreateTestContext(rec)
c.Set("share", &model.Share{User: model.User{Model: gorm.Model{ID: 1}}})
c.Set("user", &model.User{})
testFunc(c)
asserts.True(c.IsAborted())
}
// 正常
{
c, _ := gin.CreateTestContext(rec)
testFunc(c)
asserts.True(c.IsAborted())
c, _ = gin.CreateTestContext(rec)
c.Set("share", &model.Share{})
c.Set("user", &model.User{})
testFunc(c)
asserts.False(c.IsAborted())
}
}