1package bug
2
3import (
4 "encoding/json"
5 "testing"
6 "time"
7
8 "github.com/MichaelMure/git-bug/identity"
9 "github.com/MichaelMure/git-bug/repository"
10
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13)
14
15func TestSetMetadata(t *testing.T) {
16 snapshot := Snapshot{}
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 unix := time.Now().Unix()
24
25 create := NewCreateOp(rene, unix, "title", "create", nil)
26 create.SetMetadata("key", "value")
27 create.Apply(&snapshot)
28 snapshot.Operations = append(snapshot.Operations, create)
29
30 id1 := create.Id()
31 require.NoError(t, id1.Validate())
32
33 comment := NewAddCommentOp(rene, unix, "comment", nil)
34 comment.SetMetadata("key2", "value2")
35 comment.Apply(&snapshot)
36 snapshot.Operations = append(snapshot.Operations, comment)
37
38 id2 := comment.Id()
39 require.NoError(t, id2.Validate())
40
41 op1 := NewSetMetadataOp(rene, unix, id1, map[string]string{
42 "key": "override",
43 "key2": "value",
44 })
45
46 op1.Apply(&snapshot)
47 snapshot.Operations = append(snapshot.Operations, op1)
48
49 createMetadata := snapshot.Operations[0].AllMetadata()
50 assert.Equal(t, len(createMetadata), 2)
51 // original key is not overrided
52 assert.Equal(t, createMetadata["key"], "value")
53 // new key is set
54 assert.Equal(t, createMetadata["key2"], "value")
55
56 commentMetadata := snapshot.Operations[1].AllMetadata()
57 assert.Equal(t, len(commentMetadata), 1)
58 assert.Equal(t, commentMetadata["key2"], "value2")
59
60 op2 := NewSetMetadataOp(rene, unix, id2, map[string]string{
61 "key2": "value",
62 "key3": "value3",
63 })
64
65 op2.Apply(&snapshot)
66 snapshot.Operations = append(snapshot.Operations, op2)
67
68 createMetadata = snapshot.Operations[0].AllMetadata()
69 assert.Equal(t, len(createMetadata), 2)
70 assert.Equal(t, createMetadata["key"], "value")
71 assert.Equal(t, createMetadata["key2"], "value")
72
73 commentMetadata = snapshot.Operations[1].AllMetadata()
74 assert.Equal(t, len(commentMetadata), 2)
75 // original key is not overrided
76 assert.Equal(t, commentMetadata["key2"], "value2")
77 // new key is set
78 assert.Equal(t, commentMetadata["key3"], "value3")
79
80 op3 := NewSetMetadataOp(rene, unix, id1, map[string]string{
81 "key": "override",
82 "key2": "override",
83 })
84
85 op3.Apply(&snapshot)
86 snapshot.Operations = append(snapshot.Operations, op3)
87
88 createMetadata = snapshot.Operations[0].AllMetadata()
89 assert.Equal(t, len(createMetadata), 2)
90 // original key is not overrided
91 assert.Equal(t, createMetadata["key"], "value")
92 // previously set key is not overrided
93 assert.Equal(t, createMetadata["key2"], "value")
94
95 commentMetadata = snapshot.Operations[1].AllMetadata()
96 assert.Equal(t, len(commentMetadata), 2)
97 assert.Equal(t, commentMetadata["key2"], "value2")
98 assert.Equal(t, commentMetadata["key3"], "value3")
99}
100
101func TestSetMetadataSerialize(t *testing.T) {
102 repo := repository.NewMockRepoForTest()
103 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
104 err := rene.Commit(repo)
105 require.NoError(t, err)
106
107 unix := time.Now().Unix()
108 before := NewSetMetadataOp(rene, unix, "message", map[string]string{
109 "key1": "value1",
110 "key2": "value2",
111 })
112
113 data, err := json.Marshal(before)
114 assert.NoError(t, err)
115
116 var after SetMetadataOperation
117 err = json.Unmarshal(data, &after)
118 assert.NoError(t, err)
119
120 // enforce creating the ID
121 before.Id()
122
123 // Replace the identity stub with the real thing
124 assert.Equal(t, rene.Id(), after.base().Author.Id())
125 after.Author = rene
126
127 assert.Equal(t, before, &after)
128}