1package bug
2
3import (
4 "testing"
5 "time"
6
7 "github.com/MichaelMure/git-bug/identity"
8 "github.com/MichaelMure/git-bug/repository"
9 "github.com/stretchr/testify/assert"
10)
11
12func TestBugId(t *testing.T) {
13 mockRepo := repository.NewMockRepoForTest()
14
15 bug1 := NewBug()
16
17 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
18 createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
19
20 bug1.Append(createOp)
21
22 err := bug1.Commit(mockRepo)
23
24 if err != nil {
25 t.Fatal(err)
26 }
27
28 bug1.Id()
29}
30
31func TestBugValidity(t *testing.T) {
32 mockRepo := repository.NewMockRepoForTest()
33
34 bug1 := NewBug()
35
36 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
37 createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
38
39 if bug1.Validate() == nil {
40 t.Fatal("Empty bug should be invalid")
41 }
42
43 bug1.Append(createOp)
44
45 if bug1.Validate() != nil {
46 t.Fatal("Bug with just a CreateOp should be valid")
47 }
48
49 err := bug1.Commit(mockRepo)
50 if err != nil {
51 t.Fatal(err)
52 }
53
54 bug1.Append(createOp)
55
56 if bug1.Validate() == nil {
57 t.Fatal("Bug with multiple CreateOp should be invalid")
58 }
59
60 err = bug1.Commit(mockRepo)
61 if err == nil {
62 t.Fatal("Invalid bug should not commit")
63 }
64}
65
66func TestBugCommitLoad(t *testing.T) {
67 bug1 := NewBug()
68
69 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
70 createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
71 setTitleOp := NewSetTitleOp(rene, time.Now().Unix(), "title2", "title1")
72 addCommentOp := NewAddCommentOp(rene, time.Now().Unix(), "message2", nil)
73
74 bug1.Append(createOp)
75 bug1.Append(setTitleOp)
76 bug1.Append(setTitleOp)
77 bug1.Append(addCommentOp)
78
79 repo := repository.NewMockRepoForTest()
80
81 assert.True(t, bug1.NeedCommit())
82
83 err := bug1.Commit(repo)
84 assert.Nil(t, err)
85 assert.False(t, bug1.NeedCommit())
86
87 bug2, err := ReadLocalBug(repo, bug1.Id())
88 assert.NoError(t, err)
89 equivalentBug(t, bug1, bug2)
90
91 // add more op
92
93 bug1.Append(setTitleOp)
94 bug1.Append(addCommentOp)
95
96 assert.True(t, bug1.NeedCommit())
97
98 err = bug1.Commit(repo)
99 assert.Nil(t, err)
100 assert.False(t, bug1.NeedCommit())
101
102 bug3, err := ReadLocalBug(repo, bug1.Id())
103 assert.NoError(t, err)
104 equivalentBug(t, bug1, bug3)
105}
106
107func equivalentBug(t *testing.T, expected, actual *Bug) {
108 assert.Equal(t, len(expected.packs), len(actual.packs))
109
110 for i := range expected.packs {
111 for j := range expected.packs[i].Operations {
112 actual.packs[i].Operations[j].base().id = expected.packs[i].Operations[j].base().id
113 }
114 }
115
116 assert.Equal(t, expected, actual)
117}