Files
photoprism/pkg/fs/fs_test.go
2025-11-22 16:14:43 +01:00

189 lines
5.3 KiB
Go

package fs
import (
"fmt"
"net"
"net/http"
"net/http/httptest"
"os"
"os/user"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
)
func TestMain(m *testing.M) {
if insensitive, err := CaseInsensitive(os.TempDir()); err != nil {
fmt.Println(err)
} else if insensitive {
IgnoreCase()
}
code := m.Run()
os.Exit(code)
}
func TestExists(t *testing.T) {
assert.True(t, Exists("./testdata"))
assert.True(t, Exists("./testdata/"))
assert.True(t, Exists("./testdata/test.jpg"))
assert.True(t, Exists("./testdata/test.jpg"))
assert.True(t, Exists("./testdata/empty.jpg"))
assert.False(t, Exists("./foo.jpg"))
assert.False(t, Exists(""))
}
func TestFileExists(t *testing.T) {
assert.False(t, FileExists("./testdata"))
assert.False(t, FileExists("./testdata/"))
assert.True(t, FileExists("./testdata/test.jpg"))
assert.True(t, FileExists("./testdata/test.jpg"))
assert.True(t, FileExists("./testdata/empty.jpg"))
assert.False(t, FileExists("./foo.jpg"))
assert.False(t, FileExists(""))
}
func TestFileExistsNotEmpty(t *testing.T) {
assert.False(t, FileExistsNotEmpty("./testdata"))
assert.False(t, FileExistsNotEmpty("./testdata/"))
assert.True(t, FileExistsNotEmpty("./testdata/test.jpg"))
assert.True(t, FileExistsNotEmpty("./testdata/test.jpg"))
assert.False(t, FileExistsNotEmpty("./testdata/empty.jpg"))
assert.False(t, FileExistsNotEmpty("./foo.jpg"))
assert.False(t, FileExistsNotEmpty(""))
}
func TestFileExistsIsEmpty(t *testing.T) {
assert.False(t, FileExistsIsEmpty("./testdata"))
assert.False(t, FileExistsIsEmpty("./testdata/"))
assert.False(t, FileExistsIsEmpty("./testdata/test.jpg"))
assert.False(t, FileExistsIsEmpty("./testdata/test.jpg"))
assert.True(t, FileExistsIsEmpty("./testdata/empty.jpg"))
assert.False(t, FileExistsIsEmpty("./foo.jpg"))
assert.False(t, FileExistsIsEmpty(""))
}
func TestFileSize(t *testing.T) {
assert.Equal(t, 10990, int(FileSize("./testdata/test.jpg")))
assert.Equal(t, 10990, int(FileSize("./testdata/test.jpg")))
assert.Equal(t, 0, int(FileSize("./testdata/empty.jpg")))
assert.Equal(t, -1, int(FileSize("./foo.jpg")))
assert.Equal(t, -1, int(FileSize("")))
}
func TestPathExists(t *testing.T) {
assert.True(t, PathExists("./testdata"))
assert.False(t, PathExists("./testdata/test.jpg"))
assert.False(t, PathExists("./testdata3ggdtgdg"))
assert.False(t, PathExists(""))
}
func TestDeviceExists(t *testing.T) {
assert.True(t, DeviceExists("/dev/null"))
DeviceExists("/dev/nvidia0")
assert.False(t, DeviceExists(""))
}
func TestPathWritable(t *testing.T) {
assert.True(t, PathWritable("./testdata"))
assert.False(t, PathWritable("./testdata/test.jpg"))
assert.False(t, PathWritable("./testdata3ggdtgdg"))
assert.False(t, PathWritable(""))
}
func TestWritable(t *testing.T) {
assert.True(t, Writable("./testdata"))
assert.False(t, Writable("./testdata3ggdtgdg"))
assert.False(t, Writable(""))
}
func TestExpandedFilename(t *testing.T) {
t.Run("TestJpg", func(t *testing.T) {
filename := Abs("./testdata/test.jpg")
assert.Contains(t, filename, "/testdata/test.jpg")
assert.IsType(t, "", filename)
})
t.Run("EmptyFilename", func(t *testing.T) {
filename := Abs("")
assert.Equal(t, "", filename)
assert.IsType(t, "", filename)
})
t.Run("InFilename", func(t *testing.T) {
usr, _ := user.Current()
expected := usr.HomeDir + "/test.jpg"
filename := Abs("~/test.jpg")
assert.Equal(t, expected, filename)
assert.IsType(t, "", filename)
})
}
func TestDirIsEmpty(t *testing.T) {
t.Run("CurrentDir", func(t *testing.T) {
assert.Equal(t, false, DirIsEmpty("."))
})
t.Run("Testdata", func(t *testing.T) {
assert.Equal(t, false, DirIsEmpty("./testdata"))
})
t.Run("XXX", func(t *testing.T) {
assert.Equal(t, false, DirIsEmpty("./xxx"))
})
t.Run("EmptyDir", func(t *testing.T) {
if err := os.Mkdir("./testdata/emptyDir", 0o750); err != nil {
t.Fatal(err)
}
defer os.RemoveAll("./testdata/emptyDir")
assert.Equal(t, true, DirIsEmpty("./testdata/emptyDir"))
})
}
func TestSocketExists(t *testing.T) {
dir := t.TempDir()
sock := filepath.Join(dir, "test.sock")
ln, err := net.Listen("unix", sock)
if err != nil {
t.Skipf("unix sockets not supported: %v", err)
}
defer func() { _ = ln.Close(); _ = os.Remove(sock) }()
assert.True(t, SocketExists(sock))
assert.False(t, SocketExists(filepath.Join(dir, "missing.sock")))
}
func TestDownload_SuccessAndErrors(t *testing.T) {
// Serve known content
tsOK := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("hello world"))
}))
defer tsOK.Close()
// Serve a failure status
tsFail := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "nope", http.StatusBadRequest)
}))
defer tsFail.Close()
dir := t.TempDir()
goodPath := filepath.Join(dir, "sub", "file.txt")
badPath := "file.txt" // invalid path according to Download
// Success
err := Download(goodPath, tsOK.URL)
assert.NoError(t, err)
b, rerr := os.ReadFile(goodPath) //nolint:gosec // test helper reads temp file
assert.NoError(t, rerr)
assert.Equal(t, "hello world", string(b))
// Invalid target path
err = Download(badPath, tsOK.URL)
assert.Error(t, err)
// Server error status
anotherPath := filepath.Join(dir, "b", "x.txt")
err = Download(anotherPath, tsFail.URL)
assert.Error(t, err)
}