github.com/spotahome/redis-operator@v1.2.4/service/k8s/configmap_test.go (about)

     1  package k8s_test
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	corev1 "k8s.io/api/core/v1"
     9  	kubeerrors "k8s.io/apimachinery/pkg/api/errors"
    10  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  	"k8s.io/apimachinery/pkg/runtime"
    12  	"k8s.io/apimachinery/pkg/runtime/schema"
    13  	kubernetes "k8s.io/client-go/kubernetes/fake"
    14  	kubetesting "k8s.io/client-go/testing"
    15  
    16  	"github.com/spotahome/redis-operator/log"
    17  	"github.com/spotahome/redis-operator/metrics"
    18  	"github.com/spotahome/redis-operator/service/k8s"
    19  )
    20  
    21  var (
    22  	configMapsGroup = schema.GroupVersionResource{Group: "", Version: "v1", Resource: "configmaps"}
    23  )
    24  
    25  func newConfigMapUpdateAction(ns string, configMap *corev1.ConfigMap) kubetesting.UpdateActionImpl {
    26  	return kubetesting.NewUpdateAction(configMapsGroup, ns, configMap)
    27  }
    28  
    29  func newConfigMapGetAction(ns, name string) kubetesting.GetActionImpl {
    30  	return kubetesting.NewGetAction(configMapsGroup, ns, name)
    31  }
    32  
    33  func newConfigMapCreateAction(ns string, configMap *corev1.ConfigMap) kubetesting.CreateActionImpl {
    34  	return kubetesting.NewCreateAction(configMapsGroup, ns, configMap)
    35  }
    36  
    37  func TestConfigMapServiceGetCreateOrUpdate(t *testing.T) {
    38  	testConfigMap := &corev1.ConfigMap{
    39  		ObjectMeta: metav1.ObjectMeta{
    40  			Name:            "testconfigmap1",
    41  			ResourceVersion: "10",
    42  		},
    43  	}
    44  
    45  	testns := "testns"
    46  
    47  	tests := []struct {
    48  		name               string
    49  		configMap          *corev1.ConfigMap
    50  		getConfigMapResult *corev1.ConfigMap
    51  		errorOnGet         error
    52  		errorOnCreation    error
    53  		expActions         []kubetesting.Action
    54  		expErr             bool
    55  	}{
    56  		{
    57  			name:               "A new configmap should create a new configmap.",
    58  			configMap:          testConfigMap,
    59  			getConfigMapResult: nil,
    60  			errorOnGet:         kubeerrors.NewNotFound(schema.GroupResource{}, ""),
    61  			errorOnCreation:    nil,
    62  			expActions: []kubetesting.Action{
    63  				newConfigMapGetAction(testns, testConfigMap.ObjectMeta.Name),
    64  				newConfigMapCreateAction(testns, testConfigMap),
    65  			},
    66  			expErr: false,
    67  		},
    68  		{
    69  			name:               "A new configmap should error when create a new configmap fails.",
    70  			configMap:          testConfigMap,
    71  			getConfigMapResult: nil,
    72  			errorOnGet:         kubeerrors.NewNotFound(schema.GroupResource{}, ""),
    73  			errorOnCreation:    errors.New("wanted error"),
    74  			expActions: []kubetesting.Action{
    75  				newConfigMapGetAction(testns, testConfigMap.ObjectMeta.Name),
    76  				newConfigMapCreateAction(testns, testConfigMap),
    77  			},
    78  			expErr: true,
    79  		},
    80  		{
    81  			name:               "An existent configmap should update the configmap.",
    82  			configMap:          testConfigMap,
    83  			getConfigMapResult: testConfigMap,
    84  			errorOnGet:         nil,
    85  			errorOnCreation:    nil,
    86  			expActions: []kubetesting.Action{
    87  				newConfigMapGetAction(testns, testConfigMap.ObjectMeta.Name),
    88  				newConfigMapUpdateAction(testns, testConfigMap),
    89  			},
    90  			expErr: false,
    91  		},
    92  	}
    93  
    94  	for _, test := range tests {
    95  		t.Run(test.name, func(t *testing.T) {
    96  			assert := assert.New(t)
    97  
    98  			// Mock.
    99  			mcli := &kubernetes.Clientset{}
   100  			mcli.AddReactor("get", "configmaps", func(action kubetesting.Action) (bool, runtime.Object, error) {
   101  				return true, test.getConfigMapResult, test.errorOnGet
   102  			})
   103  			mcli.AddReactor("create", "configmaps", func(action kubetesting.Action) (bool, runtime.Object, error) {
   104  				return true, nil, test.errorOnCreation
   105  			})
   106  
   107  			service := k8s.NewConfigMapService(mcli, log.Dummy, metrics.Dummy)
   108  			err := service.CreateOrUpdateConfigMap(testns, test.configMap)
   109  
   110  			if test.expErr {
   111  				assert.Error(err)
   112  			} else {
   113  				assert.NoError(err)
   114  				// Check calls to kubernetes.
   115  				assert.Equal(test.expActions, mcli.Actions())
   116  			}
   117  		})
   118  	}
   119  }