1package auth
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/assert"
7 "github.com/stretchr/testify/require"
8
9 "github.com/MichaelMure/git-bug/entity"
10 "github.com/MichaelMure/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}