Quellcode durchsuchen

Refactor counterfeiter GCP SetSecret

Signed-off-by: Lilly Daniell <lilly.daniell@engineerbetter.com>
Co-authored-by: William Young <will.young@engineerbetter.com>
Co-authored-by: Marcus Dantas <marcus.dantas@engineerbetter.com>
Co-authored-by: Amr Fawzy <amr.fawzy@container-solutions.com>
Co-authored-by: Adrienne Galloway <adrienne.galloway@engineerbetter.com>
Lilly Daniell vor 3 Jahren
Ursprung
Commit
c1f0564010

+ 20 - 1
pkg/provider/gcp/secretmanager/fake/fake.go

@@ -31,16 +31,23 @@ type MockSMClient struct {
 	addSecretFn    func(ctx context.Context, req *secretmanagerpb.AddSecretVersionRequest, opts ...gax.CallOption) (*secretmanagerpb.SecretVersion, error)
 	createSecretFn func(ctx context.Context, req *secretmanagerpb.CreateSecretRequest, opts ...gax.CallOption) (*secretmanagerpb.Secret, error)
 	closeFn        func() error
+	GetSecretFn    func(ctx context.Context, req *secretmanagerpb.GetSecretRequest, opts ...gax.CallOption) (*secretmanagerpb.Secret, error)
 }
 
 func (mc *MockSMClient) GetSecret(ctx context.Context, req *secretmanagerpb.GetSecretRequest, opts ...gax.CallOption) (*secretmanagerpb.Secret, error) {
-	return nil, nil
+	return mc.GetSecretFn(ctx, req)
 }
 
 func (mc *MockSMClient) AccessSecretVersion(ctx context.Context, req *secretmanagerpb.AccessSecretVersionRequest, opts ...gax.CallOption) (*secretmanagerpb.AccessSecretVersionResponse, error) {
 	return mc.accessSecretFn(ctx, req)
 }
 
+func (mc *MockSMClient) NewAccessSecretVersionFn(res *secretmanagerpb.AccessSecretVersionResponse, err error) {
+	mc.accessSecretFn = func(ctx context.Context, req *secretmanagerpb.AccessSecretVersionRequest, opts ...gax.CallOption) (*secretmanagerpb.AccessSecretVersionResponse, error) {
+		return res, err
+	}
+}
+
 func (mc *MockSMClient) ListSecrets(ctx context.Context, req *secretmanagerpb.ListSecretsRequest, opts ...gax.CallOption) *secretmanager.SecretIterator {
 	return mc.ListSecretsFn(ctx, req)
 }
@@ -52,6 +59,12 @@ func (mc *MockSMClient) AddSecretVersion(ctx context.Context, req *secretmanager
 	return mc.addSecretFn(ctx, req)
 }
 
+func (mc *MockSMClient) NewAddSecretVersion(secretVersion *secretmanagerpb.SecretVersion, err error) {
+	mc.addSecretFn = func(ctx context.Context, req *secretmanagerpb.AddSecretVersionRequest, opts ...gax.CallOption) (*secretmanagerpb.SecretVersion, error) {
+		return secretVersion, err
+	}
+}
+
 func (mc *MockSMClient) CreateSecret(ctx context.Context, req *secretmanagerpb.CreateSecretRequest, opts ...gax.CallOption) (*secretmanagerpb.Secret, error) {
 	return mc.createSecretFn(ctx, req)
 }
@@ -62,6 +75,12 @@ func (mc *MockSMClient) NilClose() {
 	}
 }
 
+func (mc *MockSMClient) NewGetSecretFn(secret *secretmanagerpb.Secret, err error) {
+	mc.GetSecretFn = func(ctx context.Context, req *secretmanagerpb.GetSecretRequest, opts ...gax.CallOption) (*secretmanagerpb.Secret, error) {
+		return secret, err
+	}
+}
+
 func (mc *MockSMClient) CreateSecretError() {
 	mc.createSecretFn = func(ctx context.Context, req *secretmanagerpb.CreateSecretRequest, opts ...gax.CallOption) (*secretmanagerpb.Secret, error) {
 		return nil, errors.New("something went wrong")

+ 80 - 7
pkg/provider/gcp/secretmanager/secretsmanager_test.go

@@ -20,6 +20,8 @@ import (
 	"strings"
 	"testing"
 
+	"github.com/crossplane/crossplane-runtime/pkg/test"
+	"github.com/google/go-cmp/cmp"
 	"github.com/googleapis/gax-go/v2/apierror"
 	"github.com/stretchr/testify/assert"
 	secretmanagerpb "google.golang.org/genproto/googleapis/cloud/secretmanager/v1"
@@ -188,13 +190,84 @@ func TestSecretManagerGetSecret(t *testing.T) {
 	}
 }
 
+type fakeRef struct {
+	key string
+}
+
+func (f fakeRef) GetRemoteKey() string {
+	return f.key
+}
+
+// We need to add the NewGetSecretFn into our args struct so that they modifiable.
+func TestSetSecretTable(t *testing.T) {
+	smtc := secretManagerTestCase{
+		mockClient:     &fakesm.MockSMClient{},
+		apiInput:       makeValidAPIInput(),
+		ref:            makeValidRef(),
+		apiOutput:      makeValidAPIOutput(),
+		projectID:      "default",
+		apiErr:         nil,
+		expectError:    "",
+		expectedSecret: "",
+		expectedData:   map[string][]byte{},
+	}
+
+	var payload = secretmanagerpb.SecretPayload{
+		Data: []byte("payload"),
+	}
+
+	var res = secretmanagerpb.AccessSecretVersionResponse{
+		Name:    "projects/default/secrets/foo-bar",
+		Payload: &payload,
+	}
+
+	var secretVersion = secretmanagerpb.SecretVersion{}
+
+	type args struct {
+		provider secretmanager.ProviderGCP
+	}
+
+	type want struct {
+		err error
+	}
+	tests := map[string]struct {
+		reason string
+		args   args
+		want   want
+	}{
+		"SetSecret": {
+			reason: "SetSecret successfully pushes a secret",
+			args: args{
+				provider: secretmanager.ProviderGCP{
+					SecretManagerClient: smtc.mockClient,
+				},
+			},
+			want: want{
+				err: nil,
+			},
+		},
+	}
+	for name, tc := range tests {
+		t.Run(name, func(t *testing.T) {
+			ref := fakeRef{key: "/baz"}
+			smtc.mockClient.NewGetSecretFn(newSecret(), nil)
+			smtc.mockClient.NewAccessSecretVersionFn(&res, nil)
+			smtc.mockClient.NewAddSecretVersion(&secretVersion, nil)
+			err := tc.args.provider.SetSecret(context.Background(), []byte("fake-value"), ref)
+			if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" {
+				t.Errorf("\nTesting SetSecret:\nName: %v\nReason: %v\nWant error: %v\nGot error: %v", name, tc.reason, tc.want.err, diff)
+			}
+		})
+	}
+}
+
 func TestSetSecret(t *testing.T) {
 	client := newClient()
 	pushRemoteRef := newPushRemoteRef()
 	secret := newSecret()
 	p := newProvider(client)
 
-	client.GetSecretReturns(&secret, nil)
+	client.GetSecretReturns(secret, nil)
 
 	err := p.SetSecret(context.Background(), nil, pushRemoteRef)
 	assert.Equal(t, err, nil)
@@ -210,7 +283,7 @@ func TestSetSecretAddSecretVersion(t *testing.T) {
 	newStatus := status.Error(codes.Aborted, "failed")
 	err, _ := apierror.FromError(newStatus)
 
-	client.GetSecretReturns(&secret, nil)
+	client.GetSecretReturns(secret, nil)
 	client.AddSecretVersionReturns(nil, err)
 
 	expect := p.SetSecret(context.TODO(), nil, pushRemoteRef)
@@ -231,7 +304,7 @@ func TestSetSecretAccessSecretVersion(t *testing.T) {
 
 	client.AccessSecretVersionReturns(nil, err)
 	client.GetSecretReturns(nil, err)
-	client.CreateSecretReturns(&secret, nil)
+	client.CreateSecretReturns(secret, nil)
 
 	expect := p.SetSecret(context.Background(), nil, pushRemoteRef)
 	if assert.Error(t, expect) {
@@ -249,7 +322,7 @@ func TestSetSecretGetSecret404(t *testing.T) {
 	err, _ := apierror.FromError(newStatus)
 
 	client.GetSecretReturns(nil, err)
-	client.CreateSecretReturns(&secret, nil)
+	client.CreateSecretReturns(secret, nil)
 	client.AccessSecretVersionReturns(nil, err)
 
 	p.SetSecret(context.Background(), nil, pushRemoteRef)
@@ -299,7 +372,7 @@ func TestSetSecretAlreadyExists(t *testing.T) {
 		Name:    "projects/default/secrets/foo-bar",
 		Payload: payload,
 	}, nil)
-	client.GetSecretReturns(&secret, nil)
+	client.GetSecretReturns(secret, nil)
 
 	err := p.SetSecret(context.TODO(), []byte("bar"), pushRemoteRef)
 	if client.AddSecretVersionCallCount() != 0 {
@@ -433,8 +506,8 @@ func newPushRemoteRef() *fakeprr.PushRemoteRef {
 	return new(fakeprr.PushRemoteRef)
 }
 
-func newSecret() secretmanagerpb.Secret {
-	return secretmanagerpb.Secret{
+func newSecret() *secretmanagerpb.Secret {
+	return &secretmanagerpb.Secret{
 		Name: "projects/default/secrets/foo-bar",
 		Replication: &secretmanagerpb.Replication{
 			Replication: &secretmanagerpb.Replication_Automatic_{