credential_test.go

  1package auth
  2
  3import (
  4	"testing"
  5
  6	"github.com/stretchr/testify/assert"
  7	"github.com/stretchr/testify/require"
  8
  9	"github.com/git-bug/git-bug/entity"
 10	"github.com/git-bug/git-bug/repository"
 11)
 12
 13func TestCredential(t *testing.T) {
 14	repo := repository.NewMockRepo()
 15
 16	storeToken := func(val string, target string) *Token {
 17		token := NewToken(target, val)
 18		err := Store(repo, token)
 19		require.NoError(t, err)
 20		return token
 21	}
 22
 23	token := storeToken("foobar", "github")
 24
 25	// Store + Load
 26	err := Store(repo, token)
 27	assert.NoError(t, err)
 28
 29	token2, err := LoadWithId(repo, token.ID())
 30	assert.NoError(t, err)
 31	assert.Equal(t, token.createTime.Unix(), token2.CreateTime().Unix())
 32	token.createTime = token2.CreateTime()
 33	assert.Equal(t, token, token2)
 34
 35	prefix := string(token.ID())[:10]
 36
 37	// LoadWithPrefix
 38	token3, err := LoadWithPrefix(repo, prefix)
 39	assert.NoError(t, err)
 40	assert.Equal(t, token.createTime.Unix(), token3.CreateTime().Unix())
 41	token.createTime = token3.CreateTime()
 42	assert.Equal(t, token, token3)
 43
 44	token4 := storeToken("foo", "gitlab")
 45	token5 := storeToken("bar", "github")
 46
 47	// List + options
 48	creds, err := List(repo, WithTarget("github"))
 49	assert.NoError(t, err)
 50	sameIds(t, creds, []Credential{token, token5})
 51
 52	creds, err = List(repo, WithTarget("gitlab"))
 53	assert.NoError(t, err)
 54	sameIds(t, creds, []Credential{token4})
 55
 56	creds, err = List(repo, WithKind(KindToken))
 57	assert.NoError(t, err)
 58	sameIds(t, creds, []Credential{token, token4, token5})
 59
 60	creds, err = List(repo, WithKind(KindLoginPassword))
 61	assert.NoError(t, err)
 62	sameIds(t, creds, []Credential{})
 63
 64	// Metadata
 65
 66	token4.SetMetadata("key", "value")
 67	err = Store(repo, token4)
 68	assert.NoError(t, err)
 69
 70	creds, err = List(repo, WithMeta("key", "value"))
 71	assert.NoError(t, err)
 72	sameIds(t, creds, []Credential{token4})
 73
 74	// Exist
 75	exist := IdExist(repo, token.ID())
 76	assert.True(t, exist)
 77
 78	exist = PrefixExist(repo, prefix)
 79	assert.True(t, exist)
 80
 81	// Remove
 82	err = Remove(repo, token.ID())
 83	assert.NoError(t, err)
 84
 85	creds, err = List(repo)
 86	assert.NoError(t, err)
 87	sameIds(t, creds, []Credential{token4, token5})
 88}
 89
 90func sameIds(t *testing.T, a []Credential, b []Credential) {
 91	t.Helper()
 92
 93	ids := func(creds []Credential) []entity.Id {
 94		result := make([]entity.Id, len(creds))
 95		for i, cred := range creds {
 96			result[i] = cred.ID()
 97		}
 98		return result
 99	}
100
101	assert.ElementsMatch(t, ids(a), ids(b))
102}
103
104func testCredentialSerial(t *testing.T, original Credential) Credential {
105	repo := repository.NewMockRepo()
106
107	original.SetMetadata("test", "value")
108
109	assert.NotEmpty(t, original.ID().String())
110	assert.NotEmpty(t, original.Salt())
111	assert.NoError(t, Store(repo, original))
112
113	loaded, err := LoadWithId(repo, original.ID())
114	assert.NoError(t, err)
115
116	assert.Equal(t, original.ID(), loaded.ID())
117	assert.Equal(t, original.Kind(), loaded.Kind())
118	assert.Equal(t, original.Target(), loaded.Target())
119	assert.Equal(t, original.CreateTime().Unix(), loaded.CreateTime().Unix())
120	assert.Equal(t, original.Salt(), loaded.Salt())
121	assert.Equal(t, original.Metadata(), loaded.Metadata())
122
123	return loaded
124}