repo_test.go
2223 bytes
1package git
2
3import (
4 "context"
5 "os"
6 "os/exec"
7 "path/filepath"
8 "strings"
9 "testing"
10)
11
12// setupTestRepo creates a temp git repo containing dot_config/bat and returns
13// the opened repository and its HEAD reference.
14func setupTestRepo(t *testing.T) (*Repository, *Reference) {
15 t.Helper()
16 ctx := context.Background()
17
18 repoPath := filepath.Join(t.TempDir(), "test-repo")
19 nestedDir := filepath.Join(repoPath, "dot_config")
20 if err := os.MkdirAll(nestedDir, 0o755); err != nil {
21 t.Fatal(err)
22 }
23 if err := os.WriteFile(filepath.Join(nestedDir, "bat"), []byte("test content"), 0o644); err != nil {
24 t.Fatal(err)
25 }
26
27 for _, args := range [][]string{
28 {"init"},
29 {"add", "."},
30 {"-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "init"},
31 } {
32 cmd := exec.CommandContext(ctx, "git", args...)
33 cmd.Dir = repoPath
34 if out, err := cmd.CombinedOutput(); err != nil {
35 t.Fatalf("git %s failed: %v\n%s", args[0], err, out)
36 }
37 }
38
39 repo, err := Open(repoPath)
40 if err != nil {
41 t.Fatalf("failed to open repository: %v", err)
42 }
43 ref, err := repo.HEAD()
44 if err != nil {
45 t.Fatalf("failed to get HEAD: %v", err)
46 }
47 return repo, ref
48}
49
50func TestTreePathForwardSlashes(t *testing.T) {
51 repo, ref := setupTestRepo(t)
52
53 // TreePath should clean the double slash and resolve the directory.
54 tree, err := repo.TreePath(ref, "dot_config//")
55 if err != nil {
56 t.Fatalf("TreePath failed: %v", err)
57 }
58
59 entries, err := tree.Entries()
60 if err != nil {
61 t.Fatalf("failed to get entries: %v", err)
62 }
63
64 for _, e := range entries {
65 path := e.File().Path()
66 if strings.Contains(path, `\`) {
67 t.Errorf("entry path contains backslash: %q", path)
68 }
69 }
70}
71
72func TestTreeEntryPathForwardSlashes(t *testing.T) {
73 repo, ref := setupTestRepo(t)
74
75 tree, err := repo.TreePath(ref, "dot_config")
76 if err != nil {
77 t.Fatalf("TreePath failed: %v", err)
78 }
79
80 entries, err := tree.Entries()
81 if err != nil {
82 t.Fatalf("failed to get entries: %v", err)
83 }
84
85 for _, e := range entries {
86 path := e.File().Path()
87 if strings.Contains(path, `\`) {
88 t.Errorf("entry path contains backslash: %q", path)
89 }
90 if !strings.Contains(path, "/") {
91 t.Errorf("expected forward slash in path: %q", path)
92 }
93 }
94}