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}