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