focalboard/server/app/files_test.go
Harshil Sharma f3faf39eaa
Forward-porting fileinfo limits (#3164)
* Updated go version

* Generated mocks

* lint fix

* lint fix

* lint fix

* backported fileinfo limits

* backported fileinfo limits

* added tests

* synced with main

* Server lint fix

* used a better name
2022-06-13 13:35:42 +05:30

307 lines
9.6 KiB
Go

package app
import (
"errors"
"io"
"os"
"path/filepath"
"strings"
"testing"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/assert"
mmModel "github.com/mattermost/mattermost-server/v6/model"
"github.com/mattermost/mattermost-server/v6/plugin/plugintest/mock"
"github.com/mattermost/mattermost-server/v6/shared/filestore"
"github.com/mattermost/mattermost-server/v6/shared/filestore/mocks"
)
const (
testFileName = "temp-file-name"
testBoardID = "test-board-id"
)
var errDummy = errors.New("hello")
type TestError struct{}
func (err *TestError) Error() string { return "Mocked File backend error" }
func TestGetFileReader(t *testing.T) {
testFilePath := filepath.Join("1", "test-board-id", "temp-file-name")
th, _ := SetupTestHelper(t)
mockedReadCloseSeek := &mocks.ReadCloseSeeker{}
t.Run("should get file reader from filestore successfully", func(t *testing.T) {
mockedFileBackend := &mocks.FileBackend{}
th.App.filesBackend = mockedFileBackend
readerFunc := func(path string) filestore.ReadCloseSeeker {
return mockedReadCloseSeek
}
readerErrorFunc := func(path string) error {
return nil
}
fileExistsFunc := func(path string) bool {
return true
}
fileExistsErrorFunc := func(path string) error {
return nil
}
mockedFileBackend.On("Reader", testFilePath).Return(readerFunc, readerErrorFunc)
mockedFileBackend.On("FileExists", testFilePath).Return(fileExistsFunc, fileExistsErrorFunc)
actual, _ := th.App.GetFileReader("1", testBoardID, testFileName)
assert.Equal(t, mockedReadCloseSeek, actual)
})
t.Run("should get error from filestore when file exists return error", func(t *testing.T) {
mockedFileBackend := &mocks.FileBackend{}
th.App.filesBackend = mockedFileBackend
mockedError := &TestError{}
readerFunc := func(path string) filestore.ReadCloseSeeker {
return mockedReadCloseSeek
}
readerErrorFunc := func(path string) error {
return nil
}
fileExistsFunc := func(path string) bool {
return false
}
fileExistsErrorFunc := func(path string) error {
return mockedError
}
mockedFileBackend.On("Reader", testFilePath).Return(readerFunc, readerErrorFunc)
mockedFileBackend.On("FileExists", testFilePath).Return(fileExistsFunc, fileExistsErrorFunc)
actual, err := th.App.GetFileReader("1", testBoardID, testFileName)
assert.Error(t, err, mockedError)
assert.Nil(t, actual)
})
t.Run("should return error, if get reader from file backend returns error", func(t *testing.T) {
mockedFileBackend := &mocks.FileBackend{}
th.App.filesBackend = mockedFileBackend
mockedError := &TestError{}
readerFunc := func(path string) filestore.ReadCloseSeeker {
return nil
}
readerErrorFunc := func(path string) error {
return mockedError
}
fileExistsFunc := func(path string) bool {
return false
}
fileExistsErrorFunc := func(path string) error {
return nil
}
mockedFileBackend.On("Reader", testFilePath).Return(readerFunc, readerErrorFunc)
mockedFileBackend.On("FileExists", testFilePath).Return(fileExistsFunc, fileExistsErrorFunc)
actual, err := th.App.GetFileReader("1", testBoardID, testFileName)
assert.Error(t, err, mockedError)
assert.Nil(t, actual)
})
t.Run("should move file from old filepath to new filepath, if file doesnot exists in new filepath and workspace id is 0", func(t *testing.T) {
filePath := filepath.Join("0", "test-board-id", "temp-file-name")
workspaceid := "0"
mockedFileBackend := &mocks.FileBackend{}
th.App.filesBackend = mockedFileBackend
readerFunc := func(path string) filestore.ReadCloseSeeker {
return mockedReadCloseSeek
}
readerErrorFunc := func(path string) error {
return nil
}
fileExistsFunc := func(path string) bool {
// return true for old path
return path == testFileName
}
fileExistsErrorFunc := func(path string) error {
return nil
}
moveFileFunc := func(oldFileName, newFileName string) error {
return nil
}
mockedFileBackend.On("FileExists", filePath).Return(fileExistsFunc, fileExistsErrorFunc)
mockedFileBackend.On("FileExists", testFileName).Return(fileExistsFunc, fileExistsErrorFunc)
mockedFileBackend.On("MoveFile", testFileName, filePath).Return(moveFileFunc)
mockedFileBackend.On("Reader", filePath).Return(readerFunc, readerErrorFunc)
actual, _ := th.App.GetFileReader(workspaceid, testBoardID, testFileName)
assert.Equal(t, mockedReadCloseSeek, actual)
})
t.Run("should return file reader, if file doesnot exists in new filepath and old file path", func(t *testing.T) {
filePath := filepath.Join("0", "test-board-id", "temp-file-name")
fileName := testFileName
workspaceid := "0"
mockedFileBackend := &mocks.FileBackend{}
th.App.filesBackend = mockedFileBackend
readerFunc := func(path string) filestore.ReadCloseSeeker {
return mockedReadCloseSeek
}
readerErrorFunc := func(path string) error {
return nil
}
fileExistsFunc := func(path string) bool {
// return true for old path
return false
}
fileExistsErrorFunc := func(path string) error {
return nil
}
moveFileFunc := func(oldFileName, newFileName string) error {
return nil
}
mockedFileBackend.On("FileExists", filePath).Return(fileExistsFunc, fileExistsErrorFunc)
mockedFileBackend.On("FileExists", testFileName).Return(fileExistsFunc, fileExistsErrorFunc)
mockedFileBackend.On("MoveFile", fileName, filePath).Return(moveFileFunc)
mockedFileBackend.On("Reader", filePath).Return(readerFunc, readerErrorFunc)
actual, _ := th.App.GetFileReader(workspaceid, testBoardID, testFileName)
assert.Equal(t, mockedReadCloseSeek, actual)
})
}
func TestSaveFile(t *testing.T) {
th, _ := SetupTestHelper(t)
mockedReadCloseSeek := &mocks.ReadCloseSeeker{}
t.Run("should save file to file store using file backend", func(t *testing.T) {
fileName := "temp-file-name.txt"
mockedFileBackend := &mocks.FileBackend{}
th.App.filesBackend = mockedFileBackend
th.Store.EXPECT().SaveFileInfo(gomock.Any()).Return(nil)
writeFileFunc := func(reader io.Reader, path string) int64 {
paths := strings.Split(path, string(os.PathSeparator))
assert.Equal(t, "1", paths[0])
assert.Equal(t, testBoardID, paths[1])
fileName = paths[2]
return int64(10)
}
writeFileErrorFunc := func(reader io.Reader, filePath string) error {
return nil
}
mockedFileBackend.On("WriteFile", mockedReadCloseSeek, mock.Anything).Return(writeFileFunc, writeFileErrorFunc)
actual, err := th.App.SaveFile(mockedReadCloseSeek, "1", testBoardID, fileName)
assert.Equal(t, fileName, actual)
assert.Nil(t, err)
})
t.Run("should save .jpeg file as jpg file to file store using file backend", func(t *testing.T) {
fileName := "temp-file-name.jpeg"
mockedFileBackend := &mocks.FileBackend{}
th.App.filesBackend = mockedFileBackend
th.Store.EXPECT().SaveFileInfo(gomock.Any()).Return(nil)
writeFileFunc := func(reader io.Reader, path string) int64 {
paths := strings.Split(path, string(os.PathSeparator))
assert.Equal(t, "1", paths[0])
assert.Equal(t, "test-board-id", paths[1])
assert.Equal(t, "jpg", strings.Split(paths[2], ".")[1])
return int64(10)
}
writeFileErrorFunc := func(reader io.Reader, filePath string) error {
return nil
}
mockedFileBackend.On("WriteFile", mockedReadCloseSeek, mock.Anything).Return(writeFileFunc, writeFileErrorFunc)
actual, err := th.App.SaveFile(mockedReadCloseSeek, "1", "test-board-id", fileName)
assert.Nil(t, err)
assert.NotNil(t, actual)
})
t.Run("should return error when fileBackend.WriteFile returns error", func(t *testing.T) {
fileName := "temp-file-name.jpeg"
mockedFileBackend := &mocks.FileBackend{}
th.App.filesBackend = mockedFileBackend
mockedError := &TestError{}
th.Store.EXPECT().SaveFileInfo(gomock.Any()).Return(nil)
writeFileFunc := func(reader io.Reader, path string) int64 {
paths := strings.Split(path, string(os.PathSeparator))
assert.Equal(t, "1", paths[0])
assert.Equal(t, "test-board-id", paths[1])
assert.Equal(t, "jpg", strings.Split(paths[2], ".")[1])
return int64(10)
}
writeFileErrorFunc := func(reader io.Reader, filePath string) error {
return mockedError
}
mockedFileBackend.On("WriteFile", mockedReadCloseSeek, mock.Anything).Return(writeFileFunc, writeFileErrorFunc)
actual, err := th.App.SaveFile(mockedReadCloseSeek, "1", "test-board-id", fileName)
assert.Equal(t, "", actual)
assert.Equal(t, "unable to store the file in the files storage: Mocked File backend error", err.Error())
})
}
func TestGetFileInfo(t *testing.T) {
th, _ := SetupTestHelper(t)
t.Run("should return file info", func(t *testing.T) {
fileInfo := &mmModel.FileInfo{
Id: "file_info_id",
Archived: false,
}
th.Store.EXPECT().GetFileInfo("filename").Return(fileInfo, nil).Times(2)
fetchedFileInfo, err := th.App.GetFileInfo("Afilename")
assert.NoError(t, err)
assert.Equal(t, "file_info_id", fetchedFileInfo.Id)
assert.False(t, fetchedFileInfo.Archived)
fetchedFileInfo, err = th.App.GetFileInfo("Afilename.txt")
assert.NoError(t, err)
assert.Equal(t, "file_info_id", fetchedFileInfo.Id)
assert.False(t, fetchedFileInfo.Archived)
})
t.Run("should return archived file info", func(t *testing.T) {
fileInfo := &mmModel.FileInfo{
Id: "file_info_id",
Archived: true,
}
th.Store.EXPECT().GetFileInfo("filename").Return(fileInfo, nil)
fetchedFileInfo, err := th.App.GetFileInfo("Afilename")
assert.NoError(t, err)
assert.Equal(t, "file_info_id", fetchedFileInfo.Id)
assert.True(t, fetchedFileInfo.Archived)
})
t.Run("should return archived file infoerror", func(t *testing.T) {
th.Store.EXPECT().GetFileInfo("filename").Return(nil, errDummy)
fetchedFileInfo, err := th.App.GetFileInfo("Afilename")
assert.Error(t, err)
assert.Nil(t, fetchedFileInfo)
})
}