che-operator/controllers/devworkspace/sync/sync_test.go

196 lines
4.0 KiB
Go

package sync
import (
"context"
"reflect"
"testing"
"github.com/devfile/devworkspace-operator/pkg/infrastructure"
"github.com/google/go-cmp/cmp"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
)
var (
scheme = runtime.NewScheme()
)
func init() {
infrastructure.InitializeForTesting(infrastructure.Kubernetes)
corev1.AddToScheme(scheme)
}
func TestSyncCreates(t *testing.T) {
preexisting := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "preexisting",
Namespace: "default",
},
}
new := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "new",
Namespace: "default",
},
}
cl := fake.NewFakeClientWithScheme(scheme, preexisting)
syncer := Syncer{client: cl, scheme: scheme}
syncer.Sync(context.TODO(), preexisting, new, cmp.Options{})
synced := &corev1.Pod{}
key := client.ObjectKey{Name: "new", Namespace: "default"}
cl.Get(context.TODO(), key, synced)
if synced.Name != "new" {
t.Error("The synced object should have the expected name")
}
if len(synced.OwnerReferences) == 0 {
t.Fatal("There should have been an owner reference set")
}
if synced.OwnerReferences[0].Name != "preexisting" {
t.Error("Unexpected owner reference")
}
}
func TestSyncUpdates(t *testing.T) {
preexisting := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "preexisting",
Namespace: "default",
OwnerReferences: []metav1.OwnerReference{
{
Name: "preexisting",
Kind: "Pod",
},
},
},
}
newOwner := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "newOwner",
Namespace: "default",
},
}
update := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "preexisting",
Namespace: "default",
Labels: map[string]string{
"a": "b",
},
},
}
cl := fake.NewFakeClientWithScheme(scheme, preexisting)
syncer := Syncer{client: cl, scheme: scheme}
syncer.Sync(context.TODO(), newOwner, update, cmp.Options{})
synced := &corev1.Pod{}
key := client.ObjectKey{Name: "preexisting", Namespace: "default"}
cl.Get(context.TODO(), key, synced)
if synced.Name != "preexisting" {
t.Error("The synced object should have the expected name")
}
if len(synced.OwnerReferences) == 0 {
t.Fatal("There should have been an owner reference set")
}
if synced.OwnerReferences[0].Name != "newOwner" {
t.Error("Unexpected owner reference")
}
if len(synced.GetLabels()) == 0 {
t.Fatal("There should have been labels on the synced object")
}
if synced.GetLabels()["a"] != "b" {
t.Error("Unexpected label")
}
}
func TestSyncKeepsAdditionalAnnosAndLabels(t *testing.T) {
preexisting := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "preexisting",
Namespace: "default",
Labels: map[string]string{
"a": "x",
"k": "v",
},
Annotations: map[string]string{
"a": "x",
"k": "v",
},
},
}
owner := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "owner",
Namespace: "default",
},
}
update := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "preexisting",
Namespace: "default",
Labels: map[string]string{
"a": "b",
"c": "d",
},
Annotations: map[string]string{
"a": "b",
"c": "d",
},
},
}
cl := fake.NewFakeClientWithScheme(scheme, preexisting)
syncer := Syncer{client: cl, scheme: scheme}
syncer.Sync(context.TODO(), owner, update, cmp.Options{})
synced := &corev1.Pod{}
key := client.ObjectKey{Name: "preexisting", Namespace: "default"}
cl.Get(context.TODO(), key, synced)
if synced.Name != "preexisting" {
t.Error("The synced object should have the expected name")
}
expectedValues := map[string]string{
"a": "b",
"k": "v",
"c": "d",
}
if !reflect.DeepEqual(expectedValues, synced.Labels) {
t.Fatal("Unexpected labels on the synced object")
}
if !reflect.DeepEqual(expectedValues, synced.Annotations) {
t.Fatal("Unexpected annotations on the synced object")
}
}