changelog generator & diff tool
stormlightlabs.github.io/git-storm/
changelog
changeset
markdown
golang
git
1package main
2
3import (
4 "os"
5 "strings"
6 "testing"
7
8 "github.com/stormlightlabs/git-storm/internal/gitlog"
9 "github.com/stormlightlabs/git-storm/internal/testutils"
10)
11
12func TestGetCommitRange(t *testing.T) {
13 repo := testutils.SetupTestRepo(t)
14 commits := testutils.GetCommitHistory(t, repo)
15 if len(commits) < 3 {
16 t.Fatalf("Expected at least 3 commits, got %d", len(commits))
17 }
18
19 oldCommit := commits[len(commits)-2]
20 if err := testutils.CreateTagAtCommit(t, repo, "v1.0.0", oldCommit.Hash.String()); err != nil {
21 t.Fatalf("Failed to create tag: %v", err)
22 }
23
24 testutils.AddCommit(t, repo, "d.txt", "content d", "feat: add d feature")
25 testutils.AddCommit(t, repo, "e.txt", "content e", "fix: fix e bug")
26
27 rangeCommits, err := gitlog.GetCommitRange(repo, "v1.0.0", "HEAD")
28 if err != nil {
29 t.Fatalf("gitlog.GetCommitRange() error = %v", err)
30 }
31
32 if len(rangeCommits) < 2 {
33 t.Errorf("Expected at least 2 commits in range, got %d", len(rangeCommits))
34 }
35
36 for i := 1; i < len(rangeCommits); i++ {
37 if rangeCommits[i].Author.When.Before(rangeCommits[i-1].Author.When) {
38 t.Errorf("Commits are not in chronological order")
39 }
40 }
41}
42
43func TestGetCommitRange_SameRef(t *testing.T) {
44 repo := testutils.SetupTestRepo(t)
45
46 rangeCommits, err := gitlog.GetCommitRange(repo, "HEAD", "HEAD")
47 if err != nil {
48 t.Fatalf("gitlog.GetCommitRange() error = %v", err)
49 }
50
51 if len(rangeCommits) != 0 {
52 t.Errorf("Expected 0 commits when from and to are the same, got %d", len(rangeCommits))
53 }
54}
55
56func TestGetCommitRange_InvalidRef(t *testing.T) {
57 repo := testutils.SetupTestRepo(t)
58
59 _, err := gitlog.GetCommitRange(repo, "invalid-ref", "HEAD")
60 if err == nil {
61 t.Errorf("Expected error for invalid ref, got nil")
62 }
63}
64
65func TestGenerateCmd_JSONOutput(t *testing.T) {
66 repo := testutils.SetupTestRepo(t)
67 worktree, err := repo.Worktree()
68 if err != nil {
69 t.Fatalf("Failed to get worktree: %v", err)
70 }
71
72 commits := testutils.GetCommitHistory(t, repo)
73 if len(commits) < 2 {
74 t.Fatalf("Expected at least 2 commits, got %d", len(commits))
75 }
76
77 oldCommit := commits[len(commits)-2]
78 if err := testutils.CreateTagAtCommit(t, repo, "v1.0.0", oldCommit.Hash.String()); err != nil {
79 t.Fatalf("Failed to create tag: %v", err)
80 }
81
82 testutils.AddCommit(t, repo, "feat.txt", "content", "feat: add new feature")
83 testutils.AddCommit(t, repo, "fix.txt", "content", "fix: fix bug")
84
85 repoPath = worktree.Filesystem.Root()
86 outputJSON = true
87
88 oldWd, err := os.Getwd()
89 if err != nil {
90 t.Fatalf("Failed to get current directory: %v", err)
91 }
92 defer func() {
93 os.Chdir(oldWd)
94 outputJSON = false
95 }()
96
97 if err := os.Chdir(repoPath); err != nil {
98 t.Fatalf("Failed to change to temp directory: %v", err)
99 }
100
101 cmd := generateCmd()
102 cmd.SetArgs([]string{"v1.0.0", "HEAD"})
103
104 err = cmd.Execute()
105 if err != nil {
106 t.Fatalf("generateCmd() error = %v", err)
107 }
108}
109
110func TestGenerateCmd_InteractiveAndJSONConflict(t *testing.T) {
111 repo := testutils.SetupTestRepo(t)
112 worktree, err := repo.Worktree()
113 if err != nil {
114 t.Fatalf("Failed to get worktree: %v", err)
115 }
116
117 repoPath = worktree.Filesystem.Root()
118
119 cmd := generateCmd()
120 cmd.SetArgs([]string{"--interactive", "--output-json", "HEAD~1", "HEAD"})
121
122 err = cmd.Execute()
123 if err == nil {
124 t.Error("Expected error when using --interactive and --output-json together, got nil")
125 }
126
127 if err != nil {
128 validErrors := []string{
129 "--interactive and --output-json cannot be used together",
130 "requires an interactive terminal",
131 }
132 foundValidError := false
133 for _, validErr := range validErrors {
134 if strings.Contains(err.Error(), validErr) {
135 foundValidError = true
136 break
137 }
138 }
139 if !foundValidError {
140 t.Errorf("Expected error about flags conflict or TTY requirement, got: %v", err)
141 }
142 }
143}