github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/utils/files_test.go (about)

     1  /*
     2   * Copyright (c) 2024-present unTill Software Development Group B.V.
     3   * @author Denis Gribanov
     4   */
     5  
     6  package coreutils
     7  
     8  import (
     9  	"os"
    10  	"path/filepath"
    11  	"strings"
    12  	"testing"
    13  
    14  	"github.com/google/uuid"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestCopy_BasicUsage(t *testing.T) {
    19  	require := require.New(t)
    20  	tempDirSrc := t.TempDir()
    21  	dir1 := filepath.Join(tempDirSrc, "dir1")
    22  	dir2 := filepath.Join(tempDirSrc, "dir2")
    23  	dir1dir3 := filepath.Join(dir1, "dir3")
    24  	require.NoError(os.MkdirAll(dir1, FileMode_rwxrwxrwx))
    25  	require.NoError(os.MkdirAll(dir2, FileMode_rwxrwxrwx))
    26  	require.NoError(os.MkdirAll(dir1dir3, FileMode_rwxrwxrwx))
    27  	file0 := filepath.Join(tempDirSrc, "file0.txt")
    28  	file1 := filepath.Join(dir1, "file1.txt")
    29  	file2 := filepath.Join(dir2, "file2.txt")
    30  	file3 := filepath.Join(dir1dir3, "file3.txt")
    31  
    32  	require.NoError(os.WriteFile(file0, []byte("file0 content"), FileMode_rw_rw_rw_))
    33  	require.NoError(os.WriteFile(file1, []byte("file1 content"), FileMode_rw_rw_rw_))
    34  	require.NoError(os.WriteFile(file2, []byte("file2 content"), FileMode_rw_rw_rw_))
    35  	require.NoError(os.WriteFile(file3, []byte("file3 content"), FileMode_rw_rw_rw_))
    36  
    37  	t.Run("CopyDir", func(t *testing.T) {
    38  		tempDirDst := t.TempDir()
    39  
    40  		require.NoError(CopyDir(tempDirSrc, tempDirDst))
    41  
    42  		file0Dst := strings.ReplaceAll(file0, tempDirSrc, tempDirDst)
    43  		file1Dst := strings.ReplaceAll(file1, tempDirSrc, tempDirDst)
    44  		file2Dst := strings.ReplaceAll(file2, tempDirSrc, tempDirDst)
    45  		file3Dst := strings.ReplaceAll(file3, tempDirSrc, tempDirDst)
    46  
    47  		file0ActualContent, err := os.ReadFile(file0Dst)
    48  		require.NoError(err)
    49  		file1ActualContent, err := os.ReadFile(file1Dst)
    50  		require.NoError(err)
    51  		file2ActualContent, err := os.ReadFile(file2Dst)
    52  		require.NoError(err)
    53  		file3ActualContent, err := os.ReadFile(file3Dst)
    54  		require.NoError(err)
    55  
    56  		require.Equal("file0 content", string(file0ActualContent))
    57  		require.Equal("file1 content", string(file1ActualContent))
    58  		require.Equal("file2 content", string(file2ActualContent))
    59  		require.Equal("file3 content", string(file3ActualContent))
    60  	})
    61  
    62  	t.Run("CopyFile", func(t *testing.T) {
    63  		tempDirDst := t.TempDir()
    64  		require.NoError(CopyFile(file1, tempDirDst))
    65  		file1Dst := filepath.Join(tempDirDst, filepath.Base(file1))
    66  		file1ActualContent, err := os.ReadFile(file1Dst)
    67  		require.NoError(err)
    68  		require.Equal("file1 content", string(file1ActualContent))
    69  	})
    70  
    71  	t.Run("CopyFile to unexisting dir -> create target dir", func(t *testing.T) {
    72  		tempDirDst := t.TempDir()
    73  		require.NoError(os.RemoveAll(tempDirDst))
    74  		require.NoError(CopyFile(file1, tempDirDst))
    75  		file1Dst := filepath.Join(tempDirDst, filepath.Base(file1))
    76  		file1ActualContent, err := os.ReadFile(file1Dst)
    77  		require.NoError(err)
    78  		require.Equal("file1 content", string(file1ActualContent))
    79  	})
    80  
    81  	t.Run("CopyFile src file without path", func(t *testing.T) {
    82  		tempDirDst := t.TempDir()
    83  		initialWD, err := os.Getwd()
    84  		require.NoError(err)
    85  		file1SrcPath, file1SrcName := filepath.Split(file1)
    86  		require.NoError(os.Chdir(file1SrcPath))
    87  		defer func() {
    88  			require.NoError(os.Chdir(initialWD))
    89  		}()
    90  
    91  		require.NoError(CopyFile(file1SrcName, tempDirDst))
    92  		file1Dst := filepath.Join(tempDirDst, file1SrcName)
    93  		file1ActualContent, err := os.ReadFile(file1Dst)
    94  		require.NoError(err)
    95  		require.Equal("file1 content", string(file1ActualContent))
    96  	})
    97  
    98  	//TODO: test copy to the dir that is not exists yet, test specifying the src file without path
    99  }
   100  
   101  func TestCopyErrors(t *testing.T) {
   102  	require := require.New(t)
   103  	tempDirSrc := t.TempDir()
   104  	tempDirDst := t.TempDir()
   105  	unexisingDir := filepath.Join(tempDirSrc, "unexisting")
   106  
   107  	require.Error(CopyDir("", ""))
   108  	require.Error(CopyDir("", tempDirDst))
   109  	require.Error(CopyDir(unexisingDir, ""))
   110  	require.Error(CopyDir(unexisingDir, ""))
   111  	require.Error(CopyFile("", ""))
   112  	require.Error(CopyFile("", tempDirDst))
   113  	require.Error(CopyFile(unexisingDir, ""))
   114  	require.Error(CopyFile(unexisingDir, ""))
   115  }
   116  
   117  func TestCopyOptions(t *testing.T) {
   118  	require := require.New(t)
   119  	tempDirSrc := t.TempDir()
   120  	tempDirDst := t.TempDir()
   121  	dir1 := filepath.Join(tempDirSrc, "dir1")
   122  	dir2 := filepath.Join(tempDirSrc, "dir2")
   123  	dir1dir3 := filepath.Join(dir1, "dir3")
   124  	require.NoError(os.MkdirAll(dir1, FileMode_rwxrwxrwx))
   125  	require.NoError(os.MkdirAll(dir2, FileMode_rwxrwxrwx))
   126  	require.NoError(os.MkdirAll(dir1dir3, FileMode_rwxrwxrwx))
   127  	file0 := filepath.Join(tempDirSrc, "file0.txt")
   128  	file1 := filepath.Join(dir1, "file1.txt")
   129  	file2 := filepath.Join(dir2, "file2.txt")
   130  	file3 := filepath.Join(dir1dir3, "file3.txt")
   131  
   132  	require.NoError(os.WriteFile(file0, []byte("file0 content"), FileMode_rw_rw_rw_))
   133  	require.NoError(os.WriteFile(file1, []byte("file1 content"), FileMode_rw_rw_rw_))
   134  	require.NoError(os.WriteFile(file2, []byte("file2 content"), FileMode_rw_rw_rw_))
   135  	require.NoError(os.WriteFile(file3, []byte("file3 content"), FileMode_rw_rw_rw_))
   136  
   137  	file2 = strings.ReplaceAll(file2, tempDirSrc, tempDirDst)
   138  	dir2dst := filepath.Join(tempDirDst, "dir2")
   139  	require.NoError(os.MkdirAll(dir2dst, FileMode_rwxrwxrwx))
   140  	require.NoError(os.WriteFile(file2, []byte("file2 existing content"), FileMode_rw_rw_rw_))
   141  
   142  	err := CopyDir(tempDirSrc, tempDirDst, WithFilterFilesWithRelativePaths(
   143  		[]string{"dir1/file1.txt", "dir2/file2.txt"}), WithSkipExisting())
   144  	require.NoError(err)
   145  
   146  	file0 = strings.ReplaceAll(file0, tempDirSrc, tempDirDst)
   147  	file1 = strings.ReplaceAll(file1, tempDirSrc, tempDirDst)
   148  	file2 = strings.ReplaceAll(file2, tempDirSrc, tempDirDst)
   149  	file3 = strings.ReplaceAll(file3, tempDirSrc, tempDirDst)
   150  
   151  	exists, err := Exists(file0)
   152  	require.NoError(err)
   153  	require.False(exists)
   154  	file1ActualContent, err := os.ReadFile(file1)
   155  	require.NoError(err)
   156  	file2ActualContent, err := os.ReadFile(file2)
   157  	require.NoError(err)
   158  	exists, err = Exists(file3)
   159  	require.NoError(err)
   160  	require.False(exists)
   161  
   162  	require.Equal("file1 content", string(file1ActualContent))
   163  	require.Equal("file2 existing content", string(file2ActualContent))
   164  }
   165  
   166  func TestExists(t *testing.T) {
   167  	require := require.New(t)
   168  	t.Run("file", func(t *testing.T) {
   169  		exists, err := Exists("files_test.go")
   170  		require.NoError(err)
   171  		require.True(exists)
   172  
   173  		exists, err = Exists(uuid.New().String())
   174  		require.NoError(err)
   175  		require.False(exists)
   176  	})
   177  
   178  	t.Run("dir", func(t *testing.T) {
   179  		exists, err := Exists("testwsdesc")
   180  		require.NoError(err)
   181  		require.True(exists)
   182  	})
   183  }