Files
odo/pkg/component/component_test.go
Philippe Martin cb1546a67e odo describe component (#5725)
* odo describe component

* More fields on named describe

* Doc

* Update pkg/odo/cli/describe/component.go

Co-authored-by: Parthvi Vala <pvala@redhat.com>

* Update pkg/odo/cli/describe/component.go

Co-authored-by: Parthvi Vala <pvala@redhat.com>

* Update pkg/odo/cli/describe/component.go

Co-authored-by: Parthvi Vala <pvala@redhat.com>

* Add Describef

* Parthvi review

* Fix rebase

Co-authored-by: Parthvi Vala <pvala@redhat.com>
2022-05-12 06:30:47 -04:00

291 lines
8.6 KiB
Go

package component
import (
"errors"
"reflect"
"testing"
devfilepkg "github.com/devfile/api/v2/pkg/devfile"
"github.com/golang/mock/gomock"
"github.com/kylelemons/godebug/pretty"
"github.com/redhat-developer/odo/pkg/kclient"
"github.com/redhat-developer/odo/pkg/labels"
"github.com/redhat-developer/odo/pkg/api"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)
func TestListAllClusterComponents(t *testing.T) {
res1 := getUnstructured("dep1", "deployment", "v1", "Unknown", "Unknown", "my-ns")
res2 := getUnstructured("svc1", "service", "v1", "odo", "nodejs", "my-ns")
type fields struct {
kubeClient func(ctrl *gomock.Controller) kclient.ClientInterface
}
type args struct {
namespace string
}
tests := []struct {
name string
fields fields
args args
want []OdoComponent
wantErr bool
}{
{
name: "1 non-odo resource returned with Unknown",
fields: fields{
kubeClient: func(ctrl *gomock.Controller) kclient.ClientInterface {
var resources []unstructured.Unstructured
resources = append(resources, res1)
client := kclient.NewMockClientInterface(ctrl)
selector := ""
client.EXPECT().GetAllResourcesFromSelector(selector, "my-ns").Return(resources, nil)
return client
},
},
args: args{
namespace: "my-ns",
},
want: []OdoComponent{{
Name: "dep1",
ManagedBy: "Unknown",
Modes: map[string]bool{},
Type: "Unknown",
}},
wantErr: false,
},
{
name: "1 non-odo resource returned with Unknown, and 1 odo resource returned with odo",
fields: fields{
kubeClient: func(ctrl *gomock.Controller) kclient.ClientInterface {
var resources []unstructured.Unstructured
resources = append(resources, res1, res2)
client := kclient.NewMockClientInterface(ctrl)
selector := ""
client.EXPECT().GetAllResourcesFromSelector(selector, "my-ns").Return(resources, nil)
return client
},
},
args: args{
namespace: "my-ns",
},
want: []OdoComponent{{
Name: "dep1",
ManagedBy: "Unknown",
Modes: map[string]bool{},
Type: "Unknown",
}, {
Name: "svc1",
ManagedBy: "odo",
Modes: map[string]bool{},
Type: "nodejs",
}},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
got, err := ListAllClusterComponents(tt.fields.kubeClient(ctrl), tt.args.namespace)
if (err != nil) != tt.wantErr {
t.Errorf("ListAllClusterComponents error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("ListAllClusterComponents got = %+v\nwant = %+v\ncomparison:\n %v", got, tt.want, pretty.Compare(got, tt.want))
}
})
}
}
func TestGetComponentTypeFromDevfileMetadata(t *testing.T) {
tests := []devfilepkg.DevfileMetadata{
{
Name: "ReturnProject",
ProjectType: "Maven",
Language: "Java",
},
{
Name: "ReturnLanguage",
Language: "Java",
},
{
Name: "ReturnNA",
},
}
for _, tt := range tests {
t.Run(tt.Name, func(t *testing.T) {
var want string
got := GetComponentTypeFromDevfileMetadata(tt)
switch tt.Name {
case "ReturnProject":
want = tt.ProjectType
case "ReturnLanguage":
want = tt.Language
case "ReturnNA":
want = NotAvailable
}
if got != want {
t.Errorf("Incorrect component type returned; got: %q, want: %q", got, want)
}
})
}
}
// getUnstructured returns an unstructured.Unstructured object
func getUnstructured(name, kind, apiVersion, managed, componentType, namespace string) (u unstructured.Unstructured) {
u.SetName(name)
u.SetKind(kind)
u.SetAPIVersion(apiVersion)
u.SetNamespace(namespace)
u.SetLabels(labels.Builder().
WithComponentName(name).
WithManager(managed).
Labels())
u.SetAnnotations(labels.Builder().
WithProjectType(componentType).
Labels())
return
}
func TestGetRunningModes(t *testing.T) {
resourceDev1 := unstructured.Unstructured{}
resourceDev1.SetLabels(labels.Builder().WithMode(labels.ComponentDevMode).Labels())
resourceDev2 := unstructured.Unstructured{}
resourceDev2.SetLabels(labels.Builder().WithMode(labels.ComponentDevMode).Labels())
resourceDeploy1 := unstructured.Unstructured{}
resourceDeploy1.SetLabels(labels.Builder().WithMode(labels.ComponentDeployMode).Labels())
resourceDeploy2 := unstructured.Unstructured{}
resourceDeploy2.SetLabels(labels.Builder().WithMode(labels.ComponentDeployMode).Labels())
otherResource := unstructured.Unstructured{}
packageManifestResource := unstructured.Unstructured{}
packageManifestResource.SetKind("PackageManifest")
packageManifestResource.SetLabels(labels.Builder().WithMode(labels.ComponentDevMode).Labels())
type args struct {
client func(ctrl *gomock.Controller) kclient.ClientInterface
name string
}
tests := []struct {
name string
args args
want []api.RunningMode
wantErr bool
}{
{
name: "No resources",
args: args{
client: func(ctrl *gomock.Controller) kclient.ClientInterface {
c := kclient.NewMockClientInterface(ctrl)
c.EXPECT().GetCurrentNamespace().Return("a-namespace").AnyTimes()
c.EXPECT().GetAllResourcesFromSelector(gomock.Any(), gomock.Any()).Return([]unstructured.Unstructured{}, nil)
return c
},
name: "aname",
},
want: nil,
wantErr: true,
},
{
name: "Only PackageManifest resource",
args: args{
client: func(ctrl *gomock.Controller) kclient.ClientInterface {
c := kclient.NewMockClientInterface(ctrl)
c.EXPECT().GetCurrentNamespace().Return("a-namespace").AnyTimes()
c.EXPECT().GetAllResourcesFromSelector(gomock.Any(), gomock.Any()).Return([]unstructured.Unstructured{packageManifestResource}, nil)
return c
},
name: "aname",
},
want: nil,
wantErr: true,
},
{
name: "No dev/deploy resources",
args: args{
client: func(ctrl *gomock.Controller) kclient.ClientInterface {
c := kclient.NewMockClientInterface(ctrl)
c.EXPECT().GetCurrentNamespace().Return("a-namespace").AnyTimes()
c.EXPECT().GetAllResourcesFromSelector(gomock.Any(), gomock.Any()).Return([]unstructured.Unstructured{packageManifestResource, otherResource}, nil)
return c
},
name: "aname",
},
want: []api.RunningMode{},
},
{
name: "Only Dev resources",
args: args{
client: func(ctrl *gomock.Controller) kclient.ClientInterface {
c := kclient.NewMockClientInterface(ctrl)
c.EXPECT().GetCurrentNamespace().Return("a-namespace").AnyTimes()
c.EXPECT().GetAllResourcesFromSelector(gomock.Any(), gomock.Any()).Return([]unstructured.Unstructured{packageManifestResource, otherResource, resourceDev1, resourceDev2}, nil)
return c
},
name: "aname",
},
want: []api.RunningMode{api.RunningModeDev},
},
{
name: "Only Deploy resources",
args: args{
client: func(ctrl *gomock.Controller) kclient.ClientInterface {
c := kclient.NewMockClientInterface(ctrl)
c.EXPECT().GetCurrentNamespace().Return("a-namespace").AnyTimes()
c.EXPECT().GetAllResourcesFromSelector(gomock.Any(), gomock.Any()).Return([]unstructured.Unstructured{packageManifestResource, otherResource, resourceDeploy1, resourceDeploy2}, nil)
return c
},
name: "aname",
},
want: []api.RunningMode{api.RunningModeDeploy},
},
{
name: "Dev and Deploy resources",
args: args{
client: func(ctrl *gomock.Controller) kclient.ClientInterface {
c := kclient.NewMockClientInterface(ctrl)
c.EXPECT().GetCurrentNamespace().Return("a-namespace").AnyTimes()
c.EXPECT().GetAllResourcesFromSelector(gomock.Any(), gomock.Any()).Return([]unstructured.Unstructured{packageManifestResource, otherResource, resourceDev1, resourceDev2, resourceDeploy1, resourceDeploy2}, nil)
return c
},
name: "aname",
},
want: []api.RunningMode{api.RunningModeDev, api.RunningModeDeploy},
},
{
name: "Unknown",
args: args{
client: func(ctrl *gomock.Controller) kclient.ClientInterface {
c := kclient.NewMockClientInterface(ctrl)
c.EXPECT().GetCurrentNamespace().Return("a-namespace").AnyTimes()
c.EXPECT().GetAllResourcesFromSelector(gomock.Any(), gomock.Any()).Return(nil, errors.New("error"))
return c
},
name: "aname",
},
want: []api.RunningMode{api.RunningModeUnknown},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
got, err := GetRunningModes(tt.args.client(ctrl), tt.args.name)
if (err != nil) != tt.wantErr {
t.Errorf("error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("GetRunningModes() = %v, want %v", got, tt.want)
}
})
}
}