version_test.go

  1package identity
  2
  3import (
  4	"encoding/json"
  5	"testing"
  6	"time"
  7
  8	"github.com/stretchr/testify/assert"
  9	"github.com/stretchr/testify/require"
 10
 11	"github.com/git-bug/git-bug/entity"
 12	"github.com/git-bug/git-bug/repository"
 13	"github.com/git-bug/git-bug/util/lamport"
 14	"github.com/git-bug/git-bug/util/timestamp"
 15)
 16
 17type testVersionMockIdentity struct {
 18	name  string
 19	login string
 20	email string
 21}
 22
 23func (m *testVersionMockIdentity) Name() string {
 24	return m.name
 25}
 26
 27func (m *testVersionMockIdentity) Login() string {
 28	return m.login
 29}
 30
 31func (m *testVersionMockIdentity) Email() string {
 32	return m.email
 33}
 34
 35func (m *testVersionMockIdentity) DisplayName() string {
 36	return m.name
 37}
 38
 39func (m *testVersionMockIdentity) AvatarUrl() string {
 40	return ""
 41}
 42
 43func (m *testVersionMockIdentity) Keys() []*Key {
 44	return nil
 45}
 46
 47func (m *testVersionMockIdentity) SigningKey(repo repository.RepoKeyring) (*Key, error) {
 48	return nil, nil
 49}
 50
 51func (m *testVersionMockIdentity) ValidKeysAtTime(clockName string, time lamport.Time) []*Key {
 52	return nil
 53}
 54
 55func (m *testVersionMockIdentity) LastModification() timestamp.Timestamp {
 56	return 0
 57}
 58
 59func (m *testVersionMockIdentity) LastModificationLamports() map[string]lamport.Time {
 60	return nil
 61}
 62
 63func (m *testVersionMockIdentity) IsProtected() bool {
 64	return false
 65}
 66
 67func (m *testVersionMockIdentity) Validate() error {
 68	return nil
 69}
 70
 71func (m *testVersionMockIdentity) NeedCommit() bool {
 72	return false
 73}
 74
 75func (m *testVersionMockIdentity) Id() entity.Id {
 76	return ""
 77}
 78
 79func makeIdentityTestRepo(t *testing.T) repository.ClockedRepo {
 80	repo := repository.NewMockRepo()
 81
 82	clock1, err := repo.GetOrCreateClock("foo")
 83	require.NoError(t, err)
 84	err = clock1.Witness(42)
 85	require.NoError(t, err)
 86
 87	clock2, err := repo.GetOrCreateClock("bar")
 88	require.NoError(t, err)
 89	err = clock2.Witness(34)
 90	require.NoError(t, err)
 91
 92	return repo
 93}
 94
 95func TestVersionJSON(t *testing.T) {
 96	repo := makeIdentityTestRepo(t)
 97
 98	testIdentity := &testVersionMockIdentity{name: "name", email: "email", login: "login"}
 99	keys := []*Key{
100		generatePublicKey(testIdentity),
101		generatePublicKey(testIdentity),
102	}
103
104	before, err := newVersion(repo, "name", "email", "login", "avatarUrl", keys)
105	require.NoError(t, err)
106
107	before.SetMetadata("key1", "value1")
108	before.SetMetadata("key2", "value2")
109
110	expected := &version{
111		id:        entity.UnsetId,
112		name:      "name",
113		email:     "email",
114		login:     "login",
115		avatarURL: "avatarUrl",
116		unixTime:  time.Now().Unix(),
117		times: map[string]lamport.Time{
118			"foo": 42,
119			"bar": 34,
120		},
121		keys:  keys,
122		nonce: before.nonce,
123		metadata: map[string]string{
124			"key1": "value1",
125			"key2": "value2",
126		},
127	}
128
129	require.Equal(t, expected, before)
130
131	data, err := json.Marshal(before)
132	assert.NoError(t, err)
133
134	var after version
135	err = json.Unmarshal(data, &after)
136	assert.NoError(t, err)
137
138	// make sure we now have an Id
139	expected.Id()
140
141	// Compare versions without Key objects since entities may differ in internal structure after deserialization
142	assert.Equal(t, expected.name, after.name)
143	assert.Equal(t, expected.email, after.email)
144	assert.Equal(t, expected.login, after.login)
145	assert.Equal(t, expected.avatarURL, after.avatarURL)
146	assert.Equal(t, expected.unixTime, after.unixTime)
147	assert.Equal(t, expected.times, after.times)
148	assert.Equal(t, expected.metadata, after.metadata)
149	assert.Equal(t, expected.id, after.id)
150	assert.Equal(t, expected.commitHash, after.commitHash)
151	assert.Equal(t, len(expected.keys), len(after.keys))
152	for i, key := range expected.keys {
153		assert.Equal(t, key.public.Fingerprint[:], after.keys[i].public.Fingerprint[:])
154	}
155}