used an interface in place of variables for tests

This commit is contained in:
Anshul Verma 2023-02-28 21:27:15 +05:30
Родитель c14ab06f6f
Коммит 5258619380
3 изменённых файлов: 45 добавлений и 26 удалений

Просмотреть файл

@ -6,6 +6,7 @@ package cluster
import (
"context"
"github.com/Azure/go-autorest/autorest"
configclient "github.com/openshift/client-go/config/clientset/versioned"
machineclient "github.com/openshift/client-go/machine/clientset/versioned"
"github.com/sirupsen/logrus"
@ -14,10 +15,18 @@ import (
"github.com/Azure/ARO-RP/pkg/api"
"github.com/Azure/ARO-RP/pkg/env"
"github.com/Azure/ARO-RP/pkg/proxy"
"github.com/Azure/ARO-RP/pkg/util/azureclient"
"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/compute"
"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/features"
"github.com/Azure/ARO-RP/pkg/util/restconfig"
"github.com/Azure/ARO-RP/pkg/util/stringutils"
)
type ResourceFactory interface {
NewResourcesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) features.ResourcesClient
NewVirtualMachinesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) compute.VirtualMachinesClient
}
// FetchClient is the interface that the Admin Portal Frontend uses to gather
// information about clusters. It returns frontend-suitable data structures.
type FetchClient interface {
@ -49,6 +58,7 @@ type realFetcher struct {
kubernetesCli kubernetes.Interface
machineClient machineclient.Interface
azureSideFetcher azureSideFetcher
resourceFactory ResourceFactory
}
type azureSideFetcher struct {
@ -57,6 +67,16 @@ type azureSideFetcher struct {
env env.Interface
}
type resourceFactory struct{}
func (rf resourceFactory) NewResourcesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) features.ResourcesClient {
return features.NewResourcesClient(environment, subscriptionID, authorizer)
}
func (rf resourceFactory) NewVirtualMachinesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) compute.VirtualMachinesClient {
return compute.NewVirtualMachinesClient(environment, subscriptionID, authorizer)
}
func newAzureSideFetcher(resourceGroupName string, subscriptionDoc *api.SubscriptionDocument, env env.Interface) azureSideFetcher {
return azureSideFetcher{
resourceGroupName: resourceGroupName,
@ -65,7 +85,7 @@ func newAzureSideFetcher(resourceGroupName string, subscriptionDoc *api.Subscrip
}
}
func newRealFetcher(log *logrus.Entry, dialer proxy.Dialer, doc *api.OpenShiftClusterDocument, azureSideFetcher azureSideFetcher) (*realFetcher, error) {
func newRealFetcher(log *logrus.Entry, dialer proxy.Dialer, doc *api.OpenShiftClusterDocument, azureSideFetcher azureSideFetcher, resourceFactory ResourceFactory) (*realFetcher, error) {
restConfig, err := restconfig.RestConfig(dialer, doc.OpenShiftCluster)
if err != nil {
log.Error(err)
@ -95,14 +115,15 @@ func newRealFetcher(log *logrus.Entry, dialer proxy.Dialer, doc *api.OpenShiftCl
kubernetesCli: kubernetesCli,
machineClient: machineClient,
azureSideFetcher: azureSideFetcher,
resourceFactory: resourceFactory,
}, nil
}
func NewFetchClient(log *logrus.Entry, dialer proxy.Dialer, cluster *api.OpenShiftClusterDocument, subscriptionDoc *api.SubscriptionDocument, env env.Interface) (FetchClient, error) {
resourceGroupName := stringutils.LastTokenByte(cluster.OpenShiftCluster.Properties.ClusterProfile.ResourceGroupID, '/')
azureSideFetcher := newAzureSideFetcher(resourceGroupName, subscriptionDoc, env)
fetcher, err := newRealFetcher(log, dialer, cluster, azureSideFetcher)
rf := resourceFactory{}
fetcher, err := newRealFetcher(log, dialer, cluster, azureSideFetcher, rf)
if err != nil {
return nil, err
}

Просмотреть файл

@ -14,13 +14,8 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/compute"
"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/features"
)
// Creating local vars for these functions in order to make them swappable to make them testable. The function definition will is altered in the tests written.
var newResourceClientFunction = features.NewResourcesClient
var newVirtualMachineClientFunction = compute.NewVirtualMachinesClient
type MachinesInformation struct {
Name string `json:"name"`
CreatedTime string `json:"createdTime"`
@ -82,15 +77,13 @@ func (f *realFetcher) VMAllocationStatus(ctx context.Context) (map[string]string
if err != nil {
return nil, err
}
// Getting Virtual Machine resources through the Cluster's Resource Group
computeResources, err := newResourceClientFunction(env.Environment(), subscriptionDoc.ID, fpAuth).ListByResourceGroup(ctx, clusterRGName, "resourceType eq 'Microsoft.Compute/virtualMachines'", "", nil)
computeResources, err := f.resourceFactory.NewResourcesClient(env.Environment(), subscriptionDoc.ID, fpAuth).ListByResourceGroup(ctx, clusterRGName, "resourceType eq 'Microsoft.Compute/virtualMachines'", "", nil)
if err != nil {
return nil, err
}
vmAllocationStatus := make(map[string]string)
virtualMachineClient := newVirtualMachineClientFunction(env.Environment(), subscriptionDoc.ID, fpAuth)
virtualMachineClient := f.resourceFactory.NewVirtualMachinesClient(env.Environment(), subscriptionDoc.ID, fpAuth)
for _, res := range computeResources {
putAllocationStatusToMap(ctx, clusterRGName, vmAllocationStatus, res, virtualMachineClient, f.log)
}

Просмотреть файл

@ -112,25 +112,28 @@ func TestMachines(t *testing.T) {
}
}
type mockResourceFactory struct {
mockResourcesClient *mock_features.MockResourcesClient
mockVirtualMachinesClient *mock_compute.MockVirtualMachinesClient
}
func newMockResourceFactory(mockResourcesClient *mock_features.MockResourcesClient, mockVirtualMachinesClient *mock_compute.MockVirtualMachinesClient) mockResourceFactory {
return mockResourceFactory{mockResourcesClient: mockResourcesClient, mockVirtualMachinesClient: mockVirtualMachinesClient}
}
func (mrf mockResourceFactory) NewResourcesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) features.ResourcesClient {
return mrf.mockResourcesClient
}
func (mrf mockResourceFactory) NewVirtualMachinesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) compute.VirtualMachinesClient {
return mrf.mockVirtualMachinesClient
}
func TestVMAllocationStatus(t *testing.T) {
ctx := context.Background()
controller := gomock.NewController(t)
mockResourcesClient := mock_features.NewMockResourcesClient(controller)
mockVirtualMachinesClient := mock_compute.NewMockVirtualMachinesClient(controller)
newResourceClientFunction = func(environment *azureclient.AROEnvironment,
subscriptionID string,
authorizer autorest.Authorizer) features.ResourcesClient {
return mockResourcesClient
}
newVirtualMachineClientFunction = func(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) compute.VirtualMachinesClient {
return mockVirtualMachinesClient
}
defer func() {
newResourceClientFunction = features.NewResourcesClient
newVirtualMachineClientFunction = compute.NewVirtualMachinesClient
}()
type test struct {
name string
mocks func(*test, *mock_env.MockInterface, *mock_refreshable.MockAuthorizer, *mock_features.MockResourcesClient, *mock_compute.MockVirtualMachinesClient)
@ -245,9 +248,11 @@ func TestVMAllocationStatus(t *testing.T) {
env: mockEnv,
subscriptionDoc: subscriptionDoc,
}
mrf := newMockResourceFactory(mockResourcesClient, mockVirtualMachinesClient)
realFetcher := &realFetcher{
log: log,
azureSideFetcher: azureSideFetcher,
resourceFactory: mrf,
}
client := &client{fetcher: realFetcher, log: log}
_, err := client.VMAllocationStatus(ctx)