new_integration_test.go
1//go:build integration
2
3package main
4
5import (
6 "os/exec"
7 "strings"
8 "testing"
9
10 "github.com/git-bug/git-bug/entities/bug"
11 "github.com/git-bug/git-bug/repository"
12)
13
14// TestNewCommand_WithFlags creates a bug using command-line flags
15func TestNewCommand_WithFlags(t *testing.T) {
16 tmpDir := t.TempDir()
17
18 // Initialize a git repo
19 initCmd := exec.Command("git", "init")
20 initCmd.Dir = tmpDir
21 if err := initCmd.Run(); err != nil {
22 t.Fatalf("failed to init git repo: %v", err)
23 }
24
25 // Initialize git-bug identities
26 if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
27 t.Fatalf("failed to create identity: %v", err)
28 }
29
30 // Create a bug using flags
31 title := "Test Bug Title"
32 message := "Test bug description"
33 if err := runNew(tmpDir, title, message, ""); err != nil {
34 t.Fatalf("runNew failed: %v", err)
35 }
36
37 // Verify bug was created
38 repo, err := repository.OpenGoGitRepo(tmpDir, "", nil)
39 if err != nil {
40 t.Fatalf("failed to open repo: %v", err)
41 }
42 defer repo.Close()
43
44 // Count bugs
45 bugCount := 0
46 for streamedBug := range bug.ReadAll(repo) {
47 if streamedBug.Err != nil {
48 t.Fatalf("failed to read bug: %v", streamedBug.Err)
49 }
50 b := streamedBug.Entity
51 snap := b.Compile()
52
53 if snap.Title == title {
54 bugCount++
55 if snap.Comments[0].Message != message {
56 t.Errorf("message = %q, want %q", snap.Comments[0].Message, message)
57 }
58 if snap.Author.Name() != "Test User" {
59 t.Errorf("author = %q, want %q", snap.Author.Name(), "Test User")
60 }
61 }
62 }
63
64 if bugCount != 1 {
65 t.Errorf("expected 1 bug with title %q, found %d", title, bugCount)
66 }
67}
68
69// TestNewCommand_TitleOnly creates a bug with only title
70func TestNewCommand_TitleOnly(t *testing.T) {
71 tmpDir := t.TempDir()
72
73 // Initialize a git repo
74 initCmd := exec.Command("git", "init")
75 initCmd.Dir = tmpDir
76 if err := initCmd.Run(); err != nil {
77 t.Fatalf("failed to init git repo: %v", err)
78 }
79
80 // Initialize git-bug identities
81 if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
82 t.Fatalf("failed to create identity: %v", err)
83 }
84
85 // Create a bug with title only
86 title := "Title Only Bug"
87 if err := runNew(tmpDir, title, "", ""); err != nil {
88 t.Fatalf("runNew failed: %v", err)
89 }
90
91 // Verify bug was created
92 repo, err := repository.OpenGoGitRepo(tmpDir, "", nil)
93 if err != nil {
94 t.Fatalf("failed to open repo: %v", err)
95 }
96 defer repo.Close()
97
98 // Find the bug
99 found := false
100 for streamedBug := range bug.ReadAll(repo) {
101 if streamedBug.Err != nil {
102 continue
103 }
104 b := streamedBug.Entity
105 snap := b.Compile()
106
107 if snap.Title == title {
108 found = true
109 if snap.Comments[0].Message != "" {
110 t.Errorf("expected empty message, got %q", snap.Comments[0].Message)
111 }
112 break
113 }
114 }
115
116 if !found {
117 t.Errorf("bug with title %q not found", title)
118 }
119}
120
121// TestNewCommand_NoIdentityError tests error when identity not set
122func TestNewCommand_NoIdentityError(t *testing.T) {
123 tmpDir := t.TempDir()
124
125 // Initialize a git repo (but no git-bug identities)
126 initCmd := exec.Command("git", "init")
127 initCmd.Dir = tmpDir
128 if err := initCmd.Run(); err != nil {
129 t.Fatalf("failed to init git repo: %v", err)
130 }
131
132 // Try to create a bug without identity
133 err := runNew(tmpDir, "Test Title", "Test message", "")
134 if err == nil {
135 t.Error("expected error when no identity is set, got nil")
136 }
137
138 if !strings.Contains(err.Error(), "failed to get user identity") {
139 t.Errorf("expected 'failed to get user identity' error, got: %v", err)
140 }
141}
142
143// TestNewCommand_EmptyTitleError tests error for empty title
144func TestNewCommand_EmptyTitleError(t *testing.T) {
145 tmpDir := t.TempDir()
146
147 // Initialize a git repo
148 initCmd := exec.Command("git", "init")
149 initCmd.Dir = tmpDir
150 if err := initCmd.Run(); err != nil {
151 t.Fatalf("failed to init git repo: %v", err)
152 }
153
154 // Initialize git-bug identities
155 if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
156 t.Fatalf("failed to create identity: %v", err)
157 }
158
159 // Try to create a bug with empty title (this would normally trigger editor)
160 // For direct testing, we test the validation after editor parsing
161 err := runNew(tmpDir, " ", "", "") // Whitespace-only title
162 if err == nil {
163 t.Error("expected error for empty title, got nil")
164 }
165
166 if !strings.Contains(err.Error(), "title cannot be empty") {
167 t.Errorf("expected 'title cannot be empty' error, got: %v", err)
168 }
169}