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}