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 }