1package dag
2
3import (
4 "encoding/json"
5 "testing"
6 "time"
7
8 "github.com/git-bug/git-bug/entities/identity"
9 "github.com/git-bug/git-bug/entity"
10 "github.com/git-bug/git-bug/repository"
11
12 "github.com/stretchr/testify/require"
13)
14
15var _ Snapshot = &snapshotMock{}
16
17type snapshotMock struct {
18 ops []Operation
19}
20
21func (s *snapshotMock) AllOperations() []Operation {
22 return s.ops
23}
24
25func (s *snapshotMock) AppendOperation(op Operation) {
26 s.ops = append(s.ops, op)
27}
28
29func TestSetMetadata(t *testing.T) {
30 snap := &snapshotMock{}
31
32 repo := repository.NewMockRepo()
33
34 rene, err := identity.NewIdentity(repo, "René Descartes", "rene@descartes.fr")
35 require.NoError(t, err)
36
37 unix := time.Now().Unix()
38
39 target1 := NewNoOpOp[*snapshotMock](1, rene, unix)
40 target1.SetMetadata("key", "value")
41 snap.ops = append(snap.ops, target1)
42
43 target2 := NewNoOpOp[*snapshotMock](1, rene, unix)
44 target2.SetMetadata("key2", "value2")
45 snap.ops = append(snap.ops, target2)
46
47 op1 := NewSetMetadataOp[*snapshotMock](2, rene, unix, target1.Id(), map[string]string{
48 "key": "override",
49 "key2": "value",
50 })
51
52 op1.Apply(snap)
53 snap.ops = append(snap.ops, op1)
54
55 target1Metadata := snap.AllOperations()[0].AllMetadata()
56 require.Len(t, target1Metadata, 2)
57 // original key is not overridden
58 require.Equal(t, target1Metadata["key"], "value")
59 // new key is set
60 require.Equal(t, target1Metadata["key2"], "value")
61
62 target2Metadata := snap.AllOperations()[1].AllMetadata()
63 require.Len(t, target2Metadata, 1)
64 require.Equal(t, target2Metadata["key2"], "value2")
65
66 op2 := NewSetMetadataOp[*snapshotMock](2, rene, unix, target2.Id(), map[string]string{
67 "key2": "value",
68 "key3": "value3",
69 })
70
71 op2.Apply(snap)
72 snap.ops = append(snap.ops, op2)
73
74 target1Metadata = snap.AllOperations()[0].AllMetadata()
75 require.Len(t, target1Metadata, 2)
76 require.Equal(t, target1Metadata["key"], "value")
77 require.Equal(t, target1Metadata["key2"], "value")
78
79 target2Metadata = snap.AllOperations()[1].AllMetadata()
80 require.Len(t, target2Metadata, 2)
81 // original key is not overridden
82 require.Equal(t, target2Metadata["key2"], "value2")
83 // new key is set
84 require.Equal(t, target2Metadata["key3"], "value3")
85
86 op3 := NewSetMetadataOp[*snapshotMock](2, rene, unix, target1.Id(), map[string]string{
87 "key": "override",
88 "key2": "override",
89 })
90
91 op3.Apply(snap)
92 snap.ops = append(snap.ops, op3)
93
94 target1Metadata = snap.AllOperations()[0].AllMetadata()
95 require.Len(t, target1Metadata, 2)
96 // original key is not overridden
97 require.Equal(t, target1Metadata["key"], "value")
98 // previously set key is not overridden
99 require.Equal(t, target1Metadata["key2"], "value")
100
101 target2Metadata = snap.AllOperations()[1].AllMetadata()
102 require.Len(t, target2Metadata, 2)
103 require.Equal(t, target2Metadata["key2"], "value2")
104 require.Equal(t, target2Metadata["key3"], "value3")
105}
106
107func TestSetMetadataSerialize(t *testing.T) {
108 SerializeRoundTripTest(t, func(raw json.RawMessage, resolver entity.Resolvers) (Operation, error) {
109 var op SetMetadataOperation[*snapshotMock]
110 err := json.Unmarshal(raw, &op)
111 return &op, err
112 }, func(author identity.Interface, unixTime int64) (*SetMetadataOperation[*snapshotMock], entity.Resolvers) {
113 return NewSetMetadataOp[*snapshotMock](1, author, unixTime, "message", map[string]string{
114 "key1": "value1",
115 "key2": "value2",
116 }), nil
117 })
118}