GameOver1337 / GitClone Public
К репозиторию
3.3 KB
internal/services/git_test.go
3.3 KB
1package services
2
3import (
4 "os"
5 "path/filepath"
6 "testing"
7 "time"
8)
9
10// commitFiles создаёт рабочую копию, коммитит файлы и пушит в bare-репозиторий.
11func 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
35func 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
82func 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}