Skip to content

Commit 23970ef

Browse files
committed
store(darwin): test filter and attributes
Signed-off-by: Alano Terblanche <18033717+Benehiko@users.noreply.github.com>
1 parent 001ee42 commit 23970ef

1 file changed

Lines changed: 65 additions & 17 deletions

File tree

store/keychain/keychain_darwin_test.go

Lines changed: 65 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ package keychain
44

55
import (
66
"bytes"
7-
"context"
87
"testing"
98

109
"github.com/google/uuid"
@@ -22,43 +21,92 @@ func TestMacosKeychain(t *testing.T) {
2221
}
2322
var (
2423
serviceName = uuid.NewString()
25-
serviceGroup = "test.testing." + uuid.NewString()
24+
serviceGroup = "com.test.testing"
2625
id = store.MustParseID(serviceGroup + "/" + serviceName + "/" + uuid.NewString())
2726
)
28-
store := keychainStore[*mocks.MockCredential]{
29-
serviceGroup: "test.testing." + uuid.NewString(),
30-
serviceName: uuid.NewString(),
27+
keychainStore := keychainStore[*mocks.MockCredential]{
28+
serviceGroup: serviceGroup,
29+
serviceName: serviceName,
3130
factory: func() *mocks.MockCredential {
3231
return &mocks.MockCredential{}
3332
},
3433
}
3534

36-
t.Run("secret can have no attributes", func(t *testing.T) {
35+
ids := []string{
36+
serviceGroup + "/" + serviceName + "/" + uuid.NewString(),
37+
serviceGroup + "/" + serviceName + "/" + uuid.NewString(),
38+
serviceGroup + "/" + serviceName + "/" + uuid.NewString(),
39+
}
40+
t.Cleanup(func() {
41+
for _, id := range ids {
42+
assert.NoError(t, keychainStore.Delete(t.Context(), store.MustParseID(id)))
43+
}
44+
})
45+
for _, id := range ids {
46+
assert.NoError(t, keychainStore.Save(t.Context(), store.MustParseID(id), &mocks.MockCredential{
47+
Username: uuid.NewString(),
48+
Password: uuid.NewString(),
49+
Attributes: map[string]string{
50+
"color": "purple",
51+
"game": "unknown",
52+
},
53+
}))
54+
}
55+
56+
t.Run("can have no attributes", func(t *testing.T) {
3757
t.Cleanup(func() {
38-
assert.NoError(t, store.Delete(context.Background(), id))
58+
assert.NoError(t, keychainStore.Delete(t.Context(), id))
3959
})
40-
require.NoError(t, store.Save(t.Context(), id, secret))
41-
42-
storeSecret, err := store.Get(t.Context(), id)
43-
require.NoError(t, err)
44-
assert.Empty(t, storeSecret.Metadata())
60+
require.NoError(t, keychainStore.Save(t.Context(), id, secret))
4561
})
46-
47-
t.Run("secret can store large attributes", func(t *testing.T) {
62+
t.Run("can store large attributes", func(t *testing.T) {
4863
t.Cleanup(func() {
49-
assert.NoError(t, store.Delete(context.Background(), id))
64+
assert.NoError(t, keychainStore.Delete(t.Context(), id))
5065
})
5166
large := bytes.Repeat([]byte{'a'}, 1024*1024)
5267
secret.Attributes = map[string]string{
5368
"large": string(large),
5469
"small": "eyy",
5570
}
56-
require.NoError(t, store.Save(t.Context(), id, secret))
71+
require.NoError(t, keychainStore.Save(t.Context(), id, secret))
5772

58-
storeSecret, err := store.Get(t.Context(), id)
73+
storeSecret, err := keychainStore.Get(t.Context(), id)
5974
require.NoError(t, err)
6075
assert.EqualValues(t, secret.Attributes, storeSecret.Metadata())
6176
})
77+
t.Run("filter populates both metadata and secret", func(t *testing.T) {
78+
t.Cleanup(func() {
79+
assert.NoError(t, keychainStore.Delete(t.Context(), id))
80+
})
81+
secret.Attributes = map[string]string{
82+
"game": "elden ring",
83+
}
84+
require.NoError(t, keychainStore.Save(t.Context(), id, secret))
85+
secrets, err := keychainStore.Filter(t.Context(), store.MustParsePattern(id.String()))
86+
require.NoError(t, err)
87+
assert.Len(t, secrets, 1)
88+
assert.Subset(t, secrets[id.String()].Metadata(), map[string]string{
89+
"game": "elden ring",
90+
})
91+
assert.IsType(t, &mocks.MockCredential{}, secrets[id.String()], "secret from store must be of type *mocks.MockCredential")
92+
mockSecret := secrets[id.String()].(*mocks.MockCredential)
93+
assert.Equal(t, secret.Password, mockSecret.Password)
94+
})
95+
t.Run("can use pattern only matching service name", func(t *testing.T) {
96+
t.Cleanup(func() {
97+
assert.NoError(t, keychainStore.Delete(t.Context(), id))
98+
})
99+
secret.Attributes = map[string]string{
100+
"color": "blue",
101+
"game": "elden ring",
102+
}
103+
require.NoError(t, keychainStore.Save(t.Context(), id, secret))
104+
secrets, err := keychainStore.Filter(t.Context(), store.MustParsePattern("*/"+serviceName+"/*"))
105+
require.NoError(t, err)
106+
assert.Len(t, secrets, 4)
107+
_, ok := secrets[id.String()]
108+
assert.Truef(t, ok, "returned secret must match original id")
109+
})
62110
}
63111

64112
func TestConvertAttributes(t *testing.T) {

0 commit comments

Comments
 (0)