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}