github.com/hahmadia/mattermost-server@v5.11.1+incompatible/utils/fileutils/fileutils_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package fileutils
     5  
     6  import (
     7  	"fmt"
     8  	"io/ioutil"
     9  	"os"
    10  	"path/filepath"
    11  	"testing"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestFindFile(t *testing.T) {
    18  	t.Run("files from various paths", func(t *testing.T) {
    19  		// Create the following directory structure:
    20  		// tmpDir1/
    21  		//   file1.json
    22  		//   file2.xml
    23  		//   other.txt
    24  		//   tmpDir2/
    25  		//     other.txt/ [directory]
    26  		//     tmpDir3/
    27  		//       tmpDir4/
    28  		//         tmpDir5/
    29  		tmpDir1, err := ioutil.TempDir("", "")
    30  		require.NoError(t, err)
    31  		defer os.RemoveAll(tmpDir1)
    32  
    33  		tmpDir2, err := ioutil.TempDir(tmpDir1, "")
    34  		require.NoError(t, err)
    35  
    36  		err = os.Mkdir(filepath.Join(tmpDir2, "other.txt"), 0700)
    37  		require.NoError(t, err)
    38  
    39  		tmpDir3, err := ioutil.TempDir(tmpDir2, "")
    40  		require.NoError(t, err)
    41  
    42  		tmpDir4, err := ioutil.TempDir(tmpDir3, "")
    43  		require.NoError(t, err)
    44  
    45  		tmpDir5, err := ioutil.TempDir(tmpDir4, "")
    46  		require.NoError(t, err)
    47  
    48  		type testCase struct {
    49  			Description string
    50  			Cwd         *string
    51  			FileName    string
    52  			Expected    string
    53  		}
    54  
    55  		testCases := []testCase{}
    56  
    57  		for _, fileName := range []string{"file1.json", "file2.xml", "other.txt"} {
    58  			filePath := filepath.Join(tmpDir1, fileName)
    59  			require.NoError(t, ioutil.WriteFile(filePath, []byte("{}"), 0600))
    60  
    61  			// Relative paths end up getting symlinks fully resolved, so use this below as necessary.
    62  			filePathResolved, err := filepath.EvalSymlinks(filePath)
    63  			require.NoError(t, err)
    64  
    65  			testCases = append(testCases, []testCase{
    66  				{
    67  					fmt.Sprintf("absolute path to %s", fileName),
    68  					nil,
    69  					filePath,
    70  					filePath,
    71  				},
    72  				{
    73  					fmt.Sprintf("absolute path to %s from containing directory", fileName),
    74  					&tmpDir1,
    75  					filePath,
    76  					filePath,
    77  				},
    78  				{
    79  					fmt.Sprintf("relative path to %s from containing directory", fileName),
    80  					&tmpDir1,
    81  					fileName,
    82  					filePathResolved,
    83  				},
    84  				{
    85  					fmt.Sprintf("%s: subdirectory of containing directory", fileName),
    86  					&tmpDir2,
    87  					fileName,
    88  					filePathResolved,
    89  				},
    90  				{
    91  					fmt.Sprintf("%s: twice-nested subdirectory of containing directory", fileName),
    92  					&tmpDir3,
    93  					fileName,
    94  					filePathResolved,
    95  				},
    96  				{
    97  					fmt.Sprintf("%s: thrice-nested subdirectory of containing directory", fileName),
    98  					&tmpDir4,
    99  					fileName,
   100  					filePathResolved,
   101  				},
   102  				{
   103  					fmt.Sprintf("%s: can't find from four nesting levels deep", fileName),
   104  					&tmpDir5,
   105  					fileName,
   106  					"",
   107  				},
   108  			}...)
   109  		}
   110  
   111  		for _, testCase := range testCases {
   112  			t.Run(testCase.Description, func(t *testing.T) {
   113  				if testCase.Cwd != nil {
   114  					prevDir, err := os.Getwd()
   115  					require.NoError(t, err)
   116  					defer os.Chdir(prevDir)
   117  					os.Chdir(*testCase.Cwd)
   118  				}
   119  
   120  				assert.Equal(t, testCase.Expected, FindFile(testCase.FileName))
   121  			})
   122  		}
   123  	})
   124  }