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  }