package util import ( "os" "path/filepath" "testing" ) func TestFileExistsAndDirExists(t *testing.T) { root := t.TempDir() file := filepath.Join(root, "a-file") if err := os.WriteFile(file, []byte("contents"), 0644); err != nil { t.Fatalf("could not write the test file: %v", err) } directory := filepath.Join(root, "a-directory") if err := os.Mkdir(directory, 0755); err != nil { t.Fatalf("could not make the test directory: %v", err) } linkToFile := filepath.Join(root, "link-to-file") if err := os.Symlink(file, linkToFile); err != nil { t.Fatalf("could not make the test link: %v", err) } brokenLink := filepath.Join(root, "broken-link") if err := os.Symlink(filepath.Join(root, "nothing-here"), brokenLink); err != nil { t.Fatalf("could not make the broken test link: %v", err) } tests := []struct { name string path string expectedFile bool expectedIsDir bool }{ {"a regular file", file, true, false}, {"a directory", directory, false, true}, {"a link to a file", linkToFile, true, false}, {"a link to nothing", brokenLink, false, false}, {"a path that is not there", filepath.Join(root, "missing"), false, false}, {"a path whose parent is not there", filepath.Join(root, "missing", "deeper"), false, false}, {"the empty path", "", false, false}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { if got := FileExists(test.path); got != test.expectedFile { t.Errorf("FileExists: expected %v got %v", test.expectedFile, got) } if got := DirExists(test.path); got != test.expectedIsDir { t.Errorf("DirExists: expected %v got %v", test.expectedIsDir, got) } }) } }