1package bug
2
3import (
4 "encoding/json"
5 "testing"
6 "time"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10
11 "github.com/MichaelMure/git-bug/identity"
12 "github.com/MichaelMure/git-bug/repository"
13)
14
15func TestEdit(t *testing.T) {
16 snapshot := Snapshot{}
17
18 repo := repository.NewMockRepoForTest()
19 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
20 err := rene.Commit(repo)
21 require.NoError(t, err)
22
23 unix := time.Now().Unix()
24
25 create := NewCreateOp(rene, unix, "title", "create", nil)
26 create.Apply(&snapshot)
27
28 id1 := create.Id()
29 require.NoError(t, id1.Validate())
30
31 comment1 := NewAddCommentOp(rene, unix, "comment 1", nil)
32 comment1.Apply(&snapshot)
33
34 id2 := comment1.Id()
35 require.NoError(t, id2.Validate())
36
37 // add another unrelated op in between
38 setTitle := NewSetTitleOp(rene, unix, "edited title", "title")
39 setTitle.Apply(&snapshot)
40
41 comment2 := NewAddCommentOp(rene, unix, "comment 2", nil)
42 comment2.Apply(&snapshot)
43
44 id3 := comment2.Id()
45 require.NoError(t, id3.Validate())
46
47 edit := NewEditCommentOp(rene, unix, id1, "create edited", nil)
48 edit.Apply(&snapshot)
49
50 assert.Equal(t, len(snapshot.Timeline), 4)
51 assert.Equal(t, len(snapshot.Timeline[0].(*CreateTimelineItem).History), 2)
52 assert.Equal(t, len(snapshot.Timeline[1].(*AddCommentTimelineItem).History), 1)
53 assert.Equal(t, len(snapshot.Timeline[3].(*AddCommentTimelineItem).History), 1)
54 assert.Equal(t, snapshot.Comments[0].Message, "create edited")
55 assert.Equal(t, snapshot.Comments[1].Message, "comment 1")
56 assert.Equal(t, snapshot.Comments[2].Message, "comment 2")
57
58 edit2 := NewEditCommentOp(rene, unix, id2, "comment 1 edited", nil)
59 edit2.Apply(&snapshot)
60
61 assert.Equal(t, len(snapshot.Timeline), 4)
62 assert.Equal(t, len(snapshot.Timeline[0].(*CreateTimelineItem).History), 2)
63 assert.Equal(t, len(snapshot.Timeline[1].(*AddCommentTimelineItem).History), 2)
64 assert.Equal(t, len(snapshot.Timeline[3].(*AddCommentTimelineItem).History), 1)
65 assert.Equal(t, snapshot.Comments[0].Message, "create edited")
66 assert.Equal(t, snapshot.Comments[1].Message, "comment 1 edited")
67 assert.Equal(t, snapshot.Comments[2].Message, "comment 2")
68
69 edit3 := NewEditCommentOp(rene, unix, id3, "comment 2 edited", nil)
70 edit3.Apply(&snapshot)
71
72 assert.Equal(t, len(snapshot.Timeline), 4)
73 assert.Equal(t, len(snapshot.Timeline[0].(*CreateTimelineItem).History), 2)
74 assert.Equal(t, len(snapshot.Timeline[1].(*AddCommentTimelineItem).History), 2)
75 assert.Equal(t, len(snapshot.Timeline[3].(*AddCommentTimelineItem).History), 2)
76 assert.Equal(t, snapshot.Comments[0].Message, "create edited")
77 assert.Equal(t, snapshot.Comments[1].Message, "comment 1 edited")
78 assert.Equal(t, snapshot.Comments[2].Message, "comment 2 edited")
79}
80
81func TestEditCommentSerialize(t *testing.T) {
82 repo := repository.NewMockRepoForTest()
83 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
84 err := rene.Commit(repo)
85 require.NoError(t, err)
86
87 unix := time.Now().Unix()
88 before := NewEditCommentOp(rene, unix, "target", "message", nil)
89
90 data, err := json.Marshal(before)
91 assert.NoError(t, err)
92
93 var after EditCommentOperation
94 err = json.Unmarshal(data, &after)
95 assert.NoError(t, err)
96
97 // enforce creating the ID
98 before.Id()
99
100 // Replace the identity stub with the real thing
101 assert.Equal(t, rene.Id(), after.base().Author.Id())
102 after.Author = rene
103
104 assert.Equal(t, before, &after)
105}