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