summaryrefslogtreecommitdiff
path: root/internal/fsutil/path_test.go
blob: 4b88573dd1f02c37a352c5a4194d0703a2fece1e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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")
	}
}