github.com/terraform-modules-krish/terratest@v0.29.0/modules/files/files_test.go (about)

     1  package files
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"os/exec"
     8  	"path/filepath"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  const copyFolderContentsFixtureRoot = "../../test/fixtures/copy-folder-contents"
    16  
    17  func TestFileExists(t *testing.T) {
    18  	t.Parallel()
    19  
    20  	currentFile, err := filepath.Abs(os.Args[0])
    21  	require.NoError(t, err)
    22  
    23  	assert.True(t, FileExists(currentFile))
    24  	assert.False(t, FileExists("/not/a/real/path"))
    25  }
    26  
    27  func TestCopyFolderContents(t *testing.T) {
    28  	t.Parallel()
    29  
    30  	originalDir := filepath.Join(copyFolderContentsFixtureRoot, "original")
    31  	expectedDir := filepath.Join(copyFolderContentsFixtureRoot, "full-copy")
    32  	tmpDir, err := ioutil.TempDir("", "TestCopyFolderContents")
    33  	require.NoError(t, err)
    34  
    35  	err = CopyFolderContents(originalDir, tmpDir)
    36  	require.NoError(t, err)
    37  
    38  	requireDirectoriesEqual(t, expectedDir, tmpDir)
    39  }
    40  
    41  func TestCopyFolderContentsWithHiddenFilesFilter(t *testing.T) {
    42  	t.Parallel()
    43  
    44  	originalDir := filepath.Join(copyFolderContentsFixtureRoot, "original")
    45  	expectedDir := filepath.Join(copyFolderContentsFixtureRoot, "no-hidden-files")
    46  	tmpDir, err := ioutil.TempDir("", "TestCopyFolderContentsWithFilter")
    47  	require.NoError(t, err)
    48  
    49  	err = CopyFolderContentsWithFilter(originalDir, tmpDir, func(path string) bool {
    50  		return !PathContainsHiddenFileOrFolder(path)
    51  	})
    52  	require.NoError(t, err)
    53  
    54  	requireDirectoriesEqual(t, expectedDir, tmpDir)
    55  }
    56  
    57  // Test copying a folder that contains symlinks
    58  func TestCopyFolderContentsWithSymLinks(t *testing.T) {
    59  	t.Parallel()
    60  
    61  	originalDir := filepath.Join(copyFolderContentsFixtureRoot, "symlinks")
    62  	expectedDir := filepath.Join(copyFolderContentsFixtureRoot, "symlinks")
    63  	tmpDir, err := ioutil.TempDir("", "TestCopyFolderContentsWithFilter")
    64  	require.NoError(t, err)
    65  
    66  	err = CopyFolderContentsWithFilter(originalDir, tmpDir, func(path string) bool {
    67  		return !PathContainsHiddenFileOrFolder(path)
    68  	})
    69  	require.NoError(t, err)
    70  
    71  	requireDirectoriesEqual(t, expectedDir, tmpDir)
    72  }
    73  
    74  // Test copying a folder that contains symlinks that point to a non-existent file
    75  func TestCopyFolderContentsWithBrokenSymLinks(t *testing.T) {
    76  	t.Parallel()
    77  
    78  	// Creating broken symlink
    79  	pathToFile := filepath.Join(copyFolderContentsFixtureRoot, "symlinks-broken/nonexistent-folder/bar.txt")
    80  	pathToSymlink := filepath.Join(copyFolderContentsFixtureRoot, "symlinks-broken/bar.txt")
    81  	defer func() {
    82  		if err := os.Remove(pathToSymlink); err != nil {
    83  			t.Fatal(fmt.Errorf("Failed to remove link: %+v", err))
    84  		}
    85  	}()
    86  	if err := os.Symlink(pathToFile, pathToSymlink); err != nil {
    87  		t.Fatal(fmt.Errorf("Failed to create broken link for test: %+v", err))
    88  	}
    89  
    90  	// Test copying folder
    91  	originalDir := filepath.Join(copyFolderContentsFixtureRoot, "symlinks-broken")
    92  	tmpDir, err := ioutil.TempDir("", "TestCopyFolderContentsWithFilter")
    93  	require.NoError(t, err)
    94  
    95  	err = CopyFolderContentsWithFilter(originalDir, tmpDir, func(path string) bool {
    96  		return !PathContainsHiddenFileOrFolder(path)
    97  	})
    98  	require.NoError(t, err)
    99  
   100  	// This requireDirectoriesEqual command uses GNU diff under the hood, but unfortunately we cannot instruct diff to
   101  	// compare symlinks in two directories without attempting to dereference any symlinks until diff version 3.3.0.
   102  	// Because many environments are still using diff < 3.3.0, we disregard this test for now.
   103  	// Per https://unix.stackexchange.com/a/119406/129208
   104  	//requireDirectoriesEqual(t, expectedDir, tmpDir)
   105  	fmt.Println("Test completed without error, however due to a limitation in GNU diff < 3.3.0, directories have not been compared for equivalency.")
   106  }
   107  
   108  func TestCopyTerraformFolderToTemp(t *testing.T) {
   109  	t.Parallel()
   110  
   111  	originalDir := filepath.Join(copyFolderContentsFixtureRoot, "original")
   112  	expectedDir := filepath.Join(copyFolderContentsFixtureRoot, "no-hidden-files-no-terraform-files")
   113  
   114  	tmpDir, err := CopyTerraformFolderToTemp(originalDir, "TestCopyTerraformFolderToTemp")
   115  	require.NoError(t, err)
   116  
   117  	requireDirectoriesEqual(t, expectedDir, tmpDir)
   118  }
   119  
   120  func TestCopyTerragruntFolderToTemp(t *testing.T) {
   121  	t.Parallel()
   122  
   123  	originalDir := filepath.Join(copyFolderContentsFixtureRoot, "terragrunt-files")
   124  	expectedDir := filepath.Join(copyFolderContentsFixtureRoot, "no-state-files")
   125  
   126  	tmpDir, err := CopyTerragruntFolderToTemp(originalDir, t.Name())
   127  	require.NoError(t, err)
   128  
   129  	requireDirectoriesEqual(t, expectedDir, tmpDir)
   130  }
   131  
   132  // Diffing two directories to ensure they have the exact same files, contents, etc and showing exactly what's different
   133  // takes a lot of code. Why waste time on that when this functionality is already nicely implemented in the Unix/Linux
   134  // "diff" command? We shell out to that command at test time.
   135  func requireDirectoriesEqual(t *testing.T, folderWithExpectedContents string, folderWithActualContents string) {
   136  	cmd := exec.Command("diff", "-r", "-u", folderWithExpectedContents, folderWithActualContents)
   137  
   138  	bytes, err := cmd.Output()
   139  	output := string(bytes)
   140  
   141  	require.NoError(t, err, "diff command exited with an error. This likely means the contents of %s and %s are different. Here is the output of the diff command:\n%s", folderWithExpectedContents, folderWithActualContents, output)
   142  }