1package bug
  2
  3import (
  4	"encoding/json"
  5	"testing"
  6	"time"
  7
  8	"github.com/MichaelMure/git-bug/identity"
  9	"github.com/stretchr/testify/assert"
 10	"github.com/stretchr/testify/require"
 11)
 12
 13func TestSetMetadata(t *testing.T) {
 14	snapshot := Snapshot{}
 15
 16	rene := identity.NewBare("René Descartes", "rene@descartes.fr")
 17	unix := time.Now().Unix()
 18
 19	create := NewCreateOp(rene, unix, "title", "create", nil)
 20	create.SetMetadata("key", "value")
 21	create.Apply(&snapshot)
 22	snapshot.Operations = append(snapshot.Operations, create)
 23
 24	id1 := create.Id()
 25	require.NoError(t, id1.Validate())
 26
 27	comment := NewAddCommentOp(rene, unix, "comment", nil)
 28	comment.SetMetadata("key2", "value2")
 29	comment.Apply(&snapshot)
 30	snapshot.Operations = append(snapshot.Operations, comment)
 31
 32	id2 := comment.Id()
 33	require.NoError(t, id2.Validate())
 34
 35	op1 := NewSetMetadataOp(rene, unix, id1, map[string]string{
 36		"key":  "override",
 37		"key2": "value",
 38	})
 39
 40	op1.Apply(&snapshot)
 41	snapshot.Operations = append(snapshot.Operations, op1)
 42
 43	createMetadata := snapshot.Operations[0].AllMetadata()
 44	assert.Equal(t, len(createMetadata), 2)
 45	// original key is not overrided
 46	assert.Equal(t, createMetadata["key"], "value")
 47	// new key is set
 48	assert.Equal(t, createMetadata["key2"], "value")
 49
 50	commentMetadata := snapshot.Operations[1].AllMetadata()
 51	assert.Equal(t, len(commentMetadata), 1)
 52	assert.Equal(t, commentMetadata["key2"], "value2")
 53
 54	op2 := NewSetMetadataOp(rene, unix, id2, map[string]string{
 55		"key2": "value",
 56		"key3": "value3",
 57	})
 58
 59	op2.Apply(&snapshot)
 60	snapshot.Operations = append(snapshot.Operations, op2)
 61
 62	createMetadata = snapshot.Operations[0].AllMetadata()
 63	assert.Equal(t, len(createMetadata), 2)
 64	assert.Equal(t, createMetadata["key"], "value")
 65	assert.Equal(t, createMetadata["key2"], "value")
 66
 67	commentMetadata = snapshot.Operations[1].AllMetadata()
 68	assert.Equal(t, len(commentMetadata), 2)
 69	// original key is not overrided
 70	assert.Equal(t, commentMetadata["key2"], "value2")
 71	// new key is set
 72	assert.Equal(t, commentMetadata["key3"], "value3")
 73
 74	op3 := NewSetMetadataOp(rene, unix, id1, map[string]string{
 75		"key":  "override",
 76		"key2": "override",
 77	})
 78
 79	op3.Apply(&snapshot)
 80	snapshot.Operations = append(snapshot.Operations, op3)
 81
 82	createMetadata = snapshot.Operations[0].AllMetadata()
 83	assert.Equal(t, len(createMetadata), 2)
 84	// original key is not overrided
 85	assert.Equal(t, createMetadata["key"], "value")
 86	// previously set key is not overrided
 87	assert.Equal(t, createMetadata["key2"], "value")
 88
 89	commentMetadata = snapshot.Operations[1].AllMetadata()
 90	assert.Equal(t, len(commentMetadata), 2)
 91	assert.Equal(t, commentMetadata["key2"], "value2")
 92	assert.Equal(t, commentMetadata["key3"], "value3")
 93}
 94
 95func TestSetMetadataSerialize(t *testing.T) {
 96	var rene = identity.NewBare("René Descartes", "rene@descartes.fr")
 97	unix := time.Now().Unix()
 98	before := NewSetMetadataOp(rene, unix, "message", map[string]string{
 99		"key1": "value1",
100		"key2": "value2",
101	})
102
103	data, err := json.Marshal(before)
104	assert.NoError(t, err)
105
106	var after SetMetadataOperation
107	err = json.Unmarshal(data, &after)
108	assert.NoError(t, err)
109
110	// enforce creating the IDs
111	before.Id()
112	rene.Id()
113
114	assert.Equal(t, before, &after)
115}