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