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