1package bug
2
3import (
4 "testing"
5 "time"
6
7 "github.com/stretchr/testify/require"
8
9 "github.com/git-bug/git-bug/entities/common"
10 "github.com/git-bug/git-bug/entities/identity"
11 "github.com/git-bug/git-bug/entity/dag"
12 "github.com/git-bug/git-bug/repository"
13)
14
15// TODO: move to entity/dag?
16
17func TestValidate(t *testing.T) {
18 repo := repository.NewMockRepoClock()
19
20 makeIdentity := func(t *testing.T, name, email string) *identity.Identity {
21 i, err := identity.NewIdentity(repo, name, email)
22 require.NoError(t, err)
23 return i
24 }
25
26 rene := makeIdentity(t, "René Descartes", "rene@descartes.fr")
27
28 unix := time.Now().Unix()
29
30 good := []Operation{
31 NewCreateOp(rene, unix, "title", "message", nil),
32 NewSetTitleOp(rene, unix, "title2", "title1"),
33 NewAddCommentOp(rene, unix, "message2", nil),
34 NewSetStatusOp(rene, unix, common.ClosedStatus),
35 NewLabelChangeOperation(rene, unix, []Label{"added"}, []Label{"removed"}),
36 }
37
38 for _, op := range good {
39 if err := op.Validate(); err != nil {
40 t.Fatal(err)
41 }
42 }
43
44 bad := []Operation{
45 // opbase
46 NewSetStatusOp(makeIdentity(t, "", "rene@descartes.fr"), unix, common.ClosedStatus),
47 NewSetStatusOp(makeIdentity(t, "René Descartes\u001b", "rene@descartes.fr"), unix, common.ClosedStatus),
48 NewSetStatusOp(makeIdentity(t, "René Descartes", "rene@descartes.fr\u001b"), unix, common.ClosedStatus),
49 NewSetStatusOp(makeIdentity(t, "René \nDescartes", "rene@descartes.fr"), unix, common.ClosedStatus),
50 NewSetStatusOp(makeIdentity(t, "René Descartes", "rene@\ndescartes.fr"), unix, common.ClosedStatus),
51 &CreateOperation{OpBase: dag.NewOpBase(CreateOp, rene, 0),
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(t, false)
96
97 repos := []repository.ClockedRepo{
98 repository.NewMockRepo(),
99 repo,
100 }
101
102 for _, repo := range repos {
103 rene, err := identity.NewIdentity(repo, "René Descartes", "rene@descartes.fr")
104 require.NoError(t, err)
105 err = rene.Commit(repo)
106 require.NoError(t, err)
107
108 b, op, err := Create(rene, time.Now().Unix(), "title", "message", nil, nil)
109 require.NoError(t, err)
110
111 id1 := op.Id()
112 require.NoError(t, id1.Validate())
113
114 err = b.Commit(repo)
115 require.NoError(t, err)
116
117 op2 := b.FirstOp()
118
119 id2 := op2.Id()
120 require.NoError(t, id2.Validate())
121 require.Equal(t, id1, id2)
122
123 b2, err := Read(repo, b.Id())
124 require.NoError(t, err)
125
126 op3 := b2.FirstOp()
127
128 id3 := op3.Id()
129 require.NoError(t, id3.Validate())
130 require.Equal(t, id1, id3)
131 }
132}