mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 23:52:26 -06:00 
			
		
		
		
	
		
			
	
	
		
			157 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			157 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								   GoToSocial
							 | 
						||
| 
								 | 
							
								   Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   This program is free software: you can redistribute it and/or modify
							 | 
						||
| 
								 | 
							
								   it under the terms of the GNU Affero General Public License as published by
							 | 
						||
| 
								 | 
							
								   the Free Software Foundation, either version 3 of the License, or
							 | 
						||
| 
								 | 
							
								   (at your option) any later version.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   This program is distributed in the hope that it will be useful,
							 | 
						||
| 
								 | 
							
								   but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						||
| 
								 | 
							
								   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						||
| 
								 | 
							
								   GNU Affero General Public License for more details.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   You should have received a copy of the GNU Affero General Public License
							 | 
						||
| 
								 | 
							
								   along with this program.  If not, see <http://www.gnu.org/licenses/>.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package fileserver
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"context"
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"io/ioutil"
							 | 
						||
| 
								 | 
							
									"net/http"
							 | 
						||
| 
								 | 
							
									"net/http/httptest"
							 | 
						||
| 
								 | 
							
									"testing"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/gin-gonic/gin"
							 | 
						||
| 
								 | 
							
									"github.com/sirupsen/logrus"
							 | 
						||
| 
								 | 
							
									"github.com/stretchr/testify/assert"
							 | 
						||
| 
								 | 
							
									"github.com/stretchr/testify/suite"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/config"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/db"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/db/gtsmodel"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/mastotypes"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/media"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/oauth"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/storage"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/testrig"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type ServeFileTestSuite struct {
							 | 
						||
| 
								 | 
							
									// standard suite interfaces
							 | 
						||
| 
								 | 
							
									suite.Suite
							 | 
						||
| 
								 | 
							
									config         *config.Config
							 | 
						||
| 
								 | 
							
									db             db.DB
							 | 
						||
| 
								 | 
							
									log            *logrus.Logger
							 | 
						||
| 
								 | 
							
									storage        storage.Storage
							 | 
						||
| 
								 | 
							
									mastoConverter mastotypes.Converter
							 | 
						||
| 
								 | 
							
									mediaHandler   media.MediaHandler
							 | 
						||
| 
								 | 
							
									oauthServer    oauth.Server
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// standard suite models
							 | 
						||
| 
								 | 
							
									testTokens       map[string]*oauth.Token
							 | 
						||
| 
								 | 
							
									testClients      map[string]*oauth.Client
							 | 
						||
| 
								 | 
							
									testApplications map[string]*gtsmodel.Application
							 | 
						||
| 
								 | 
							
									testUsers        map[string]*gtsmodel.User
							 | 
						||
| 
								 | 
							
									testAccounts     map[string]*gtsmodel.Account
							 | 
						||
| 
								 | 
							
									testAttachments  map[string]*gtsmodel.MediaAttachment
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// item being tested
							 | 
						||
| 
								 | 
							
									fileServer *fileServer
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
									TEST INFRASTRUCTURE
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (suite *ServeFileTestSuite) SetupSuite() {
							 | 
						||
| 
								 | 
							
									// setup standard items
							 | 
						||
| 
								 | 
							
									suite.config = testrig.NewTestConfig()
							 | 
						||
| 
								 | 
							
									suite.db = testrig.NewTestDB()
							 | 
						||
| 
								 | 
							
									suite.log = testrig.NewTestLog()
							 | 
						||
| 
								 | 
							
									suite.storage = testrig.NewTestStorage()
							 | 
						||
| 
								 | 
							
									suite.mastoConverter = testrig.NewTestMastoConverter(suite.db)
							 | 
						||
| 
								 | 
							
									suite.mediaHandler = testrig.NewTestMediaHandler(suite.db, suite.storage)
							 | 
						||
| 
								 | 
							
									suite.oauthServer = testrig.NewTestOauthServer(suite.db)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// setup module being tested
							 | 
						||
| 
								 | 
							
									suite.fileServer = New(suite.config, suite.db, suite.storage, suite.log).(*fileServer)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (suite *ServeFileTestSuite) TearDownSuite() {
							 | 
						||
| 
								 | 
							
									if err := suite.db.Stop(context.Background()); err != nil {
							 | 
						||
| 
								 | 
							
										logrus.Panicf("error closing db connection: %s", err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (suite *ServeFileTestSuite) SetupTest() {
							 | 
						||
| 
								 | 
							
									testrig.StandardDBSetup(suite.db)
							 | 
						||
| 
								 | 
							
									testrig.StandardStorageSetup(suite.storage, "../../../testrig/media")
							 | 
						||
| 
								 | 
							
									suite.testTokens = testrig.NewTestTokens()
							 | 
						||
| 
								 | 
							
									suite.testClients = testrig.NewTestClients()
							 | 
						||
| 
								 | 
							
									suite.testApplications = testrig.NewTestApplications()
							 | 
						||
| 
								 | 
							
									suite.testUsers = testrig.NewTestUsers()
							 | 
						||
| 
								 | 
							
									suite.testAccounts = testrig.NewTestAccounts()
							 | 
						||
| 
								 | 
							
									suite.testAttachments = testrig.NewTestAttachments()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (suite *ServeFileTestSuite) TearDownTest() {
							 | 
						||
| 
								 | 
							
									testrig.StandardDBTeardown(suite.db)
							 | 
						||
| 
								 | 
							
									testrig.StandardStorageTeardown(suite.storage)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
									ACTUAL TESTS
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (suite *ServeFileTestSuite) TestServeOriginalFileSuccessful() {
							 | 
						||
| 
								 | 
							
									targetAttachment, ok := suite.testAttachments["admin_account_status_1_attachment_1"]
							 | 
						||
| 
								 | 
							
									assert.True(suite.T(), ok)
							 | 
						||
| 
								 | 
							
									assert.NotNil(suite.T(), targetAttachment)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									recorder := httptest.NewRecorder()
							 | 
						||
| 
								 | 
							
									ctx, _ := gin.CreateTestContext(recorder)
							 | 
						||
| 
								 | 
							
									ctx.Request = httptest.NewRequest(http.MethodGet, targetAttachment.URL, nil)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// normally the router would populate these params from the path values,
							 | 
						||
| 
								 | 
							
									// but because we're calling the ServeFile function directly, we need to set them manually.
							 | 
						||
| 
								 | 
							
									ctx.Params = gin.Params{
							 | 
						||
| 
								 | 
							
										gin.Param{
							 | 
						||
| 
								 | 
							
											Key:   accountIDKey,
							 | 
						||
| 
								 | 
							
											Value: targetAttachment.AccountID,
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										gin.Param{
							 | 
						||
| 
								 | 
							
											Key:   mediaTypeKey,
							 | 
						||
| 
								 | 
							
											Value: media.MediaAttachment,
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										gin.Param{
							 | 
						||
| 
								 | 
							
											Key:   mediaSizeKey,
							 | 
						||
| 
								 | 
							
											Value: media.MediaOriginal,
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										gin.Param{
							 | 
						||
| 
								 | 
							
											Key:   fileNameKey,
							 | 
						||
| 
								 | 
							
											Value: fmt.Sprintf("%s.jpeg", targetAttachment.ID),
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// call the function we're testing and check status code
							 | 
						||
| 
								 | 
							
									suite.fileServer.ServeFile(ctx)
							 | 
						||
| 
								 | 
							
									suite.EqualValues(http.StatusOK, recorder.Code)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									b, err := ioutil.ReadAll(recorder.Body)
							 | 
						||
| 
								 | 
							
									assert.NoError(suite.T(), err)
							 | 
						||
| 
								 | 
							
									assert.NotNil(suite.T(), b)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fileInStorage, err := suite.storage.RetrieveFileFrom(targetAttachment.File.Path)
							 | 
						||
| 
								 | 
							
									assert.NoError(suite.T(), err)
							 | 
						||
| 
								 | 
							
									assert.NotNil(suite.T(), fileInStorage)
							 | 
						||
| 
								 | 
							
									assert.Equal(suite.T(), b, fileInStorage)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func TestServeFileTestSuite(t *testing.T) {
							 | 
						||
| 
								 | 
							
									suite.Run(t, new(ServeFileTestSuite))
							 | 
						||
| 
								 | 
							
								}
							 |