navidrome/utils/files_test.go
Deluan 05f279bd2b test: add unit tests for file utility functions
Signed-off-by: Deluan <deluan@navidrome.org>
2025-07-15 12:59:32 -04:00

179 lines
4.8 KiB
Go

package utils_test
import (
"os"
"path/filepath"
"strings"
"github.com/navidrome/navidrome/utils"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("TempFileName", func() {
It("creates a temporary file name with prefix and suffix", func() {
prefix := "test-"
suffix := ".tmp"
result := utils.TempFileName(prefix, suffix)
Expect(result).To(ContainSubstring(prefix))
Expect(result).To(HaveSuffix(suffix))
Expect(result).To(ContainSubstring(os.TempDir()))
})
It("creates unique file names on multiple calls", func() {
prefix := "unique-"
suffix := ".test"
result1 := utils.TempFileName(prefix, suffix)
result2 := utils.TempFileName(prefix, suffix)
Expect(result1).NotTo(Equal(result2))
})
It("handles empty prefix and suffix", func() {
result := utils.TempFileName("", "")
Expect(result).To(ContainSubstring(os.TempDir()))
Expect(len(result)).To(BeNumerically(">", len(os.TempDir())))
})
It("creates proper file path separators", func() {
prefix := "path-test-"
suffix := ".ext"
result := utils.TempFileName(prefix, suffix)
expectedDir := os.TempDir()
Expect(result).To(HavePrefix(expectedDir))
Expect(strings.Count(result, string(filepath.Separator))).To(BeNumerically(">=", strings.Count(expectedDir, string(filepath.Separator))))
})
})
var _ = Describe("BaseName", func() {
It("extracts basename from a simple filename", func() {
result := utils.BaseName("test.mp3")
Expect(result).To(Equal("test"))
})
It("extracts basename from a file path", func() {
result := utils.BaseName("/path/to/file.txt")
Expect(result).To(Equal("file"))
})
It("handles files without extension", func() {
result := utils.BaseName("/path/to/filename")
Expect(result).To(Equal("filename"))
})
It("handles files with multiple dots", func() {
result := utils.BaseName("archive.tar.gz")
Expect(result).To(Equal("archive.tar"))
})
It("handles hidden files", func() {
// For hidden files without additional extension, path.Ext returns the entire name
// So basename becomes empty string after TrimSuffix
result := utils.BaseName(".hidden")
Expect(result).To(Equal(""))
})
It("handles hidden files with extension", func() {
result := utils.BaseName(".config.json")
Expect(result).To(Equal(".config"))
})
It("handles empty string", func() {
// The actual behavior returns empty string for empty input
result := utils.BaseName("")
Expect(result).To(Equal(""))
})
It("handles path ending with separator", func() {
result := utils.BaseName("/path/to/dir/")
Expect(result).To(Equal("dir"))
})
It("handles complex nested path", func() {
result := utils.BaseName("/very/long/path/to/my/favorite/song.mp3")
Expect(result).To(Equal("song"))
})
})
var _ = Describe("FileExists", func() {
var tempFile *os.File
var tempDir string
BeforeEach(func() {
var err error
tempFile, err = os.CreateTemp("", "fileexists-test-*.txt")
Expect(err).NotTo(HaveOccurred())
tempDir, err = os.MkdirTemp("", "fileexists-test-dir-*")
Expect(err).NotTo(HaveOccurred())
})
AfterEach(func() {
if tempFile != nil {
os.Remove(tempFile.Name())
tempFile.Close()
}
if tempDir != "" {
os.RemoveAll(tempDir)
}
})
It("returns true for existing file", func() {
Expect(utils.FileExists(tempFile.Name())).To(BeTrue())
})
It("returns true for existing directory", func() {
Expect(utils.FileExists(tempDir)).To(BeTrue())
})
It("returns false for non-existing file", func() {
nonExistentPath := filepath.Join(tempDir, "does-not-exist.txt")
Expect(utils.FileExists(nonExistentPath)).To(BeFalse())
})
It("returns false for empty path", func() {
Expect(utils.FileExists("")).To(BeFalse())
})
It("handles nested non-existing path", func() {
nonExistentPath := "/this/path/definitely/does/not/exist/file.txt"
Expect(utils.FileExists(nonExistentPath)).To(BeFalse())
})
Context("when file is deleted after creation", func() {
It("returns false after file deletion", func() {
filePath := tempFile.Name()
Expect(utils.FileExists(filePath)).To(BeTrue())
err := os.Remove(filePath)
Expect(err).NotTo(HaveOccurred())
tempFile = nil // Prevent cleanup attempt
Expect(utils.FileExists(filePath)).To(BeFalse())
})
})
Context("when directory is deleted after creation", func() {
It("returns false after directory deletion", func() {
dirPath := tempDir
Expect(utils.FileExists(dirPath)).To(BeTrue())
err := os.RemoveAll(dirPath)
Expect(err).NotTo(HaveOccurred())
tempDir = "" // Prevent cleanup attempt
Expect(utils.FileExists(dirPath)).To(BeFalse())
})
})
It("handles permission denied scenarios gracefully", func() {
// This test might be platform specific, but we test the general case
result := utils.FileExists("/root/.ssh/id_rsa") // Likely to not exist or be inaccessible
Expect(result).To(Or(BeTrue(), BeFalse())) // Should not panic
})
})