1package bug
2
3import (
4 "encoding/json"
5 "testing"
6 "time"
7
8 "github.com/stretchr/testify/require"
9
10 "github.com/MichaelMure/git-bug/identity"
11 "github.com/MichaelMure/git-bug/repository"
12)
13
14func TestOperationPackSerialize(t *testing.T) {
15 opp := &OperationPack{}
16
17 repo := repository.NewMockRepo()
18
19 rene, err := identity.NewIdentity(repo, "René Descartes", "rene@descartes.fr")
20 require.NoError(t, err)
21
22 createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
23 setTitleOp := NewSetTitleOp(rene, time.Now().Unix(), "title2", "title1")
24 addCommentOp := NewAddCommentOp(rene, time.Now().Unix(), "message2", nil)
25 setStatusOp := NewSetStatusOp(rene, time.Now().Unix(), ClosedStatus)
26 labelChangeOp := NewLabelChangeOperation(rene, time.Now().Unix(), []Label{"added"}, []Label{"removed"})
27
28 opp.Append(createOp)
29 opp.Append(setTitleOp)
30 opp.Append(addCommentOp)
31 opp.Append(setStatusOp)
32 opp.Append(labelChangeOp)
33
34 opMeta := NewSetTitleOp(rene, time.Now().Unix(), "title3", "title2")
35 opMeta.SetMetadata("key", "value")
36 opp.Append(opMeta)
37
38 require.Equal(t, 1, len(opMeta.Metadata))
39
40 opFile := NewAddCommentOp(rene, time.Now().Unix(), "message", []repository.Hash{
41 "abcdef",
42 "ghijkl",
43 })
44 opp.Append(opFile)
45
46 require.Equal(t, 2, len(opFile.Files))
47
48 data, err := json.Marshal(opp)
49 require.NoError(t, err)
50
51 var opp2 *OperationPack
52 err = json.Unmarshal(data, &opp2)
53 require.NoError(t, err)
54
55 ensureIds(opp)
56 ensureAuthors(t, opp, opp2)
57
58 require.Equal(t, opp, opp2)
59}
60
61func ensureIds(opp *OperationPack) {
62 for _, op := range opp.Operations {
63 op.Id()
64 }
65}
66
67func ensureAuthors(t *testing.T, opp1 *OperationPack, opp2 *OperationPack) {
68 require.Equal(t, len(opp1.Operations), len(opp2.Operations))
69 for i := 0; i < len(opp1.Operations); i++ {
70 op1 := opp1.Operations[i]
71 op2 := opp2.Operations[i]
72
73 // ensure we have equivalent authors (IdentityStub vs Identity) then
74 // enforce equality
75 require.Equal(t, op1.base().Author.Id(), op2.base().Author.Id())
76 op1.base().Author = op2.base().Author
77 }
78}