package couchctl import ( "context" "errors" "fmt" "testing" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "github.com/google/uuid" "github.com/stretchr/testify/assert" "sigs.k8s.io/controller-runtime/pkg/client/fake" ) func Test_oldPVCsSuffixes(t *testing.T) { ctx := context.Background() tests := []struct { name string description string result map[string]string err error }{ { name: "database-storage-data-sync-couchdb-0", description: "Old control plane no lane", result: map[string]string{"node-0": "0"}, }, { name: "database-storage-data-sync-couchdb-1-0", description: "Old touchpoint lane 1", result: map[string]string{"node-1": "1"}, }, { name: "database-storage-data-sync-couchdb-a424450319062fa778f6-0", description: "Old touchpoint no lane", result: map[string]string{"node-2": "a424450319062fa778f6"}, }, { name: "database-storage-couchdb-xqw0z42tplcr-0", description: "New Name", result: map[string]string{"node-3": ""}, }, } var pvcs []string for _, tc := range tests { pvcs = append(pvcs, tc.name) } cl := fake.NewFakeClient(fakeObjects(pvcs...)...) for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { r, err := oldPVCsSuffixes(ctx, cl) assert.True(t, errors.Is(err, tc.err), "%s: pvc error = %v, wantErr %v", tc.description, err, tc.err) m := r["data-sync-couchdb"] for k, v := range tc.result { assert.Equal(t, v, m[k], tc.description) } }) } } func fakeObjects(pvcs ...string) []runtime.Object { var objs []runtime.Object for i, pvc := range pvcs { uid := uuid.NewString() pv := fmt.Sprintf("pvc-%s", uid) objs = append(objs, &corev1.PersistentVolumeClaim{ TypeMeta: metav1.TypeMeta{ Kind: "PersistentVolumeClaim", APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ Name: pvc, Namespace: "data-sync-couchdb", }, Spec: corev1.PersistentVolumeClaimSpec{ VolumeName: pv, }, }) objs = append(objs, &corev1.PersistentVolume{ TypeMeta: metav1.TypeMeta{ Kind: "PersistentVolume", APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ Name: pv, }, Spec: corev1.PersistentVolumeSpec{ NodeAffinity: &corev1.VolumeNodeAffinity{ Required: &corev1.NodeSelector{ NodeSelectorTerms: []corev1.NodeSelectorTerm{ { MatchExpressions: []corev1.NodeSelectorRequirement{ { Key: "kubernetes.io/hostname", Operator: corev1.NodeSelectorOpIn, Values: []string{fmt.Sprintf("node-%d", i)}, }, }, }, }, }, }, }, }) } return objs }