Skip to content
Snippets Groups Projects
storage_test.go 3.24 KiB
Newer Older
  • Learn to ignore specific revisions
  • Eric Chiang's avatar
    Eric Chiang committed
    package kubernetes
    
    import (
    
    	"io/ioutil"
    
    Eric Chiang's avatar
    Eric Chiang committed
    	"os"
    
    	"strings"
    
    Eric Chiang's avatar
    Eric Chiang committed
    	"testing"
    
    
    	"github.com/sirupsen/logrus"
    
    	"github.com/stretchr/testify/suite"
    	"sigs.k8s.io/testing_frameworks/integration"
    
    
    	"github.com/dexidp/dex/storage"
    	"github.com/dexidp/dex/storage/conformance"
    
    Eric Chiang's avatar
    Eric Chiang committed
    )
    
    
    const kubeconfigTemplate = `apiVersion: v1
    kind: Config
    clusters:
    - name: local
      cluster:
        server: SERVERURL
    users:
    - name: local
      user:
    contexts:
    - context:
        cluster: local
        user: local
    `
    
    func TestStorage(t *testing.T) {
    	if os.Getenv("TEST_ASSET_KUBE_APISERVER") == "" || os.Getenv("TEST_ASSET_ETCD") == "" {
    		t.Skip("control plane binaries are missing")
    	}
    
    	suite.Run(t, new(StorageTestSuite))
    }
    
    type StorageTestSuite struct {
    	suite.Suite
    
    	controlPlane *integration.ControlPlane
    
    	client *client
    }
    
    func (s *StorageTestSuite) SetupSuite() {
    	s.controlPlane = &integration.ControlPlane{}
    
    	err := s.controlPlane.Start()
    	s.Require().NoError(err)
    }
    
    func (s *StorageTestSuite) TearDownSuite() {
    	s.controlPlane.Stop()
    
    Eric Chiang's avatar
    Eric Chiang committed
    }
    
    
    func (s *StorageTestSuite) SetupTest() {
    	f, err := ioutil.TempFile("", "dex-kubeconfig-*")
    	s.Require().NoError(err)
    	defer f.Close()
    
    	_, err = f.WriteString(strings.ReplaceAll(kubeconfigTemplate, "SERVERURL", s.controlPlane.APIURL().String()))
    	s.Require().NoError(err)
    
    
    		KubeConfigFile: f.Name(),
    
    Eric Chiang's avatar
    Eric Chiang committed
    	}
    
    	logger := &logrus.Logger{
    		Out:       os.Stderr,
    		Formatter: &logrus.TextFormatter{DisableColors: true},
    		Level:     logrus.DebugLevel,
    	}
    
    
    	client, err := config.open(logger, true)
    	s.Require().NoError(err)
    
    	s.client = client
    }
    
    func (s *StorageTestSuite) TestStorage() {
    	newStorage := func() storage.Storage {
    		for _, resource := range []string{
    			resourceAuthCode,
    			resourceAuthRequest,
    
    			resourceDeviceRequest,
    			resourceDeviceToken,
    
    			resourceClient,
    			resourceRefreshToken,
    			resourceKeys,
    			resourcePassword,
    		} {
    			if err := s.client.deleteAll(resource); err != nil {
    				s.T().Fatalf("delete all %q failed: %v", resource, err)
    			}
    		}
    		return s.client
    
    Eric Chiang's avatar
    Eric Chiang committed
    	}
    
    
    	conformance.RunTests(s.T(), newStorage)
    	conformance.RunTransactionTests(s.T(), newStorage)
    
    Eric Chiang's avatar
    Eric Chiang committed
    }
    
    func TestURLFor(t *testing.T) {
    	tests := []struct {
    		apiVersion, namespace, resource, name string
    
    		baseURL string
    		want    string
    	}{
    		{
    			"v1", "default", "pods", "a",
    			"https://k8s.example.com",
    			"https://k8s.example.com/api/v1/namespaces/default/pods/a",
    		},
    		{
    			"foo/v1", "default", "bar", "a",
    			"https://k8s.example.com",
    			"https://k8s.example.com/apis/foo/v1/namespaces/default/bar/a",
    		},
    		{
    			"foo/v1", "default", "bar", "a",
    			"https://k8s.example.com/",
    			"https://k8s.example.com/apis/foo/v1/namespaces/default/bar/a",
    		},
    		{
    			"foo/v1", "default", "bar", "a",
    			"https://k8s.example.com/",
    			"https://k8s.example.com/apis/foo/v1/namespaces/default/bar/a",
    		},
    		{
    			// no namespace
    			"foo/v1", "", "bar", "a",
    			"https://k8s.example.com",
    			"https://k8s.example.com/apis/foo/v1/bar/a",
    		},
    	}
    
    	for _, test := range tests {
    
    		c := &client{baseURL: test.baseURL}
    
    Eric Chiang's avatar
    Eric Chiang committed
    		got := c.urlFor(test.apiVersion, test.namespace, test.resource, test.name)
    		if got != test.want {
    			t.Errorf("(&client{baseURL:%q}).urlFor(%q, %q, %q, %q): expected %q got %q",
    				test.baseURL,
    				test.apiVersion, test.namespace, test.resource, test.name,
    				test.want, got,
    			)
    		}
    	}
    }