github.com/jenkins-x/jx/v2@v2.1.155/pkg/kube/vault/vault_selector_test.go (about)

     1  // +build unit
     2  
     3  package vault_test
     4  
     5  import (
     6  	"fmt"
     7  	"testing"
     8  
     9  	vault_const "github.com/jenkins-x/jx/v2/pkg/vault"
    10  
    11  	expect "github.com/Netflix/go-expect"
    12  	kubevault "github.com/jenkins-x/jx/v2/pkg/kube/vault"
    13  	"github.com/jenkins-x/jx/v2/pkg/tests"
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  func Test_GetVault_DoesNotPromptUserIfOnlyOneVaultInNamespace(t *testing.T) {
    18  	vaultOperatorClient, factory, kubeClient, err := setupMocks(t, nil)
    19  	createMockedVault("myVault", "myVaultNamespace", "foo.bar", "myJWT", vaultOperatorClient, kubeClient)
    20  
    21  	selector, err := kubevault.NewVaultSelector(factory.Options)
    22  
    23  	vault, err := selector.GetVault("", "myVaultNamespace", true)
    24  
    25  	assert.Equal(t, "myVault", vault.Name)
    26  	assert.Equal(t, "myVaultNamespace", vault.Namespace)
    27  	assert.Equal(t, "http://foo.bar", vault.URL)
    28  	assert.Equal(t, "myVault-auth-sa", vault.ServiceAccountName)
    29  	assert.NoError(t, err)
    30  }
    31  
    32  func Test_GetVault_InclusterUsesInternalVaultURL(t *testing.T) {
    33  	vaultOperatorClient, factory, kubeClient, err := setupMocks(t, nil)
    34  	createMockedVault("myVault", "myVaultNamespace", "foo.bar", "myJWT", vaultOperatorClient, kubeClient)
    35  
    36  	selector, err := kubevault.NewVaultSelector(factory.Options)
    37  
    38  	vault, err := selector.GetVault("", "myVaultNamespace", false)
    39  
    40  	assert.Equal(t, "myVault", vault.Name)
    41  	assert.Equal(t, "myVaultNamespace", vault.Namespace)
    42  	assert.Equal(t, fmt.Sprintf("http://myVault:%s", vault_const.DefaultVaultPort), vault.URL)
    43  	assert.Equal(t, "myVault-auth-sa", vault.ServiceAccountName)
    44  	assert.NoError(t, err)
    45  }
    46  
    47  func Test_GetVault_ErrorsIfNoVaultsInNamespace(t *testing.T) {
    48  	vaultOperatorClient, factory, kubeClient, err := setupMocks(t, nil)
    49  	createMockedVault("myVault", "myVaultNamespace", "foo.bar", "myJWT", vaultOperatorClient, kubeClient)
    50  
    51  	selector, err := kubevault.NewVaultSelector(factory.Options)
    52  
    53  	vault, err := selector.GetVault("", "Nothing Here Jim", true)
    54  
    55  	assert.Nil(t, vault)
    56  	assert.EqualError(t, err, "no vaults found in namespace 'Nothing Here Jim'")
    57  }
    58  
    59  func Test_GetVault_ErrorsIfRequestedVaultDoesNotExist(t *testing.T) {
    60  	vaultOperatorClient, factory, kubeClient, err := setupMocks(t, nil)
    61  	createMockedVault("myVault", "myVaultNamespace", "foo.bar", "myJWT", vaultOperatorClient, kubeClient)
    62  
    63  	selector, err := kubevault.NewVaultSelector(factory.Options)
    64  
    65  	vault, err := selector.GetVault("NoVaultHere", "myVaultNamespace", true)
    66  
    67  	assert.Nil(t, vault)
    68  	assert.EqualError(t, err, "vault 'NoVaultHere' not found in namespace 'myVaultNamespace'")
    69  }
    70  
    71  func Test_GetVault_GetExplicitVaultSucceedsWhenTwoVaultsAreDefined(t *testing.T) {
    72  	vaultOperatorClient, factory, kubeClient, err := setupMocks(t, nil)
    73  	createMockedVault("vault1", "myVaultNamespace", "one.ah.ah.ah", "Count", vaultOperatorClient, kubeClient)
    74  	createMockedVault("vault2", "myVaultNamespace", "two.ah.ah.ah", "Von-Count", vaultOperatorClient, kubeClient)
    75  
    76  	selector, err := kubevault.NewVaultSelector(factory.Options)
    77  
    78  	vault, err := selector.GetVault("vault2", "myVaultNamespace", true)
    79  
    80  	assert.Equal(t, "vault2", vault.Name)
    81  	assert.Equal(t, "myVaultNamespace", vault.Namespace)
    82  	assert.Equal(t, "http://two.ah.ah.ah", vault.URL)
    83  	assert.Equal(t, "vault2-auth-sa", vault.ServiceAccountName)
    84  	assert.NoError(t, err)
    85  }
    86  
    87  func Test_GetVault_PromptsUserIfMoreThanOneVaultInNamespace(t *testing.T) {
    88  	tests.SkipForWindows(t, "go-expect does not work on windows")
    89  
    90  	// mock terminal
    91  	console := tests.NewTerminal(t, nil)
    92  	defer console.Cleanup()
    93  	vaultOperatorClient, factory, kubeClient, err := setupMocks(t, &console.Stdio)
    94  	createMockedVault("vault1", "myVaultNamespace", "one.ah.ah.ah", "Count", vaultOperatorClient, kubeClient)
    95  	createMockedVault("vault2", "myVaultNamespace", "two.ah.ah.ah", "Von-Count", vaultOperatorClient, kubeClient)
    96  
    97  	selector, err := kubevault.NewVaultSelector(factory.Options)
    98  
    99  	//Test interactive IO
   100  	donec := make(chan struct{})
   101  	go func() {
   102  		defer close(donec)
   103  		console.ExpectString("Select Vault:")
   104  		console.SendLine("vault2")
   105  		console.ExpectEOF()
   106  	}()
   107  
   108  	vault, err := selector.GetVault("", "myVaultNamespace", true)
   109  
   110  	console.Close()
   111  	<-donec
   112  
   113  	// Dump the terminal's screen.
   114  	t.Logf(expect.StripTrailingEmptyLines(console.CurrentState()))
   115  
   116  	assert.Equal(t, "vault2", vault.Name)
   117  	assert.Equal(t, "myVaultNamespace", vault.Namespace)
   118  	assert.Equal(t, "http://two.ah.ah.ah", vault.URL)
   119  	assert.Equal(t, "vault2-auth-sa", vault.ServiceAccountName)
   120  	assert.NoError(t, err)
   121  }