all repos

mugit @ a940f43

🐮 git server that your cow will love

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

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