internal/services/git_test.go
3.3 KB
| 1 | package services |
| 2 | |
| 3 | import ( |
| 4 | "os" |
| 5 | "path/filepath" |
| 6 | "testing" |
| 7 | "time" |
| 8 | ) |
| 9 | |
| 10 | // commitFiles создаёт рабочую копию, коммитит файлы и пушит в bare-репозиторий. |
| 11 | func commitFiles(t *testing.T, s *GitService, name, work string, files map[string]string, msg string) { |
| 12 | t.Helper() |
| 13 | for rel, content := range files { |
| 14 | p := filepath.Join(work, filepath.FromSlash(rel)) |
| 15 | if err := os.MkdirAll(filepath.Dir(p), 0755); err != nil { |
| 16 | t.Fatal(err) |
| 17 | } |
| 18 | if err := os.WriteFile(p, []byte(content), 0644); err != nil { |
| 19 | t.Fatal(err) |
| 20 | } |
| 21 | } |
| 22 | runGit(work, time.Minute, "config", "user.email", "t@t") |
| 23 | runGit(work, time.Minute, "config", "user.name", "t") |
| 24 | if out, err := runGit(work, time.Minute, "add", "-A"); err != nil { |
| 25 | t.Fatalf("add: %s", out) |
| 26 | } |
| 27 | if out, err := runGit(work, time.Minute, "commit", "-m", msg); err != nil { |
| 28 | t.Fatalf("commit: %s", out) |
| 29 | } |
| 30 | if out, err := runGit(work, time.Minute, "push", s.RepoPath(name), "main"); err != nil { |
| 31 | t.Fatalf("push: %s", out) |
| 32 | } |
| 33 | } |
| 34 | |
| 35 | func TestLastCommitPerPath(t *testing.T) { |
| 36 | s := NewGitService(t.TempDir()) |
| 37 | name := "lastcommit-demo" |
| 38 | if err := s.CreateRepo(name); err != nil { |
| 39 | t.Fatal(err) |
| 40 | } |
| 41 | |
| 42 | work := filepath.Join(t.TempDir(), "work") |
| 43 | if err := os.MkdirAll(work, 0755); err != nil { |
| 44 | t.Fatal(err) |
| 45 | } |
| 46 | if out, err := runGit(work, time.Minute, "init", "-b", "main"); err != nil { |
| 47 | t.Fatalf("init: %s", out) |
| 48 | } |
| 49 | |
| 50 | commitFiles(t, s, name, work, map[string]string{ |
| 51 | "README.md": "# demo", |
| 52 | "docs/guide.md": "guide v1", |
| 53 | }, "first") |
| 54 | commitFiles(t, s, name, work, map[string]string{ |
| 55 | "src/main.go": "package main", |
| 56 | }, "add source") |
| 57 | commitFiles(t, s, name, work, map[string]string{ |
| 58 | "docs/guide.md": "guide v2", |
| 59 | }, "update docs") |
| 60 | |
| 61 | paths := []string{"README.md", "docs", "src"} |
| 62 | got := s.LastCommitPerPath(name, "main", paths) |
| 63 | if len(got) != len(paths) { |
| 64 | t.Fatalf("got %d entries, want %d: %+v", len(got), len(paths), got) |
| 65 | } |
| 66 | |
| 67 | if c := got["README.md"]; c.Subject != "first" { |
| 68 | t.Errorf("README.md subject = %q, want %q", c.Subject, "first") |
| 69 | } |
| 70 | // каталог определяется по префиксу файла внутри него |
| 71 | if c := got["docs"]; c.Subject != "update docs" { |
| 72 | t.Errorf("docs subject = %q, want %q", c.Subject, "update docs") |
| 73 | } |
| 74 | if c := got["src"]; c.Subject != "add source" { |
| 75 | t.Errorf("src subject = %q, want %q", c.Subject, "add source") |
| 76 | } |
| 77 | if got["README.md"].Time.IsZero() || got["docs"].Time.IsZero() { |
| 78 | t.Error("commit time must not be zero") |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | func TestCountCommitsAndTags(t *testing.T) { |
| 83 | s := NewGitService(t.TempDir()) |
| 84 | name := "count-demo" |
| 85 | if err := s.CreateRepo(name); err != nil { |
| 86 | t.Fatal(err) |
| 87 | } |
| 88 | |
| 89 | work := filepath.Join(t.TempDir(), "work") |
| 90 | if err := os.MkdirAll(work, 0755); err != nil { |
| 91 | t.Fatal(err) |
| 92 | } |
| 93 | if out, err := runGit(work, time.Minute, "init", "-b", "main"); err != nil { |
| 94 | t.Fatalf("init: %s", out) |
| 95 | } |
| 96 | commitFiles(t, s, name, work, map[string]string{"a.txt": "1"}, "one") |
| 97 | commitFiles(t, s, name, work, map[string]string{"b.txt": "2"}, "two") |
| 98 | |
| 99 | if got := s.CountCommits(name, "main"); got != 2 { |
| 100 | t.Errorf("CountCommits = %d, want 2", got) |
| 101 | } |
| 102 | if out, err := runGit(s.RepoPath(name), time.Minute, "tag", "v1.0.0"); err != nil { |
| 103 | t.Fatalf("tag: %s", out) |
| 104 | } |
| 105 | tags := s.ListTags(name) |
| 106 | if len(tags) != 1 || tags[0] != "v1.0.0" { |
| 107 | t.Errorf("ListTags = %v, want [v1.0.0]", tags) |
| 108 | } |
| 109 | } |