4302070c创建于 2025年7月17日历史提交
/*
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * openFuyao is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

package k8s

import (
	"errors"
	"testing"

	"github.com/agiledragon/gomonkey/v2"
	snapshotclient "github.com/kubernetes-csi/external-snapshotter/client/v4/clientset/versioned"
	"github.com/stretchr/testify/assert"
	apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
)

func TestNewKubernetesClient(t *testing.T) {

	t.Run("missing config", func(t *testing.T) {
		_, err := NewKubernetesClient(&KubernetesCfg{})
		assert.Error(t, err)
	})

	t.Run("snapshot client error", func(t *testing.T) {
		patches := gomonkey.NewPatches()
		defer patches.Reset()

		patches.ApplyFunc(kubernetes.NewForConfig, func(*rest.Config) (kubernetes.Interface, error) {
			return &kubernetes.Clientset{}, nil
		})
		patches.ApplyFunc(snapshotclient.NewForConfig, func(*rest.Config) (snapshotclient.Interface, error) {
			return nil, errors.New("snapshot error")
		})

		_, err := NewKubernetesClient(&KubernetesCfg{KubeConfig: &rest.Config{}})
		assert.Error(t, err)
	})

	t.Run("api extensions error", func(t *testing.T) {
		patches := gomonkey.NewPatches()
		defer patches.Reset()

		patches.ApplyFunc(kubernetes.NewForConfig, func(*rest.Config) (kubernetes.Interface, error) {
			return &kubernetes.Clientset{}, nil
		})
		patches.ApplyFunc(snapshotclient.NewForConfig, func(*rest.Config) (snapshotclient.Interface, error) {
			return &snapshotclient.Clientset{}, nil
		})
		patches.ApplyFunc(apiextensionsclient.NewForConfig, func(*rest.Config) (apiextensionsclient.Interface, error) {
			return nil, errors.New("api extensions error")
		})

		_, err := NewKubernetesClient(&KubernetesCfg{KubeConfig: &rest.Config{}})
		assert.Error(t, err)
	})
}

func TestKubernetesClientMethods(t *testing.T) {
	kc := &kubernetesClient{
		k8s:           &kubernetes.Clientset{},
		snapshot:      &snapshotclient.Clientset{},
		apiExtensions: &apiextensionsclient.Clientset{},
		config:        &rest.Config{},
	}

	assert.NotNil(t, kc.Kubernetes())
	assert.NotNil(t, kc.Snapshot())
	assert.NotNil(t, kc.ApiExtensions())
	assert.NotNil(t, kc.Config())
}