parent
5d406f1c6a
commit
5ab93a6e0d
@ -0,0 +1,144 @@
|
|||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"github.com/cloudreve/Cloudreve/v3/bootstrap"
|
||||||
|
"github.com/cloudreve/Cloudreve/v3/pkg/cache"
|
||||||
|
"github.com/cloudreve/Cloudreve/v3/pkg/util"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
testMock "github.com/stretchr/testify/mock"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type StaticMock struct {
|
||||||
|
testMock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m StaticMock) Open(name string) (http.File, error) {
|
||||||
|
args := m.Called(name)
|
||||||
|
return args.Get(0).(http.File), args.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m StaticMock) Exists(prefix string, filepath string) bool {
|
||||||
|
args := m.Called(prefix, filepath)
|
||||||
|
return args.Bool(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFrontendFileHandler(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
|
||||||
|
// 静态资源未加载
|
||||||
|
{
|
||||||
|
TestFunc := FrontendFileHandler()
|
||||||
|
|
||||||
|
c, _ := gin.CreateTestContext(rec)
|
||||||
|
c.Params = []gin.Param{}
|
||||||
|
c.Request, _ = http.NewRequest("GET", "/", nil)
|
||||||
|
TestFunc(c)
|
||||||
|
asserts.False(c.IsAborted())
|
||||||
|
}
|
||||||
|
|
||||||
|
// index.html 不存在
|
||||||
|
{
|
||||||
|
testStatic := &StaticMock{}
|
||||||
|
bootstrap.StaticFS = testStatic
|
||||||
|
testStatic.On("Open", "/index.html").
|
||||||
|
Return(&os.File{}, errors.New("error"))
|
||||||
|
TestFunc := FrontendFileHandler()
|
||||||
|
|
||||||
|
c, _ := gin.CreateTestContext(rec)
|
||||||
|
c.Params = []gin.Param{}
|
||||||
|
c.Request, _ = http.NewRequest("GET", "/", nil)
|
||||||
|
TestFunc(c)
|
||||||
|
asserts.False(c.IsAborted())
|
||||||
|
}
|
||||||
|
|
||||||
|
// index.html 读取失败
|
||||||
|
{
|
||||||
|
file, _ := util.CreatNestedFile("tests/index.html")
|
||||||
|
file.Close()
|
||||||
|
testStatic := &StaticMock{}
|
||||||
|
bootstrap.StaticFS = testStatic
|
||||||
|
testStatic.On("Open", "/index.html").
|
||||||
|
Return(file, nil)
|
||||||
|
TestFunc := FrontendFileHandler()
|
||||||
|
|
||||||
|
c, _ := gin.CreateTestContext(rec)
|
||||||
|
c.Params = []gin.Param{}
|
||||||
|
c.Request, _ = http.NewRequest("GET", "/", nil)
|
||||||
|
TestFunc(c)
|
||||||
|
asserts.False(c.IsAborted())
|
||||||
|
}
|
||||||
|
|
||||||
|
// 成功且命中
|
||||||
|
{
|
||||||
|
file, _ := util.CreatNestedFile("tests/index.html")
|
||||||
|
defer file.Close()
|
||||||
|
testStatic := &StaticMock{}
|
||||||
|
bootstrap.StaticFS = testStatic
|
||||||
|
testStatic.On("Open", "/index.html").
|
||||||
|
Return(file, nil)
|
||||||
|
TestFunc := FrontendFileHandler()
|
||||||
|
|
||||||
|
c, _ := gin.CreateTestContext(rec)
|
||||||
|
c.Params = []gin.Param{}
|
||||||
|
c.Request, _ = http.NewRequest("GET", "/", nil)
|
||||||
|
|
||||||
|
cache.Set("setting_siteName", "cloudreve", 0)
|
||||||
|
cache.Set("setting_siteKeywords", "cloudreve", 0)
|
||||||
|
cache.Set("setting_siteScript", "cloudreve", 0)
|
||||||
|
cache.Set("setting_pwa_small_icon", "cloudreve", 0)
|
||||||
|
|
||||||
|
TestFunc(c)
|
||||||
|
asserts.True(c.IsAborted())
|
||||||
|
}
|
||||||
|
|
||||||
|
// 成功且命中静态文件
|
||||||
|
{
|
||||||
|
file, _ := util.CreatNestedFile("tests/index.html")
|
||||||
|
defer file.Close()
|
||||||
|
testStatic := &StaticMock{}
|
||||||
|
bootstrap.StaticFS = testStatic
|
||||||
|
testStatic.On("Open", "/index.html").
|
||||||
|
Return(file, nil)
|
||||||
|
testStatic.On("Exists", "/", "/2").
|
||||||
|
Return(true)
|
||||||
|
testStatic.On("Open", "/2").
|
||||||
|
Return(file, nil)
|
||||||
|
TestFunc := FrontendFileHandler()
|
||||||
|
|
||||||
|
c, _ := gin.CreateTestContext(rec)
|
||||||
|
c.Params = []gin.Param{}
|
||||||
|
c.Request, _ = http.NewRequest("GET", "/2", nil)
|
||||||
|
|
||||||
|
TestFunc(c)
|
||||||
|
asserts.True(c.IsAborted())
|
||||||
|
testStatic.AssertExpectations(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
// API 相关跳过
|
||||||
|
{
|
||||||
|
for _, reqPath := range []string{"/api/user", "/manifest.json", "/dav/path"} {
|
||||||
|
file, _ := util.CreatNestedFile("tests/index.html")
|
||||||
|
defer file.Close()
|
||||||
|
testStatic := &StaticMock{}
|
||||||
|
bootstrap.StaticFS = testStatic
|
||||||
|
testStatic.On("Open", "/index.html").
|
||||||
|
Return(file, nil)
|
||||||
|
TestFunc := FrontendFileHandler()
|
||||||
|
|
||||||
|
c, _ := gin.CreateTestContext(rec)
|
||||||
|
c.Params = []gin.Param{}
|
||||||
|
c.Request, _ = http.NewRequest("GET", reqPath, nil)
|
||||||
|
|
||||||
|
TestFunc(c)
|
||||||
|
asserts.False(c.IsAborted())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in new issue