edit_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/entity"
 12	"github.com/git-bug/git-bug/repository"
 13)
 14
 15// TestEditCommand_EditIssueTitle edits only the issue title
 16func TestEditCommand_EditIssueTitle(t *testing.T) {
 17	tmpDir := t.TempDir()
 18
 19	// Initialize a git repo
 20	initCmd := exec.Command("git", "init")
 21	initCmd.Dir = tmpDir
 22	if err := initCmd.Run(); err != nil {
 23		t.Fatalf("failed to init git repo: %v", err)
 24	}
 25
 26	// Initialize git-bug identities
 27	if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
 28		t.Fatalf("failed to create identity: %v", err)
 29	}
 30
 31	// Create a bug
 32	title := "Original Title"
 33	message := "Original description"
 34	if err := runNew(tmpDir, title, message, ""); err != nil {
 35		t.Fatalf("runNew failed: %v", err)
 36	}
 37
 38	// Get the bug ID
 39	repo, err := repository.OpenGoGitRepo(tmpDir, "", nil)
 40	if err != nil {
 41		t.Fatalf("failed to open repo: %v", err)
 42	}
 43
 44	var bugID string
 45	for streamedBug := range bug.ReadAll(repo) {
 46		if streamedBug.Err != nil {
 47			t.Fatalf("failed to read bug: %v", streamedBug.Err)
 48		}
 49		b := streamedBug.Entity
 50		snap := b.Compile()
 51		if snap.Title == title {
 52			bugID = b.Id().String()
 53			break
 54		}
 55	}
 56	repo.Close()
 57
 58	if bugID == "" {
 59		t.Fatal("could not find created bug")
 60	}
 61
 62	// Edit only the title
 63	newTitle := "Updated Title"
 64	if err := runEdit(tmpDir, bugID, newTitle, "", ""); err != nil {
 65		t.Fatalf("runEdit failed: %v", err)
 66	}
 67
 68	// Verify title was updated
 69	repo, err = repository.OpenGoGitRepo(tmpDir, "", nil)
 70	if err != nil {
 71		t.Fatalf("failed to open repo: %v", err)
 72	}
 73	defer repo.Close()
 74
 75	b, err := bug.Read(repo, entity.Id(bugID))
 76	if err != nil {
 77		t.Fatalf("failed to read bug: %v", err)
 78	}
 79
 80	snap := b.Compile()
 81	if snap.Title != newTitle {
 82		t.Errorf("title = %q, want %q", snap.Title, newTitle)
 83	}
 84	// Description should remain unchanged
 85	if len(snap.Comments) == 0 || snap.Comments[0].Message != message {
 86		t.Errorf("description was changed unexpectedly")
 87	}
 88}
 89
 90// TestEditCommand_EditIssueDescription edits only the issue description
 91func TestEditCommand_EditIssueDescription(t *testing.T) {
 92	tmpDir := t.TempDir()
 93
 94	// Initialize a git repo
 95	initCmd := exec.Command("git", "init")
 96	initCmd.Dir = tmpDir
 97	if err := initCmd.Run(); err != nil {
 98		t.Fatalf("failed to init git repo: %v", err)
 99	}
100
101	// Initialize git-bug identities
102	if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
103		t.Fatalf("failed to create identity: %v", err)
104	}
105
106	// Create a bug
107	title := "Original Title"
108	message := "Original description"
109	if err := runNew(tmpDir, title, message, ""); err != nil {
110		t.Fatalf("runNew failed: %v", err)
111	}
112
113	// Get the bug ID
114	repo, err := repository.OpenGoGitRepo(tmpDir, "", nil)
115	if err != nil {
116		t.Fatalf("failed to open repo: %v", err)
117	}
118
119	var bugID string
120	for streamedBug := range bug.ReadAll(repo) {
121		if streamedBug.Err != nil {
122			t.Fatalf("failed to read bug: %v", streamedBug.Err)
123		}
124		b := streamedBug.Entity
125		snap := b.Compile()
126		if snap.Title == title {
127			bugID = b.Id().String()
128			break
129		}
130	}
131	repo.Close()
132
133	if bugID == "" {
134		t.Fatal("could not find created bug")
135	}
136
137	// Edit only the description
138	newMessage := "Updated description"
139	if err := runEdit(tmpDir, bugID, "", newMessage, ""); err != nil {
140		t.Fatalf("runEdit failed: %v", err)
141	}
142
143	// Verify description was updated
144	repo, err = repository.OpenGoGitRepo(tmpDir, "", nil)
145	if err != nil {
146		t.Fatalf("failed to open repo: %v", err)
147	}
148	defer repo.Close()
149
150	b, err := bug.Read(repo, entity.Id(bugID))
151	if err != nil {
152		t.Fatalf("failed to read bug: %v", err)
153	}
154
155	snap := b.Compile()
156	// Title should remain unchanged
157	if snap.Title != title {
158		t.Errorf("title was changed unexpectedly")
159	}
160	if len(snap.Comments) == 0 || snap.Comments[0].Message != newMessage {
161		t.Errorf("description = %q, want %q", snap.Comments[0].Message, newMessage)
162	}
163}
164
165// TestEditCommand_EditIssueBoth edits both title and description
166func TestEditCommand_EditIssueBoth(t *testing.T) {
167	tmpDir := t.TempDir()
168
169	// Initialize a git repo
170	initCmd := exec.Command("git", "init")
171	initCmd.Dir = tmpDir
172	if err := initCmd.Run(); err != nil {
173		t.Fatalf("failed to init git repo: %v", err)
174	}
175
176	// Initialize git-bug identities
177	if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
178		t.Fatalf("failed to create identity: %v", err)
179	}
180
181	// Create a bug
182	if err := runNew(tmpDir, "Original Title", "Original description", ""); err != nil {
183		t.Fatalf("runNew failed: %v", err)
184	}
185
186	// Get the bug ID
187	repo, err := repository.OpenGoGitRepo(tmpDir, "", nil)
188	if err != nil {
189		t.Fatalf("failed to open repo: %v", err)
190	}
191
192	var bugID string
193	for streamedBug := range bug.ReadAll(repo) {
194		if streamedBug.Err != nil {
195			t.Fatalf("failed to read bug: %v", streamedBug.Err)
196		}
197		b := streamedBug.Entity
198		snap := b.Compile()
199		if snap.Title == "Original Title" {
200			bugID = b.Id().String()
201			break
202		}
203	}
204	repo.Close()
205
206	// Edit both title and description
207	newTitle := "Updated Title"
208	newMessage := "Updated description"
209	if err := runEdit(tmpDir, bugID, newTitle, newMessage, ""); err != nil {
210		t.Fatalf("runEdit failed: %v", err)
211	}
212
213	// Verify both were updated
214	repo, err = repository.OpenGoGitRepo(tmpDir, "", nil)
215	if err != nil {
216		t.Fatalf("failed to open repo: %v", err)
217	}
218	defer repo.Close()
219
220	b, err := bug.Read(repo, entity.Id(bugID))
221	if err != nil {
222		t.Fatalf("failed to read bug: %v", err)
223	}
224
225	snap := b.Compile()
226	if snap.Title != newTitle {
227		t.Errorf("title = %q, want %q", snap.Title, newTitle)
228	}
229	if len(snap.Comments) == 0 || snap.Comments[0].Message != newMessage {
230		t.Errorf("description = %q, want %q", snap.Comments[0].Message, newMessage)
231	}
232}
233
234// TestEditCommand_EditComment edits a comment
235func TestEditCommand_EditComment(t *testing.T) {
236	tmpDir := t.TempDir()
237
238	// Initialize a git repo
239	initCmd := exec.Command("git", "init")
240	initCmd.Dir = tmpDir
241	if err := initCmd.Run(); err != nil {
242		t.Fatalf("failed to init git repo: %v", err)
243	}
244
245	// Initialize git-bug identities
246	if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
247		t.Fatalf("failed to create identity: %v", err)
248	}
249
250	// Create a bug
251	if err := runNew(tmpDir, "Test Bug", "Description", ""); err != nil {
252		t.Fatalf("runNew failed: %v", err)
253	}
254
255	// Get the bug ID
256	repo, err := repository.OpenGoGitRepo(tmpDir, "", nil)
257	if err != nil {
258		t.Fatalf("failed to open repo: %v", err)
259	}
260
261	var bugID string
262	for streamedBug := range bug.ReadAll(repo) {
263		if streamedBug.Err != nil {
264			t.Fatalf("failed to read bug: %v", streamedBug.Err)
265		}
266		b := streamedBug.Entity
267		snap := b.Compile()
268		if snap.Title == "Test Bug" {
269			bugID = b.Id().String()
270			break
271		}
272	}
273	repo.Close()
274
275	// Add a comment
276	originalComment := "Original comment text"
277	if err := runComment(tmpDir, bugID, originalComment); err != nil {
278		t.Fatalf("runComment failed: %v", err)
279	}
280
281	// Get the comment ID
282	repo, err = repository.OpenGoGitRepo(tmpDir, "", nil)
283	if err != nil {
284		t.Fatalf("failed to open repo: %v", err)
285	}
286
287	b, err := bug.Read(repo, entity.Id(bugID))
288	if err != nil {
289		t.Fatalf("failed to read bug: %v", err)
290	}
291	snap := b.Compile()
292	if len(snap.Comments) < 2 {
293		t.Fatal("expected at least 2 comments")
294	}
295	commentID := snap.Comments[1].CombinedId().String()
296	repo.Close()
297
298	// Edit the comment
299	newComment := "Updated comment text"
300	if err := runEdit(tmpDir, commentID, "", newComment, ""); err != nil {
301		t.Fatalf("runEdit failed: %v", err)
302	}
303
304	// Verify comment was updated
305	repo, err = repository.OpenGoGitRepo(tmpDir, "", nil)
306	if err != nil {
307		t.Fatalf("failed to open repo: %v", err)
308	}
309	defer repo.Close()
310
311	b, err = bug.Read(repo, entity.Id(bugID))
312	if err != nil {
313		t.Fatalf("failed to read bug: %v", err)
314	}
315
316	snap = b.Compile()
317	if len(snap.Comments) < 2 {
318		t.Fatal("expected at least 2 comments")
319	}
320	if snap.Comments[1].Message != newComment {
321		t.Errorf("comment = %q, want %q", snap.Comments[1].Message, newComment)
322	}
323}
324
325// TestEditCommand_InvalidID tests error for invalid ID
326func TestEditCommand_InvalidID(t *testing.T) {
327	tmpDir := t.TempDir()
328
329	// Initialize a git repo
330	initCmd := exec.Command("git", "init")
331	initCmd.Dir = tmpDir
332	if err := initCmd.Run(); err != nil {
333		t.Fatalf("failed to init git repo: %v", err)
334	}
335
336	// Initialize git-bug identities
337	if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
338		t.Fatalf("failed to create identity: %v", err)
339	}
340
341	// Try to edit non-existent ID
342	err := runEdit(tmpDir, "nonexistent123", "Title", "Message", "")
343	if err == nil {
344		t.Error("expected error for invalid ID, got nil")
345	}
346
347	if !strings.Contains(err.Error(), "failed to resolve ID") {
348		t.Errorf("expected 'failed to resolve ID' error, got: %v", err)
349	}
350}
351
352// TestEditCommand_WithShortID tests editing using a short ID
353func TestEditCommand_WithShortID(t *testing.T) {
354	tmpDir := t.TempDir()
355
356	// Initialize a git repo
357	initCmd := exec.Command("git", "init")
358	initCmd.Dir = tmpDir
359	if err := initCmd.Run(); err != nil {
360		t.Fatalf("failed to init git repo: %v", err)
361	}
362
363	// Initialize git-bug identities
364	if err := createIdentity(tmpDir, "Test User", "[email protected]", true); err != nil {
365		t.Fatalf("failed to create identity: %v", err)
366	}
367
368	// Create a bug
369	if err := runNew(tmpDir, "Original Title", "Original description", ""); err != nil {
370		t.Fatalf("runNew failed: %v", err)
371	}
372
373	// Get the bug ID and short ID
374	repo, err := repository.OpenGoGitRepo(tmpDir, "", nil)
375	if err != nil {
376		t.Fatalf("failed to open repo: %v", err)
377	}
378
379	var bugID, shortID string
380	for streamedBug := range bug.ReadAll(repo) {
381		if streamedBug.Err != nil {
382			t.Fatalf("failed to read bug: %v", streamedBug.Err)
383		}
384		b := streamedBug.Entity
385		snap := b.Compile()
386		if snap.Title == "Original Title" {
387			bugID = b.Id().String()
388			if len(bugID) > 7 {
389				shortID = bugID[:7]
390			} else {
391				shortID = bugID
392			}
393			break
394		}
395	}
396	repo.Close()
397
398	if shortID == "" {
399		t.Fatal("could not find created bug")
400	}
401
402	// Edit using short ID
403	newTitle := "Updated Title"
404	if err := runEdit(tmpDir, shortID, newTitle, "", ""); err != nil {
405		t.Fatalf("runEdit with short ID failed: %v", err)
406	}
407
408	// Verify title was updated
409	repo, err = repository.OpenGoGitRepo(tmpDir, "", nil)
410	if err != nil {
411		t.Fatalf("failed to open repo: %v", err)
412	}
413	defer repo.Close()
414
415	b, err := bug.Read(repo, entity.Id(bugID))
416	if err != nil {
417		t.Fatalf("failed to read bug: %v", err)
418	}
419
420	snap := b.Compile()
421	if snap.Title != newTitle {
422		t.Errorf("title = %q, want %q", snap.Title, newTitle)
423	}
424}