package k8s

import (
	appmesh "github.com/aws/aws-app-mesh-controller-for-k8s/apis/appmesh/v1beta2"
	"github.com/stretchr/testify/assert"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/types"
	"k8s.io/apimachinery/pkg/version"
	fakeDiscovery "k8s.io/client-go/discovery/fake"
	kubeTesting "k8s.io/client-go/testing"
	"testing"
)

func TestNamespacedName(t *testing.T) {
	tests := []struct {
		name string
		obj  metav1.Object
		want types.NamespacedName
	}{
		{
			name: "cluster-scoped object",
			obj: &appmesh.Mesh{
				ObjectMeta: metav1.ObjectMeta{
					Name: "global",
				},
			},
			want: types.NamespacedName{
				Namespace: "",
				Name:      "global",
			},
		},
		{
			name: "namespace-scoped object",
			obj: &appmesh.VirtualNode{
				ObjectMeta: metav1.ObjectMeta{
					Namespace: "namespace",
					Name:      "my-node",
				},
			},
			want: types.NamespacedName{
				Namespace: "namespace",
				Name:      "my-node",
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := NamespacedName(tt.obj)
			assert.Equal(t, tt.want, got)
		})
	}
}

func TestServerVersion(t *testing.T) {
	discovery := fakeDiscovery.FakeDiscovery{Fake: &kubeTesting.Fake{}}
	expectedVersion := "v1.0.0"
	discovery.FakedServerVersion = &version.Info{
		GitVersion: expectedVersion,
	}
	actualVersion := ServerVersion(&discovery)
	assert.Equal(t, expectedVersion, actualVersion)
}