changelog generator & diff tool stormlightlabs.github.io/git-storm/
changelog changeset markdown golang git
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 143 lines 3.8 kB view raw
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}