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