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)
15
16func makeIdentityTestRepo(t *testing.T) repository.ClockedRepo {
17 repo := repository.NewMockRepo()
18
19 clock1, err := repo.GetOrCreateClock("foo")
20 require.NoError(t, err)
21 err = clock1.Witness(42)
22 require.NoError(t, err)
23
24 clock2, err := repo.GetOrCreateClock("bar")
25 require.NoError(t, err)
26 err = clock2.Witness(34)
27 require.NoError(t, err)
28
29 return repo
30}
31
32func TestVersionJSON(t *testing.T) {
33 repo := makeIdentityTestRepo(t)
34
35 testIdentity := &mockIdentity{
36 name: "name",
37 email: "email",
38 login: "login",
39 }
40
41 keys := []*Key{
42 generatePublicKey(testIdentity),
43 generatePublicKey(testIdentity),
44 }
45
46 before, err := newVersion(repo, "name", "email", "login", "avatarUrl", keys)
47 require.NoError(t, err)
48
49 before.SetMetadata("key1", "value1")
50 before.SetMetadata("key2", "value2")
51
52 expected := &version{
53 id: entity.UnsetId,
54 name: "name",
55 email: "email",
56 login: "login",
57 avatarURL: "avatarUrl",
58 unixTime: time.Now().Unix(),
59 times: map[string]lamport.Time{
60 "foo": 42,
61 "bar": 34,
62 },
63 keys: keys,
64 nonce: before.nonce,
65 metadata: map[string]string{
66 "key1": "value1",
67 "key2": "value2",
68 },
69 }
70
71 require.Equal(t, expected, before)
72
73 data, err := json.Marshal(before)
74 assert.NoError(t, err)
75
76 var after version
77 err = json.Unmarshal(data, &after)
78 assert.NoError(t, err)
79
80 // make sure we now have an Id
81 expected.Id()
82
83 // Compare versions without Key objects since entities may differ in internal structure after deserialization
84 assert.Equal(t, expected.name, after.name)
85 assert.Equal(t, expected.email, after.email)
86 assert.Equal(t, expected.login, after.login)
87 assert.Equal(t, expected.avatarURL, after.avatarURL)
88 assert.Equal(t, expected.unixTime, after.unixTime)
89 assert.Equal(t, expected.times, after.times)
90 assert.Equal(t, expected.metadata, after.metadata)
91 assert.Equal(t, expected.id, after.id)
92 assert.Equal(t, expected.commitHash, after.commitHash)
93 assert.Equal(t, len(expected.keys), len(after.keys))
94 for i, key := range expected.keys {
95 assert.Equal(t, key.public.Fingerprint[:], after.keys[i].public.Fingerprint[:])
96 }
97}