package couchctl import ( "context" "fmt" "time" secretmanagerpb "cloud.google.com/go/secretmanager/apiv1/secretmanagerpb" "google.golang.org/api/option" ) // const DefaultSecretValue = "mock secret value" // Common test utils type mockSecretManager struct { clients map[string]*mockSecretManagerClient } func (sm *mockSecretManager) NewWithOptions(_ context.Context, projectID string, _ ...option.ClientOption) (secretManagerClient, error) { if sm.clients[projectID] == nil { sm.clients[projectID] = &mockSecretManagerClient{ secrets: make(map[string]*mockSecret), } } return sm.clients[projectID], nil } type mockSecretManagerClient struct { secrets map[string]*mockSecret } type mockSecret struct { value []byte } // GetLatestSecretValue returns a secret value from the mock storage, or JIT creates it if missing. The controller // under test reads from one Secret Manager and writes to another, but this mock only has one storage location. So // the first read is expected to miss func (smc *mockSecretManagerClient) GetLatestSecretValue(_ context.Context, secretID string) ([]byte, error) { s := smc.secrets[secretID] if s == nil { return nil, fmt.Errorf("secret %s not found", secretID) } return smc.secrets[secretID].value, nil } func (smc *mockSecretManagerClient) GetSecret(_ context.Context, secretID string) (*secretmanagerpb.Secret, error) { s := smc.secrets[secretID] if s == nil { return nil, fmt.Errorf("secret %s not found", secretID) } spb := &secretmanagerpb.Secret{ Name: secretID, } return spb, nil } func (smc *mockSecretManagerClient) AddSecret(_ context.Context, secretID string, secretValue []byte, _ map[string]string, _ bool, _ *time.Time, _ string) error { smc.secrets[secretID] = &mockSecret{value: secretValue} return nil }