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