summaryrefslogtreecommitdiff
path: root/internal/fsutil/path_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-10-02 08:38:03 +0300
committerPaul Buetow <paul@buetow.org>2025-10-02 08:38:03 +0300
commit0c1b108ff5fccf39ae5bc6dc06802ce565bda633 (patch)
tree914e65e04bae26d3eae565f9d6a64d08ade361d0 /internal/fsutil/path_test.go
parent36be499ed342d92969ccaaff083c557a0951def9 (diff)
new version major refactorv0.2.0
Diffstat (limited to 'internal/fsutil/path_test.go')
-rw-r--r--internal/fsutil/path_test.go112
1 files changed, 112 insertions, 0 deletions
diff --git a/internal/fsutil/path_test.go b/internal/fsutil/path_test.go
new file mode 100644
index 0000000..4b88573
--- /dev/null
+++ b/internal/fsutil/path_test.go
@@ -0,0 +1,112 @@
+package fsutil
+
+import (
+ "os"
+ "os/user"
+ "path/filepath"
+ "testing"
+)
+
+func TestResolveRootPathCreatesDefault(t *testing.T) {
+ home := t.TempDir()
+ t.Setenv("HOME", home)
+ root, err := ResolveRootPath("", "~/Yoga")
+ if err != nil {
+ t.Fatalf("resolve root: %v", err)
+ }
+ expected := filepath.Join(home, "Yoga")
+ if root != expected {
+ t.Fatalf("expected %s, got %s", expected, root)
+ }
+ info, err := os.Stat(expected)
+ if err != nil {
+ t.Fatalf("stat default: %v", err)
+ }
+ if !info.IsDir() {
+ t.Fatalf("expected directory at %s", expected)
+ }
+}
+
+func TestResolveRootPathRequiresExisting(t *testing.T) {
+ tmp := t.TempDir()
+ missing := filepath.Join(tmp, "missing")
+ if _, err := ResolveRootPath(missing, "~/Yoga"); err == nil {
+ t.Fatalf("expected error for %s", missing)
+ }
+}
+
+func TestResolveRootPathAllowsFile(t *testing.T) {
+ tmp := t.TempDir()
+ file := filepath.Join(tmp, "video.mp4")
+ if err := os.WriteFile(file, []byte("x"), 0o644); err != nil {
+ t.Fatalf("write file: %v", err)
+ }
+ got, err := ResolveRootPath(file, "~/Yoga")
+ if err != nil {
+ t.Fatalf("resolve root: %v", err)
+ }
+ if got != file {
+ t.Fatalf("expected file path returned, got %s", got)
+ }
+}
+
+func TestExpandPathWithHome(t *testing.T) {
+ home := t.TempDir()
+ t.Setenv("HOME", home)
+ custom := filepath.Join(home, "custom")
+ if err := os.MkdirAll(custom, 0o755); err != nil {
+ t.Fatalf("mkdir: %v", err)
+ }
+ got, err := ResolveRootPath("~/custom", "~/Yoga")
+ if err != nil {
+ t.Fatalf("resolve root: %v", err)
+ }
+ expected := filepath.Join(home, "custom")
+ if got != expected {
+ t.Fatalf("expected %s, got %s", expected, got)
+ }
+ if v, err := expandPath("~"); err != nil || v != home {
+ t.Fatalf("expandPath ~ failed: %v %s", err, v)
+ }
+ if _, err := expandPath("~no_such_user/foo"); err == nil {
+ t.Fatalf("expected error for unknown user")
+ }
+ if path, err := expandPath("relative/path"); err != nil || path != "relative/path" {
+ t.Fatalf("expected relative path unchanged, got %s %v", path, err)
+ }
+ if current, err := user.Current(); err == nil {
+ value := "~" + current.Username
+ if p, err := expandPath(value); err != nil || p != current.HomeDir {
+ t.Fatalf("expected home dir %s, got %s (%v)", current.HomeDir, p, err)
+ }
+ }
+}
+
+func TestSplitUserPath(t *testing.T) {
+ user, rest := splitUserPath("~alice/videos")
+ if user != "alice" || rest != "/videos" {
+ t.Fatalf("unexpected split %s %s", user, rest)
+ }
+ user, rest = splitUserPath("~bob")
+ if user != "bob" || rest != "" {
+ t.Fatalf("unexpected split %s %s", user, rest)
+ }
+}
+
+func TestNormalizeRootInput(t *testing.T) {
+ const fallback = "~/Yoga"
+ value, isDefault := normalizeRootInput("", fallback)
+ if !isDefault || value != fallback {
+ t.Fatalf("unexpected normalize result %s %v", value, isDefault)
+ }
+ value, isDefault = normalizeRootInput(" /tmp ", fallback)
+ if isDefault || value != "/tmp" {
+ t.Fatalf("unexpected normalize result %s %v", value, isDefault)
+ }
+}
+
+func TestEnsureRootExistsErrors(t *testing.T) {
+ if _, err := ensureRootExists(filepath.Join(t.TempDir(), "missing"), false); err == nil {
+ t.Fatalf("expected error when creation not allowed")
+ }
+}