119 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
package cluster
 | 
						|
 | 
						|
import (
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"k8s.io/api/core/v1"
 | 
						|
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						|
	v1core "k8s.io/client-go/kubernetes/typed/core/v1"
 | 
						|
 | 
						|
	"github.com/zalando-incubator/postgres-operator/pkg/spec"
 | 
						|
	"github.com/zalando-incubator/postgres-operator/pkg/util/k8sutil"
 | 
						|
)
 | 
						|
 | 
						|
var updateCalled = 0
 | 
						|
 | 
						|
type mockSecretGetter struct{}
 | 
						|
 | 
						|
type testSecret struct {
 | 
						|
	v1core.SecretInterface
 | 
						|
}
 | 
						|
 | 
						|
func (c *testSecret) Update(secret *v1.Secret) (*v1.Secret, error) {
 | 
						|
	updateCalled += 1
 | 
						|
	return secret, nil
 | 
						|
}
 | 
						|
 | 
						|
func (c *mockSecretGetter) Secrets(namespace string) v1core.SecretInterface {
 | 
						|
	return &testSecret{}
 | 
						|
}
 | 
						|
 | 
						|
func getMockK8sClient() k8sutil.KubernetesClient {
 | 
						|
	return k8sutil.KubernetesClient{
 | 
						|
		SecretsGetter: &mockSecretGetter{},
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func generateMockCluster(origin spec.RoleOrigin) *Cluster {
 | 
						|
	cluster := Cluster{
 | 
						|
		KubeClient: getMockK8sClient(),
 | 
						|
		pgUsers: map[string]spec.PgUser{
 | 
						|
			"testuser": {
 | 
						|
				Password: "123456",
 | 
						|
				Origin:   origin,
 | 
						|
			},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	cluster.logger = logger.
 | 
						|
		WithField("pkg", "cluster").
 | 
						|
		WithField("cluster-name", cluster.clusterName())
 | 
						|
 | 
						|
	return &cluster
 | 
						|
}
 | 
						|
 | 
						|
func TestSecretValidation(t *testing.T) {
 | 
						|
	secret := v1.Secret{Data: make(map[string][]byte)}
 | 
						|
 | 
						|
	tests := []struct {
 | 
						|
		name     string
 | 
						|
		action   Action
 | 
						|
		checkErr func(error) bool
 | 
						|
		errMsg   string
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			"Username for secret to update cannot be empty",
 | 
						|
			NewUpdateSecret("", &secret, nil),
 | 
						|
			func(err error) bool { return err == nil },
 | 
						|
			"Empty username did not cause an error, expected %v, given %v",
 | 
						|
		},
 | 
						|
	}
 | 
						|
	for _, tt := range tests {
 | 
						|
		result := tt.action.Validate()
 | 
						|
		if tt.checkErr(result) {
 | 
						|
			t.Errorf("%s: %v", tt.name, tt.errMsg)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestSecretApply(t *testing.T) {
 | 
						|
	tests := []struct {
 | 
						|
		name     string
 | 
						|
		action   Action
 | 
						|
		checkErr func(error) bool
 | 
						|
		errMsg   string
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			"Secret has been replaced with UpdateSecret for infrastructure role",
 | 
						|
			NewUpdateSecret("testuser", &v1.Secret{
 | 
						|
				ObjectMeta: metav1.ObjectMeta{
 | 
						|
					Name: "testsecret",
 | 
						|
				},
 | 
						|
				Data: make(map[string][]byte),
 | 
						|
			}, generateMockCluster(spec.RoleOriginInfrastructure)),
 | 
						|
			func(err error) bool { return err != nil || updateCalled != 1 },
 | 
						|
			"Update K8S client method was never called",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			"Secret has been synced with UpdateSecret for non infrastructure role",
 | 
						|
			NewUpdateSecret("testuser", &v1.Secret{
 | 
						|
				ObjectMeta: metav1.ObjectMeta{
 | 
						|
					Name: "testsecret",
 | 
						|
				},
 | 
						|
				Data: make(map[string][]byte),
 | 
						|
			}, generateMockCluster(spec.RoleOriginSystem)),
 | 
						|
			func(err error) bool { return err != nil || updateCalled != 0 },
 | 
						|
			"Update K8S client method was called, but should not be",
 | 
						|
		},
 | 
						|
	}
 | 
						|
	for _, tt := range tests {
 | 
						|
		result := tt.action.Apply()
 | 
						|
		if tt.checkErr(result) {
 | 
						|
			t.Errorf("%s: %v", tt.name, tt.errMsg)
 | 
						|
		}
 | 
						|
 | 
						|
		// reset counters
 | 
						|
		updateCalled = 0
 | 
						|
	}
 | 
						|
}
 |