mirror of
https://github.com/redhat-developer/odo.git
synced 2025-10-19 03:06:19 +03:00
323 lines
8.5 KiB
Go
323 lines
8.5 KiB
Go
package kclient
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/devfile/library/pkg/devfile/parser/data"
|
|
"github.com/google/go-cmp/cmp"
|
|
|
|
devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
|
|
"github.com/devfile/library/pkg/devfile/generator"
|
|
devfileParser "github.com/devfile/library/pkg/devfile/parser"
|
|
parsercommon "github.com/devfile/library/pkg/devfile/parser/data/v2/common"
|
|
"github.com/devfile/library/pkg/testingutil"
|
|
corev1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
|
|
odolabels "github.com/redhat-developer/odo/pkg/labels"
|
|
odoTestingUtil "github.com/redhat-developer/odo/pkg/testingutil"
|
|
|
|
ktesting "k8s.io/client-go/testing"
|
|
)
|
|
|
|
func TestCreateService(t *testing.T) {
|
|
|
|
devObj := devfileParser.DevfileObj{
|
|
Data: func() data.DevfileData {
|
|
devfileData, err := data.NewDevfileData(string(data.APISchemaVersion200))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
err = devfileData.AddComponents([]devfilev1.Component{testingutil.GetFakeContainerComponent("container1")})
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
return devfileData
|
|
}(),
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
componentName string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "Case: Valid component name",
|
|
componentName: "testComponent",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "Case: Invalid component name",
|
|
componentName: "",
|
|
wantErr: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// initialising the fakeclient
|
|
fkclient, fkclientset := FakeNew()
|
|
fkclient.Namespace = "default"
|
|
|
|
objectMeta := generator.GetObjectMeta(tt.componentName, "default", nil, nil)
|
|
|
|
labels := map[string]string{
|
|
"component": tt.componentName,
|
|
}
|
|
|
|
fkclientset.Kubernetes.PrependReactor("create", "services", func(action ktesting.Action) (bool, runtime.Object, error) {
|
|
if tt.componentName == "" {
|
|
return true, nil, fmt.Errorf("component name is empty")
|
|
}
|
|
service := corev1.Service{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: tt.componentName,
|
|
},
|
|
}
|
|
return true, &service, nil
|
|
})
|
|
|
|
serviceParams := generator.ServiceParams{
|
|
ObjectMeta: objectMeta,
|
|
SelectorLabels: labels,
|
|
}
|
|
|
|
service, err := generator.GetService(devObj, serviceParams, parsercommon.DevfileOptions{})
|
|
if err != nil {
|
|
t.Errorf("generator.GetService unexpected error %v", err)
|
|
}
|
|
|
|
createdService, err := fkclient.CreateService(*service)
|
|
|
|
// Checks for unexpected error cases
|
|
if !tt.wantErr == (err != nil) {
|
|
t.Errorf("fkclient.createService unexpected error %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
|
|
if err == nil {
|
|
if len(fkclientset.Kubernetes.Actions()) != 1 {
|
|
t.Errorf("expected 1 action, got: %v", fkclientset.Kubernetes.Actions())
|
|
} else {
|
|
if createdService.Name != tt.componentName {
|
|
t.Errorf("component name does not match the expected name, expected: %s, got %s", tt.componentName, createdService.Name)
|
|
}
|
|
}
|
|
}
|
|
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUpdateService(t *testing.T) {
|
|
|
|
devObj := devfileParser.DevfileObj{
|
|
Data: func() data.DevfileData {
|
|
devfileData, err := data.NewDevfileData(string(data.APISchemaVersion200))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
err = devfileData.AddComponents([]devfilev1.Component{testingutil.GetFakeContainerComponent("container1")})
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
return devfileData
|
|
}(),
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
componentName string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "Case: Valid component name",
|
|
componentName: "testComponent",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "Case: Invalid component name",
|
|
componentName: "",
|
|
wantErr: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// initialising the fakeclient
|
|
fkclient, fkclientset := FakeNew()
|
|
fkclient.Namespace = "default"
|
|
|
|
objectMeta := generator.GetObjectMeta(tt.componentName, "default", nil, nil)
|
|
|
|
labels := map[string]string{
|
|
"component": tt.componentName,
|
|
}
|
|
|
|
fkclientset.Kubernetes.PrependReactor("update", "services", func(action ktesting.Action) (bool, runtime.Object, error) {
|
|
if tt.componentName == "" {
|
|
return true, nil, fmt.Errorf("component name is empty")
|
|
}
|
|
service := corev1.Service{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: tt.componentName,
|
|
},
|
|
}
|
|
return true, &service, nil
|
|
})
|
|
|
|
serviceParams := generator.ServiceParams{
|
|
ObjectMeta: objectMeta,
|
|
SelectorLabels: labels,
|
|
}
|
|
|
|
service, err := generator.GetService(devObj, serviceParams, parsercommon.DevfileOptions{})
|
|
if err != nil {
|
|
t.Errorf("generator.GetService unexpected error %v", err)
|
|
}
|
|
|
|
updatedService, err := fkclient.UpdateService(*service)
|
|
|
|
// Checks for unexpected error cases
|
|
if !tt.wantErr == (err != nil) {
|
|
t.Errorf("fkclient.UpdateService unexpected error %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
|
|
if err == nil {
|
|
|
|
if len(fkclientset.Kubernetes.Actions()) != 1 {
|
|
t.Errorf("expected 1 action, got: %v", fkclientset.Kubernetes.Actions())
|
|
} else {
|
|
if updatedService.Name != tt.componentName {
|
|
t.Errorf("service name does not match the expected name, expected: %s, got %s", tt.componentName, updatedService.Name)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestListServices(t *testing.T) {
|
|
type args struct {
|
|
selector string
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
returnedServices corev1.ServiceList
|
|
want []corev1.Service
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "case 1: returned 3 services",
|
|
args: args{
|
|
selector: odolabels.GetSelector("nodejs", "app", odolabels.ComponentDevMode, false),
|
|
},
|
|
returnedServices: corev1.ServiceList{
|
|
Items: odoTestingUtil.FakeKubeServices("nodejs"),
|
|
},
|
|
want: odoTestingUtil.FakeKubeServices("nodejs"),
|
|
},
|
|
{
|
|
name: "case 2: no service returned",
|
|
args: args{
|
|
selector: odolabels.GetSelector("nodejs", "app", odolabels.ComponentDevMode, false),
|
|
},
|
|
returnedServices: corev1.ServiceList{
|
|
Items: nil,
|
|
},
|
|
want: nil,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// initialising the fakeclient
|
|
fkclient, fkclientset := FakeNew()
|
|
fkclient.Namespace = "default"
|
|
|
|
fkclientset.Kubernetes.PrependReactor("list", "services", func(action ktesting.Action) (bool, runtime.Object, error) {
|
|
return true, &tt.returnedServices, nil
|
|
})
|
|
|
|
got, err := fkclient.ListServices(tt.args.selector)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("ListServices() error = %v, wantErr %v", err, tt.wantErr)
|
|
return
|
|
}
|
|
if diff := cmp.Diff(tt.want, got); diff != "" {
|
|
t.Errorf("Client.ListServices() mismatch (-want +got):\n%s", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestClient_GetOneServiceFromSelector(t *testing.T) {
|
|
wantService := odoTestingUtil.FakeKubeService("nodejs", "nodejs-app")
|
|
|
|
type args struct {
|
|
selector string
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
returnedServices corev1.ServiceList
|
|
want *corev1.Service
|
|
wantErr bool
|
|
}{
|
|
|
|
{
|
|
name: "case 1: returned the correct service",
|
|
args: args{
|
|
selector: odolabels.GetSelector("nodejs", "app", odolabels.ComponentDevMode, false),
|
|
},
|
|
returnedServices: corev1.ServiceList{
|
|
Items: []corev1.Service{
|
|
odoTestingUtil.FakeKubeService("nodejs", "nodejs-app"),
|
|
},
|
|
},
|
|
want: &wantService,
|
|
},
|
|
{
|
|
name: "case 2: no service returned",
|
|
args: args{
|
|
selector: odolabels.GetSelector("nodejs", "app", odolabels.ComponentDevMode, false),
|
|
},
|
|
returnedServices: corev1.ServiceList{
|
|
Items: nil,
|
|
},
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "case 3: more than one service returned",
|
|
args: args{
|
|
selector: odolabels.GetSelector("nodejs", "app", odolabels.ComponentDevMode, false),
|
|
},
|
|
returnedServices: corev1.ServiceList{
|
|
Items: odoTestingUtil.FakeKubeServices("nodejs"),
|
|
},
|
|
wantErr: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// initialising the fakeclient
|
|
fkclient, fkclientset := FakeNew()
|
|
fkclient.Namespace = "default"
|
|
|
|
fkclientset.Kubernetes.PrependReactor("list", "services", func(action ktesting.Action) (bool, runtime.Object, error) {
|
|
return true, &tt.returnedServices, nil
|
|
})
|
|
|
|
got, err := fkclient.GetOneServiceFromSelector(tt.args.selector)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("GetOneServiceFromSelector() error = %v, wantErr %v", err, tt.wantErr)
|
|
return
|
|
}
|
|
if diff := cmp.Diff(tt.want, got); diff != "" {
|
|
t.Errorf("Client.GetOneServiceFromSelector() mismatch (-want +got):\n%s", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|