@@ -4,7 +4,6 @@ package keychain
44
55import (
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
64112func TestConvertAttributes (t * testing.T ) {
0 commit comments