github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/filesystem/image_test.go (about)

     1  package filesystem
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	model "github.com/cloudreve/Cloudreve/v3/models"
     7  	"github.com/cloudreve/Cloudreve/v3/pkg/cache"
     8  	"github.com/cloudreve/Cloudreve/v3/pkg/filesystem/driver"
     9  	"github.com/cloudreve/Cloudreve/v3/pkg/filesystem/response"
    10  	"github.com/cloudreve/Cloudreve/v3/pkg/mocks/thumbmock"
    11  	"github.com/cloudreve/Cloudreve/v3/pkg/thumb"
    12  	testMock "github.com/stretchr/testify/mock"
    13  	"testing"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  func TestFileSystem_GetThumb(t *testing.T) {
    19  	a := assert.New(t)
    20  	fs := &FileSystem{User: &model.User{}}
    21  
    22  	// file not found
    23  	{
    24  		mock.ExpectQuery("SELECT(.+)").WillReturnError(errors.New("error"))
    25  		res, err := fs.GetThumb(context.Background(), 1)
    26  		a.ErrorIs(err, ErrObjectNotExist)
    27  		a.Nil(res)
    28  		a.NoError(mock.ExpectationsWereMet())
    29  	}
    30  
    31  	// thumb not exist
    32  	{
    33  		fs.SetTargetFile(&[]model.File{{
    34  			MetadataSerialized: map[string]string{
    35  				model.ThumbStatusMetadataKey: model.ThumbStatusNotAvailable,
    36  			},
    37  			Policy: model.Policy{Type: "mock"},
    38  		}})
    39  		fs.FileTarget[0].Policy.ID = 1
    40  
    41  		res, err := fs.GetThumb(context.Background(), 1)
    42  		a.ErrorIs(err, ErrObjectNotExist)
    43  		a.Nil(res)
    44  	}
    45  
    46  	// thumb not initialized, also failed to generate
    47  	{
    48  		fs.CleanTargets()
    49  		fs.SetTargetFile(&[]model.File{{
    50  			Policy: model.Policy{Type: "mock"},
    51  			Size:   31457281,
    52  		}})
    53  		testHandller2 := new(FileHeaderMock)
    54  		testHandller2.On("Thumb", testMock.Anything, &fs.FileTarget[0]).Return(&response.ContentResponse{}, driver.ErrorThumbNotExist)
    55  		fs.Handler = testHandller2
    56  		fs.FileTarget[0].Policy.ID = 1
    57  		res, err := fs.GetThumb(context.Background(), 1)
    58  		a.Contains(err.Error(), "file too large")
    59  		a.Nil(res.Content)
    60  	}
    61  
    62  	// thumb not initialized, failed to get source
    63  	{
    64  		fs.CleanTargets()
    65  		fs.SetTargetFile(&[]model.File{{
    66  			Policy: model.Policy{Type: "mock"},
    67  		}})
    68  		testHandller2 := new(FileHeaderMock)
    69  		testHandller2.On("Thumb", testMock.Anything, &fs.FileTarget[0]).Return(&response.ContentResponse{}, driver.ErrorThumbNotExist)
    70  		testHandller2.On("Get", testMock.Anything, "").Return(MockRSC{}, errors.New("error"))
    71  		fs.Handler = testHandller2
    72  		fs.FileTarget[0].Policy.ID = 1
    73  		res, err := fs.GetThumb(context.Background(), 1)
    74  		a.Contains(err.Error(), "error")
    75  		a.Nil(res.Content)
    76  	}
    77  
    78  	// thumb not initialized, no available generators
    79  	{
    80  		thumb.Generators = []thumb.Generator{}
    81  		fs.CleanTargets()
    82  		fs.SetTargetFile(&[]model.File{{
    83  			Policy: model.Policy{Type: "local"},
    84  		}})
    85  		testHandller2 := new(FileHeaderMock)
    86  		testHandller2.On("Thumb", testMock.Anything, &fs.FileTarget[0]).Return(&response.ContentResponse{}, driver.ErrorThumbNotExist)
    87  		testHandller2.On("Get", testMock.Anything, "").Return(MockRSC{}, nil)
    88  		fs.Handler = testHandller2
    89  		fs.FileTarget[0].Policy.ID = 1
    90  		res, err := fs.GetThumb(context.Background(), 1)
    91  		a.ErrorIs(err, thumb.ErrNotAvailable)
    92  		a.Nil(res)
    93  	}
    94  
    95  	// thumb not initialized, thumb generated but cannot be open
    96  	{
    97  		mockGenerator := &thumbmock.GeneratorMock{}
    98  		thumb.Generators = []thumb.Generator{mockGenerator}
    99  		fs.CleanTargets()
   100  		fs.SetTargetFile(&[]model.File{{
   101  			Policy: model.Policy{Type: "mock"},
   102  		}})
   103  		cache.Set("setting_thumb_vips_enabled", "1", 0)
   104  		testHandller2 := new(FileHeaderMock)
   105  		testHandller2.On("Thumb", testMock.Anything, &fs.FileTarget[0]).Return(&response.ContentResponse{}, driver.ErrorThumbNotExist)
   106  		testHandller2.On("Get", testMock.Anything, "").Return(MockRSC{}, nil)
   107  		mockGenerator.On("Generate", testMock.Anything, testMock.Anything, testMock.Anything, testMock.Anything, testMock.Anything).
   108  			Return(&thumb.Result{Path: "not_exit_thumb"}, nil)
   109  
   110  		fs.Handler = testHandller2
   111  		fs.FileTarget[0].Policy.ID = 1
   112  		res, err := fs.GetThumb(context.Background(), 1)
   113  		a.Contains(err.Error(), "failed to open temp thumb")
   114  		a.Nil(res.Content)
   115  		testHandller2.AssertExpectations(t)
   116  		mockGenerator.AssertExpectations(t)
   117  	}
   118  }
   119  
   120  func TestFileSystem_ThumbWorker(t *testing.T) {
   121  	asserts := assert.New(t)
   122  
   123  	asserts.NotPanics(func() {
   124  		getThumbWorker().addWorker()
   125  		getThumbWorker().releaseWorker()
   126  	})
   127  }