1package bug
2
3import (
4 "testing"
5 "time"
6
7 "github.com/stretchr/testify/require"
8
9 "github.com/MichaelMure/git-bug/identity"
10 "github.com/MichaelMure/git-bug/repository"
11)
12
13func TestValidate(t *testing.T) {
14 repo := repository.NewMockRepoClock()
15
16 makeIdentity := func(t *testing.T, name, email string) *identity.Identity {
17 i, err := identity.NewIdentity(repo, name, email)
18 require.NoError(t, err)
19 return i
20 }
21
22 rene := makeIdentity(t, "René Descartes", "rene@descartes.fr")
23
24 unix := time.Now().Unix()
25
26 good := []Operation{
27 NewCreateOp(rene, unix, "title", "message", nil),
28 NewSetTitleOp(rene, unix, "title2", "title1"),
29 NewAddCommentOp(rene, unix, "message2", nil),
30 NewSetStatusOp(rene, unix, ClosedStatus),
31 NewLabelChangeOperation(rene, unix, []Label{"added"}, []Label{"removed"}),
32 }
33
34 for _, op := range good {
35 if err := op.Validate(); err != nil {
36 t.Fatal(err)
37 }
38 }
39
40 bad := []Operation{
41 // opbase
42 NewSetStatusOp(makeIdentity(t, "", "rene@descartes.fr"), unix, ClosedStatus),
43 NewSetStatusOp(makeIdentity(t, "René Descartes\u001b", "rene@descartes.fr"), unix, ClosedStatus),
44 NewSetStatusOp(makeIdentity(t, "René Descartes", "rene@descartes.fr\u001b"), unix, ClosedStatus),
45 NewSetStatusOp(makeIdentity(t, "René \nDescartes", "rene@descartes.fr"), unix, ClosedStatus),
46 NewSetStatusOp(makeIdentity(t, "René Descartes", "rene@\ndescartes.fr"), unix, ClosedStatus),
47 &CreateOperation{OpBase: OpBase{
48 Author_: rene,
49 UnixTime: 0,
50 OperationType: CreateOp,
51 },
52 Title: "title",
53 Message: "message",
54 },
55
56 NewCreateOp(rene, unix, "multi\nline", "message", nil),
57 NewCreateOp(rene, unix, "title", "message", []repository.Hash{repository.Hash("invalid")}),
58 NewCreateOp(rene, unix, "title\u001b", "message", nil),
59 NewCreateOp(rene, unix, "title", "message\u001b", nil),
60 NewSetTitleOp(rene, unix, "multi\nline", "title1"),
61 NewSetTitleOp(rene, unix, "title", "multi\nline"),
62 NewSetTitleOp(rene, unix, "title\u001b", "title2"),
63 NewSetTitleOp(rene, unix, "title", "title2\u001b"),
64 NewAddCommentOp(rene, unix, "message\u001b", nil),
65 NewAddCommentOp(rene, unix, "message", []repository.Hash{repository.Hash("invalid")}),
66 NewSetStatusOp(rene, unix, 1000),
67 NewSetStatusOp(rene, unix, 0),
68 NewLabelChangeOperation(rene, unix, []Label{}, []Label{}),
69 NewLabelChangeOperation(rene, unix, []Label{"multi\nline"}, []Label{}),
70 }
71
72 for i, op := range bad {
73 if err := op.Validate(); err == nil {
74 t.Fatal("validation should have failed", i, op)
75 }
76 }
77}
78
79func TestMetadata(t *testing.T) {
80 repo := repository.NewMockRepoClock()
81
82 rene, err := identity.NewIdentity(repo, "René Descartes", "rene@descartes.fr")
83 require.NoError(t, err)
84
85 op := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
86
87 op.SetMetadata("key", "value")
88
89 val, ok := op.GetMetadata("key")
90 require.True(t, ok)
91 require.Equal(t, val, "value")
92}
93
94func TestID(t *testing.T) {
95 repo := repository.CreateGoGitTestRepo(false)
96 defer repository.CleanupTestRepos(repo)
97
98 repos := []repository.ClockedRepo{
99 repository.NewMockRepo(),
100 repo,
101 }
102
103 for _, repo := range repos {
104 rene, err := identity.NewIdentity(repo, "René Descartes", "rene@descartes.fr")
105 require.NoError(t, err)
106 err = rene.Commit(repo)
107 require.NoError(t, err)
108
109 b, op, err := Create(rene, time.Now().Unix(), "title", "message")
110 require.NoError(t, err)
111
112 id1 := op.Id()
113 require.NoError(t, id1.Validate())
114
115 err = b.Commit(repo)
116 require.NoError(t, err)
117
118 op2 := b.FirstOp()
119
120 id2 := op2.Id()
121 require.NoError(t, id2.Validate())
122 require.Equal(t, id1, id2)
123
124 b2, err := Read(repo, b.Id())
125 require.NoError(t, err)
126
127 op3 := b2.FirstOp()
128
129 id3 := op3.Id()
130 require.NoError(t, id3.Validate())
131 require.Equal(t, id1, id3)
132 }
133}