all repos

mugit @ 96821ba3e784d93a9effc172c698b5444f02eccc

🐮 git server that your cow will love

mugit/internal/git/diff_test.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
goimports -local 'olexsmir.xyz' -w ., 1 month ago
1
package git
2
3
import (
4
	"testing"
5
6
	"github.com/bluekeyes/go-gitdiff/gitdiff"
7
8
	"olexsmir.xyz/x/is"
9
)
10
11
func TestRepo_Diff(t *testing.T) {
12
	t.Run("single file addition", func(t *testing.T) {
13
		r := newTestRepo(t)
14
		r.commitFile("README.md", "# Test", "Initial commit")
15
		r.commitFile("hello.txt", "hello world\n", "Add hello file")
16
17
		diff, err := r.open().Diff()
18
		is.Err(t, err, nil)
19
		is.Equal(t, diff.Stat.FilesChanged, 1)
20
		is.Equal(t, diff.Stat.Insertions, 1)
21
		is.Equal(t, diff.Stat.Deletions, 0)
22
		is.Equal(t, len(diff.Diff), 1)
23
		is.Equal(t, diff.Diff[0].Name.New, "hello.txt")
24
		is.Equal(t, diff.Diff[0].IsNew, true)
25
	})
26
27
	t.Run("file modification", func(t *testing.T) {
28
		r := newTestRepo(t)
29
		r.commitFile("README.md", "# Original\n", "Initial commit")
30
		r.commitFile("README.md", "# Modified\n\nNew content here.\n", "Update README")
31
32
		diff, err := r.open().Diff()
33
		is.Err(t, err, nil)
34
		is.Equal(t, diff.Stat.FilesChanged, 1)
35
		is.Equal(t, diff.Diff[0].Name.New, "README.md")
36
		is.Equal(t, diff.Diff[0].IsNew, false)
37
		is.Equal(t, diff.Diff[0].IsDelete, false)
38
		if diff.Stat.Insertions == 0 {
39
			t.Error("expected insertions > 0")
40
		}
41
		if diff.Stat.Deletions == 0 {
42
			t.Error("expected deletions > 0")
43
		}
44
	})
45
46
	t.Run("file deletion", func(t *testing.T) {
47
		r := newTestRepo(t)
48
		r.commitFile("todelete.txt", "temp content\n", "Add temp file")
49
		r.deleteFile("todelete.txt", "Delete temp file")
50
51
		diff, err := r.open().Diff()
52
		is.Err(t, err, nil)
53
		is.Equal(t, diff.Stat.FilesChanged, 1)
54
		is.Equal(t, diff.Stat.Deletions, 1)
55
		is.Equal(t, diff.Diff[0].IsDelete, true)
56
	})
57
58
	t.Run("multiple files changed", func(t *testing.T) {
59
		r := newTestRepo(t)
60
		r.commitFile("file1.txt", "content 1\n", "Add file1")
61
		r.commitFile("file2.txt", "content 2\n", "Add file2")
62
		r.commitFile("file3.txt", "content 3\n", "Add file3")
63
64
		diff, err := r.open().Diff()
65
		is.Err(t, err, nil)
66
		is.Equal(t, diff.Stat.FilesChanged, 1)
67
		is.Equal(t, diff.Stat.Insertions, 1)
68
	})
69
70
	t.Run("has parent hashes", func(t *testing.T) {
71
		r := newTestRepo(t)
72
		r.commitFile("first.txt", "first\n", "First commit")
73
		r.commitFile("second.txt", "second file\n", "Add second file")
74
75
		diff, err := r.open().Diff()
76
		is.Err(t, err, nil)
77
		is.Equal(t, len(diff.Parents), 1)
78
		if len(diff.Parents[0]) == 0 {
79
			t.Error("expected parent hash to be non-empty")
80
		}
81
	})
82
83
	t.Run("initial commit has no parents", func(t *testing.T) {
84
		r := newTestRepo(t)
85
		r.commitFile("initial.txt", "initial\n", "Initial commit")
86
87
		commits, err := r.open().Commits("")
88
		is.Err(t, err, nil)
89
		if len(commits) == 0 {
90
			t.Fatal("expected at least one commit")
91
		}
92
93
		initial := r.open(commits[len(commits)-1].Hash)
94
		diff, err := initial.Diff()
95
		is.Equal(t, len(diff.Parents), 0)
96
		is.Err(t, err, nil)
97
	})
98
99
	t.Run("text fragments have line info", func(t *testing.T) {
100
		r := newTestRepo(t)
101
		r.commitFile("README.md", "original\n", "Initial commit")
102
		r.commitFile("README.md", "line 1\nline 2\nline 3\n", "Multi-line change")
103
104
		diff, err := r.open().Diff()
105
		is.Err(t, err, nil)
106
		if len(diff.Diff) == 0 {
107
			t.Fatal("expected at least one diff")
108
		}
109
		if len(diff.Diff[0].TextFragments) == 0 {
110
			t.Fatal("expected at least one text fragment")
111
		}
112
113
		frag := diff.Diff[0].TextFragments[0]
114
		if len(frag.Lines) == 0 {
115
			t.Fatal("expected at least one line")
116
		}
117
118
		// Check that lines have operations
119
		hasAdd := false
120
		for _, line := range frag.Lines {
121
			if line.Op == gitdiff.OpAdd {
122
				hasAdd = true
123
			}
124
		}
125
		if !hasAdd {
126
			t.Error("expected at least one added line")
127
		}
128
	})
129
130
	t.Run("commit info is populated", func(t *testing.T) {
131
		r := newTestRepo(t)
132
		r.commitFile("info.txt", "test\n", "Test commit message")
133
134
		diff, err := r.open().Diff()
135
		is.Err(t, err, nil)
136
		is.Equal(t, diff.Commit.Message, "Test commit message")
137
		is.Equal(t, diff.Commit.AuthorName, "Test User")
138
		is.Equal(t, diff.Commit.AuthorEmail, "test@test.local")
139
		if len(diff.Commit.Hash) == 0 {
140
			t.Error("expected commit hash to be non-empty")
141
		}
142
	})
143
}
144
145
func TestTextFragment(t *testing.T) {
146
	frag := TextFragment{
147
		Header:      "@@ -1,3 +1,4 @@",
148
		OldPosition: 1,
149
		NewPosition: 1,
150
		Lines: []gitdiff.Line{
151
			{Op: gitdiff.OpContext, Line: "context line"},
152
			{Op: gitdiff.OpAdd, Line: "added line"},
153
		},
154
	}
155
	is.Equal(t, frag.Header, "@@ -1,3 +1,4 @@")
156
	is.Equal(t, frag.OldPosition, int64(1))
157
	is.Equal(t, frag.NewPosition, int64(1))
158
	is.Equal(t, len(frag.Lines), 2)
159
}