operation_pack_test.go

 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}