aboutsummaryrefslogtreecommitdiffstats
path: root/identity/identity_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'identity/identity_test.go')
-rw-r--r--identity/identity_test.go244
1 files changed, 244 insertions, 0 deletions
diff --git a/identity/identity_test.go b/identity/identity_test.go
new file mode 100644
index 00000000..2ddb64ea
--- /dev/null
+++ b/identity/identity_test.go
@@ -0,0 +1,244 @@
+package identity
+
+import (
+ "encoding/json"
+ "testing"
+
+ "github.com/MichaelMure/git-bug/repository"
+ "github.com/stretchr/testify/assert"
+)
+
+// Test the commit and load of an Identity with multiple versions
+func TestIdentityCommitLoad(t *testing.T) {
+ mockRepo := repository.NewMockRepoForTest()
+
+ // single version
+
+ identity := &Identity{
+ versions: []*Version{
+ {
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ },
+ },
+ }
+
+ err := identity.Commit(mockRepo)
+
+ assert.Nil(t, err)
+ assert.NotEmpty(t, identity.id)
+
+ loaded, err := ReadLocal(mockRepo, identity.id)
+ assert.Nil(t, err)
+ commitsAreSet(t, loaded)
+ assert.Equal(t, identity, loaded)
+
+ // multiple version
+
+ identity = &Identity{
+ versions: []*Version{
+ {
+ time: 100,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyA"},
+ },
+ },
+ {
+ time: 200,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyB"},
+ },
+ },
+ {
+ time: 201,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyC"},
+ },
+ },
+ },
+ }
+
+ err = identity.Commit(mockRepo)
+
+ assert.Nil(t, err)
+ assert.NotEmpty(t, identity.id)
+
+ loaded, err = ReadLocal(mockRepo, identity.id)
+ assert.Nil(t, err)
+ commitsAreSet(t, loaded)
+ assert.Equal(t, identity, loaded)
+
+ // add more version
+
+ identity.AddVersion(&Version{
+ time: 201,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyD"},
+ },
+ })
+
+ identity.AddVersion(&Version{
+ time: 300,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyE"},
+ },
+ })
+
+ err = identity.Commit(mockRepo)
+
+ assert.Nil(t, err)
+ assert.NotEmpty(t, identity.id)
+
+ loaded, err = ReadLocal(mockRepo, identity.id)
+ assert.Nil(t, err)
+ commitsAreSet(t, loaded)
+ assert.Equal(t, identity, loaded)
+}
+
+func commitsAreSet(t *testing.T, identity *Identity) {
+ for _, version := range identity.versions {
+ assert.NotEmpty(t, version.commitHash)
+ }
+}
+
+// Test that the correct crypto keys are returned for a given lamport time
+func TestIdentity_ValidKeysAtTime(t *testing.T) {
+ identity := Identity{
+ versions: []*Version{
+ {
+ time: 100,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyA"},
+ },
+ },
+ {
+ time: 200,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyB"},
+ },
+ },
+ {
+ time: 201,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyC"},
+ },
+ },
+ {
+ time: 201,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyD"},
+ },
+ },
+ {
+ time: 300,
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ keys: []Key{
+ {PubKey: "pubkeyE"},
+ },
+ },
+ },
+ }
+
+ assert.Nil(t, identity.ValidKeysAtTime(10))
+ assert.Equal(t, identity.ValidKeysAtTime(100), []Key{{PubKey: "pubkeyA"}})
+ assert.Equal(t, identity.ValidKeysAtTime(140), []Key{{PubKey: "pubkeyA"}})
+ assert.Equal(t, identity.ValidKeysAtTime(200), []Key{{PubKey: "pubkeyB"}})
+ assert.Equal(t, identity.ValidKeysAtTime(201), []Key{{PubKey: "pubkeyD"}})
+ assert.Equal(t, identity.ValidKeysAtTime(202), []Key{{PubKey: "pubkeyD"}})
+ assert.Equal(t, identity.ValidKeysAtTime(300), []Key{{PubKey: "pubkeyE"}})
+ assert.Equal(t, identity.ValidKeysAtTime(3000), []Key{{PubKey: "pubkeyE"}})
+}
+
+// Test the immutable or mutable metadata search
+func TestMetadata(t *testing.T) {
+ mockRepo := repository.NewMockRepoForTest()
+
+ identity := NewIdentity("René Descartes", "rene.descartes@example.com")
+
+ identity.SetMetadata("key1", "value1")
+ assertHasKeyValue(t, identity.ImmutableMetadata(), "key1", "value1")
+ assertHasKeyValue(t, identity.MutableMetadata(), "key1", "value1")
+
+ err := identity.Commit(mockRepo)
+ assert.NoError(t, err)
+
+ assertHasKeyValue(t, identity.ImmutableMetadata(), "key1", "value1")
+ assertHasKeyValue(t, identity.MutableMetadata(), "key1", "value1")
+
+ // try override
+ identity.AddVersion(&Version{
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ })
+
+ identity.SetMetadata("key1", "value2")
+ assertHasKeyValue(t, identity.ImmutableMetadata(), "key1", "value1")
+ assertHasKeyValue(t, identity.MutableMetadata(), "key1", "value2")
+
+ err = identity.Commit(mockRepo)
+ assert.NoError(t, err)
+
+ // reload
+ loaded, err := ReadLocal(mockRepo, identity.id)
+ assert.Nil(t, err)
+
+ assertHasKeyValue(t, loaded.ImmutableMetadata(), "key1", "value1")
+ assertHasKeyValue(t, loaded.MutableMetadata(), "key1", "value2")
+}
+
+func assertHasKeyValue(t *testing.T, metadata map[string]string, key, value string) {
+ val, ok := metadata[key]
+ assert.True(t, ok)
+ assert.Equal(t, val, value)
+}
+
+func TestJSON(t *testing.T) {
+ mockRepo := repository.NewMockRepoForTest()
+
+ identity := &Identity{
+ versions: []*Version{
+ {
+ name: "René Descartes",
+ email: "rene.descartes@example.com",
+ },
+ },
+ }
+
+ // commit to make sure we have an ID
+ err := identity.Commit(mockRepo)
+ assert.Nil(t, err)
+ assert.NotEmpty(t, identity.id)
+
+ // serialize
+ data, err := json.Marshal(identity)
+ assert.NoError(t, err)
+
+ // deserialize, got a IdentityStub with the same id
+ var i Interface
+ i, err = UnmarshalJSON(data)
+ assert.NoError(t, err)
+ assert.Equal(t, identity.id, i.Id())
+
+ // make sure we can load the identity properly
+ i, err = ReadLocal(mockRepo, i.Id())
+ assert.NoError(t, err)
+}