get.porter.sh/porter@v1.3.0/pkg/storage/credentialset_provider_helpers.go (about) 1 package storage 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "os" 8 "path/filepath" 9 "testing" 10 11 "get.porter.sh/porter/pkg/config" 12 "get.porter.sh/porter/pkg/encoding" 13 "get.porter.sh/porter/pkg/portercontext" 14 "get.porter.sh/porter/pkg/secrets" 15 "github.com/carolynvs/aferox" 16 "github.com/spf13/afero" 17 ) 18 19 var _ CredentialSetProvider = &TestCredentialSetProvider{} 20 21 type TestCredentialSetProvider struct { 22 *CredentialStore 23 24 T *testing.T 25 TestContext *portercontext.TestContext 26 // TestSecrets allows you to set up secrets for unit testing 27 TestSecrets secrets.TestSecretsProvider 28 TestStorage Store 29 } 30 31 func NewTestCredentialProvider(t *testing.T) *TestCredentialSetProvider { 32 tc := config.NewTestConfig(t) 33 testStore := NewTestStore(tc) 34 testSecrets := secrets.NewTestSecretsProvider() 35 return NewTestCredentialProviderFor(t, testStore, testSecrets) 36 } 37 38 func NewTestCredentialProviderFor(t *testing.T, testStore Store, testSecrets secrets.TestSecretsProvider) *TestCredentialSetProvider { 39 return &TestCredentialSetProvider{ 40 T: t, 41 TestContext: portercontext.NewTestContext(t), 42 TestSecrets: testSecrets, 43 TestStorage: testStore, 44 CredentialStore: &CredentialStore{ 45 Documents: testStore, 46 Secrets: testSecrets, 47 }, 48 } 49 } 50 51 func (p TestCredentialSetProvider) Close() error { 52 // sometimes we are testing with a mock that needs to be released at the end of the test 53 if closer, ok := p.TestStorage.(io.Closer); ok { 54 return closer.Close() 55 } 56 return nil 57 } 58 59 // Load a CredentialSet from a test file at a given path. 60 // 61 // It does not load the individual credentials. 62 func (p TestCredentialSetProvider) Load(path string) (CredentialSet, error) { 63 fs := aferox.NewAferox(".", afero.NewOsFs()) 64 var cset CredentialSet 65 err := encoding.UnmarshalFile(fs, path, &cset) 66 if err != nil { 67 return cset, fmt.Errorf("error reading %s as a credential set: %w", path, err) 68 } 69 70 return cset, nil 71 } 72 73 func (p TestCredentialSetProvider) AddTestCredentials(path string) { 74 cs, err := p.Load(path) 75 if err != nil { 76 p.T.Fatal(fmt.Errorf("could not read test credentials from %s: %w", path, err)) 77 } 78 79 err = p.CredentialStore.InsertCredentialSet(context.Background(), cs) 80 if err != nil { 81 p.T.Fatal(fmt.Errorf("could not load test credentials into in memory credential storage: %w", err)) 82 } 83 } 84 85 func (p TestCredentialSetProvider) AddTestCredentialsDirectory(dir string) { 86 files, err := os.ReadDir(dir) 87 if err != nil { 88 p.T.Fatal(fmt.Errorf("could not list test directory %s: %w", dir, err)) 89 } 90 91 for _, fi := range files { 92 path := filepath.Join(dir, fi.Name()) 93 p.AddTestCredentials(path) 94 } 95 } 96 97 func (p TestCredentialSetProvider) AddSecret(key string, value string) { 98 err := p.TestSecrets.Create(context.Background(), secrets.SourceSecret, key, value) 99 if err != nil { 100 p.T.Fatal(fmt.Errorf("could not create secret %s: %w", key, err)) 101 } 102 }