bug: fix EditCommentOperation targeting the wrong comment

Michael Muré created

fix #126

Change summary

bug/op_edit_comment.go      |  2 
bug/op_edit_comment_test.go | 44 +++++++++++++++++++++++++++++++-------
2 files changed, 36 insertions(+), 10 deletions(-)

Detailed changes

bug/op_edit_comment.go 🔗

@@ -48,7 +48,7 @@ func (op *EditCommentOperation) Apply(snapshot *Snapshot) {
 
 		// Track the index in the []Comment
 		switch item.(type) {
-		case *CreateTimelineItem, *CommentTimelineItem:
+		case *CreateTimelineItem, *AddCommentTimelineItem:
 			commentIndex++
 		}
 	}

bug/op_edit_comment_test.go 🔗

@@ -5,9 +5,10 @@ import (
 	"testing"
 	"time"
 
-	"github.com/MichaelMure/git-bug/identity"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+
+	"github.com/MichaelMure/git-bug/identity"
 )
 
 func TestEdit(t *testing.T) {
@@ -22,29 +23,54 @@ func TestEdit(t *testing.T) {
 	hash1, err := create.Hash()
 	require.NoError(t, err)
 
-	comment := NewAddCommentOp(rene, unix, "comment", nil)
-	comment.Apply(&snapshot)
+	comment1 := NewAddCommentOp(rene, unix, "comment 1", nil)
+	comment1.Apply(&snapshot)
+
+	hash2, err := comment1.Hash()
+	require.NoError(t, err)
+
+	// add another unrelated op in between
+	setTitle := NewSetTitleOp(rene, unix, "edited title", "title")
+	setTitle.Apply(&snapshot)
 
-	hash2, err := comment.Hash()
+	comment2 := NewAddCommentOp(rene, unix, "comment 2", nil)
+	comment2.Apply(&snapshot)
+
+	hash3, err := comment2.Hash()
 	require.NoError(t, err)
 
 	edit := NewEditCommentOp(rene, unix, hash1, "create edited", nil)
 	edit.Apply(&snapshot)
 
-	assert.Equal(t, len(snapshot.Timeline), 2)
+	assert.Equal(t, len(snapshot.Timeline), 4)
 	assert.Equal(t, len(snapshot.Timeline[0].(*CreateTimelineItem).History), 2)
 	assert.Equal(t, len(snapshot.Timeline[1].(*AddCommentTimelineItem).History), 1)
+	assert.Equal(t, len(snapshot.Timeline[3].(*AddCommentTimelineItem).History), 1)
 	assert.Equal(t, snapshot.Comments[0].Message, "create edited")
-	assert.Equal(t, snapshot.Comments[1].Message, "comment")
+	assert.Equal(t, snapshot.Comments[1].Message, "comment 1")
+	assert.Equal(t, snapshot.Comments[2].Message, "comment 2")
 
-	edit2 := NewEditCommentOp(rene, unix, hash2, "comment edited", nil)
+	edit2 := NewEditCommentOp(rene, unix, hash2, "comment 1 edited", nil)
 	edit2.Apply(&snapshot)
 
-	assert.Equal(t, len(snapshot.Timeline), 2)
+	assert.Equal(t, len(snapshot.Timeline), 4)
+	assert.Equal(t, len(snapshot.Timeline[0].(*CreateTimelineItem).History), 2)
+	assert.Equal(t, len(snapshot.Timeline[1].(*AddCommentTimelineItem).History), 2)
+	assert.Equal(t, len(snapshot.Timeline[3].(*AddCommentTimelineItem).History), 1)
+	assert.Equal(t, snapshot.Comments[0].Message, "create edited")
+	assert.Equal(t, snapshot.Comments[1].Message, "comment 1 edited")
+	assert.Equal(t, snapshot.Comments[2].Message, "comment 2")
+
+	edit3 := NewEditCommentOp(rene, unix, hash3, "comment 2 edited", nil)
+	edit3.Apply(&snapshot)
+
+	assert.Equal(t, len(snapshot.Timeline), 4)
 	assert.Equal(t, len(snapshot.Timeline[0].(*CreateTimelineItem).History), 2)
 	assert.Equal(t, len(snapshot.Timeline[1].(*AddCommentTimelineItem).History), 2)
+	assert.Equal(t, len(snapshot.Timeline[3].(*AddCommentTimelineItem).History), 2)
 	assert.Equal(t, snapshot.Comments[0].Message, "create edited")
-	assert.Equal(t, snapshot.Comments[1].Message, "comment edited")
+	assert.Equal(t, snapshot.Comments[1].Message, "comment 1 edited")
+	assert.Equal(t, snapshot.Comments[2].Message, "comment 2 edited")
 }
 
 func TestEditCommentSerialize(t *testing.T) {