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