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

     1  // +build unit
     2  
     3  package kube
     4  
     5  import (
     6  	"testing"
     7  
     8  	"github.com/pkg/errors"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  	"k8s.io/client-go/kubernetes"
    12  	"k8s.io/client-go/kubernetes/scheme"
    13  
    14  	kube_mocks "k8s.io/client-go/kubernetes/fake"
    15  )
    16  
    17  func TestGetAdminNamespace(t *testing.T) {
    18  	t.Parallel()
    19  	namespace := `apiVersion: v1
    20  kind: Namespace
    21  metadata:
    22    annotations:
    23      jenkins-x.io/created-by: Jenkins X
    24      jenkins-x.io/admin-namespace: admin-namespace
    25    labels:
    26      env: dev
    27      team: myteam
    28    name: myteam
    29  status:
    30    phase: Active`
    31  
    32  	client, err := createMockClient(namespace)
    33  	require.NoError(t, err, "failed to create mock client")
    34  	adminNamespace, err := GetAdminNamespace(client, "myteam")
    35  	assert.NoError(t, err, "GetAdminNamespace should not error")
    36  	assert.Equal(t, "admin-namespace", adminNamespace)
    37  }
    38  
    39  func TestGetAdminNamespaceDefaulted(t *testing.T) {
    40  	t.Parallel()
    41  	namespace := `apiVersion: v1
    42  kind: Namespace
    43  metadata:
    44    annotations:
    45      jenkins-x.io/created-by: Jenkins X
    46    labels:
    47      env: dev
    48      team: myteam
    49    name: myteam
    50  status:
    51    phase: Active`
    52  
    53  	client, err := createMockClient(namespace)
    54  	require.NoError(t, err, "failed to create mock client")
    55  	adminNamespace, err := GetAdminNamespace(client, "myteam")
    56  	assert.NoError(t, err, "error occurred calling GetAdminNamespace")
    57  	assert.Equal(t, "myteam", adminNamespace)
    58  }
    59  
    60  // TestGetAdminNamespaceOnNonTeam tests that when there are no annotations the code does not blow up.
    61  // there should always be one annotation "jenkins-x.io/created-by: Jenkins X" for a team but better to not blow up
    62  func TestGetAdminNamespaceOnNonTeam(t *testing.T) {
    63  
    64  	t.Parallel()
    65  	namespace := `apiVersion: v1
    66  kind: Namespace
    67  metadata:
    68    name: myteam
    69  status:
    70    phase: Active`
    71  
    72  	client, err := createMockClient(namespace)
    73  	require.NoError(t, err, "failed to create mock client")
    74  	adminNamespace, err := GetAdminNamespace(client, "myteam")
    75  	assert.NoError(t, err, "error occurred calling GetAdminNamespace")
    76  	assert.Equal(t, "myteam", adminNamespace)
    77  }
    78  
    79  func TestSetAdminNamespace(t *testing.T) {
    80  	t.Parallel()
    81  	namespace := `apiVersion: v1
    82  kind: Namespace
    83  metadata:
    84    annotations:
    85      jenkins-x.io/created-by: Jenkins X
    86    labels:
    87      env: dev
    88      team: myteam
    89    name: myteam
    90  status:
    91    phase: Active`
    92  	client, err := createMockClient(namespace)
    93  	require.NoError(t, err, "failed to create mock client")
    94  	err = SetAdminNamespace(client, "myteam", "my-admin-namespace")
    95  	assert.NoError(t, err, "error occurred calling SetAdminNamespace")
    96  	adminNs, err := GetAdminNamespace(client, "myteam")
    97  	assert.NoError(t, err, "error occurred calling GetAdminNamespace")
    98  	assert.Equal(t, "my-admin-namespace", adminNs)
    99  }
   100  
   101  func createMockClient(objDef string) (kubernetes.Interface, error) {
   102  	decode := scheme.Codecs.UniversalDeserializer().Decode
   103  	obj, _, err := decode([]byte(objDef), nil, nil)
   104  	if err != nil {
   105  		return nil, errors.Wrapf(err, "could not decode data")
   106  	}
   107  
   108  	mockKubeClient := kube_mocks.NewSimpleClientset(obj)
   109  	return mockKubeClient, nil
   110  }