Skip to content

Commit 5f4bb0b

Browse files
committed
Add provisioner mock test and test tag
Signed-off-by: Shobha M <mshobha@vmware.com>
1 parent 6dd6495 commit 5f4bb0b

File tree

7 files changed

+227
-9
lines changed

7 files changed

+227
-9
lines changed

.github/workflows/release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
- 'v*'
77

88
env:
9-
BUILD_TAGS: 'akscluster cluster clustergroup credential ekscluster gitrepository iampolicy kustomization namespace custompolicy imagepolicy networkpolicy quotapolicy securitypolicy sourcesecret workspace tanzupackage tanzupackages packagerepository packageinstall clustersecret integration mutationpolicy backupschedule targetlocation dataprotection tanzukubernetescluster clusterclass managementcluster'
9+
BUILD_TAGS: 'akscluster cluster clustergroup credential ekscluster gitrepository iampolicy kustomization namespace custompolicy imagepolicy networkpolicy quotapolicy securitypolicy sourcesecret workspace tanzupackage tanzupackages packagerepository packageinstall clustersecret integration mutationpolicy backupschedule targetlocation dataprotection tanzukubernetescluster clusterclass managementcluster provisioner'
1010

1111
jobs:
1212
goreleaser:

.github/workflows/test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: Test and coverage
33
on: [pull_request, push]
44

55
env:
6-
BUILD_TAGS: 'akscluster cluster clustergroup credential ekscluster gitrepository iampolicy kustomization namespace custompolicy imagepolicy networkpolicy quotapolicy securitypolicy sourcesecret workspace tanzupackage tanzupackages packagerepository packageinstall clustersecret integration mutationpolicy backupschedule targetlocation dataprotection tanzukubernetescluster clusterclass managementcluster'
6+
BUILD_TAGS: 'akscluster cluster clustergroup credential ekscluster gitrepository iampolicy kustomization namespace custompolicy imagepolicy networkpolicy quotapolicy securitypolicy sourcesecret workspace tanzupackage tanzupackages packagerepository packageinstall clustersecret integration mutationpolicy backupschedule targetlocation dataprotection tanzukubernetescluster clusterclass managementcluster provisioner'
77
jobs:
88
build:
99
name: Test and coverage

.golangci.yml

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ run:
8989
- helmfeature
9090
- helmrelease
9191
- managementcluster
92+
- provisioner
9293

9394
linters-settings:
9495
funlen:

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ ifeq ($(TEST_FLAGS),)
2222
endif
2323

2424
ifeq ($(BUILD_TAGS),)
25-
BUILD_TAGS := 'akscluster cluster clustergroup credential ekscluster gitrepository iampolicy kustomization namespace custompolicy imagepolicy networkpolicy quotapolicy securitypolicy sourcesecret workspace tanzupackage tanzupackages packagerepository packageinstall clustersecret integration mutationpolicy helmfeature helmrelease backupschedule targetlocation dataprotection tanzukubernetescluster clusterclass managementcluster'
25+
BUILD_TAGS := 'akscluster cluster clustergroup credential ekscluster gitrepository iampolicy kustomization namespace custompolicy imagepolicy networkpolicy quotapolicy securitypolicy sourcesecret workspace tanzupackage tanzupackages packagerepository packageinstall clustersecret integration mutationpolicy helmfeature helmrelease backupschedule targetlocation dataprotection tanzukubernetescluster clusterclass managementcluster provisioner'
2626
endif
2727

2828
.PHONY: build clean-up test gofmt vet lint acc-test website-lint website-lint-fix
Original file line numberDiff line numberDiff line change
@@ -1 +1,166 @@
1+
/*
2+
Copyright © 2023 VMware, Inc. All Rights Reserved.
3+
SPDX-License-Identifier: MPL-2.0
4+
*/
5+
16
package provisioner
7+
8+
import (
9+
"encoding/json"
10+
"fmt"
11+
"io"
12+
"net/http"
13+
"os"
14+
"testing"
15+
16+
"github.com/go-test/deep"
17+
"github.com/jarcoal/httpmock"
18+
19+
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/helper"
20+
objectmetamodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/objectmeta"
21+
provisionermodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/provisioner"
22+
)
23+
24+
func setupHTTPMocks(t *testing.T) {
25+
httpmock.Activate()
26+
t.Cleanup(httpmock.Deactivate)
27+
}
28+
29+
const (
30+
https = "https:/"
31+
apiVersion = "v1alpha1"
32+
mgmtClusters = "managementclusters"
33+
provisioners = "provisioners"
34+
)
35+
36+
func setUpProvisionerEndPointMocks(t *testing.T, endpoint, prvName string) {
37+
provisionerRequest := &provisionermodel.VmwareTanzuManageV1alpha1ManagementclusterProvisionerCreateProvisionerRequest{}
38+
39+
provisionerResponse := &provisionermodel.VmwareTanzuManageV1alpha1ManagementclusterProvisionerCreateProvisionerResponse{
40+
Provisioner: &provisionermodel.VmwareTanzuManageV1alpha1ManagementclusterProvisionerProvisioner{
41+
FullName: &provisionermodel.VmwareTanzuManageV1alpha1ManagementclusterProvisionerFullName{
42+
ManagementClusterName: eksManagementCluster,
43+
Name: prvName,
44+
},
45+
Meta: &objectmetamodel.VmwareTanzuCoreV1alpha1ObjectMeta{
46+
Description: "resource with description",
47+
Labels: map[string]string{
48+
"key1": "value1",
49+
"key2": "value2",
50+
},
51+
UID: "dummy-uid-1234",
52+
ResourceVersion: "res-version",
53+
},
54+
},
55+
}
56+
57+
createProvisionerEndpoint := helper.ConstructRequestURL(https, endpoint, apiVersion, mgmtClusters, eksManagementCluster, provisioners).String()
58+
readProvisionerEndpoint := helper.ConstructRequestURL(https, endpoint, apiVersion, mgmtClusters, eksManagementCluster, provisioners, prvName).String()
59+
deleteProvisionerEndpoint := helper.ConstructRequestURL(https, endpoint, apiVersion, mgmtClusters, eksManagementCluster, provisioners, prvName).String()
60+
61+
httpmock.RegisterResponder("POST", createProvisionerEndpoint,
62+
bodyInspectingResponder(t, provisionerRequest, http.StatusOK, provisionerResponse))
63+
64+
httpmock.RegisterResponder("GET", readProvisionerEndpoint,
65+
bodyInspectingResponder(t, nil, http.StatusOK, provisionerResponse))
66+
67+
httpmock.RegisterResponder("PUT", readProvisionerEndpoint,
68+
bodyInspectingResponder(t, nil, http.StatusOK, provisionerResponse))
69+
70+
httpmock.RegisterResponder("GET", readProvisionerEndpoint,
71+
bodyInspectingResponder(t, nil, http.StatusOK, provisionerResponse))
72+
73+
httpmock.RegisterResponder("DELETE", deleteProvisionerEndpoint, changeStateResponder(
74+
func() {
75+
httpmock.RegisterResponder("GET", readProvisionerEndpoint,
76+
httpmock.NewStringResponder(http.StatusBadRequest, "Not found"))
77+
},
78+
http.StatusOK,
79+
nil))
80+
}
81+
82+
func setUpHTTPMockUpdate(t *testing.T, prvName string) {
83+
endpoint := os.Getenv("TMC_ENDPOINT")
84+
85+
provisionerResponse := &provisionermodel.VmwareTanzuManageV1alpha1ManagementclusterProvisionerCreateProvisionerResponse{
86+
Provisioner: &provisionermodel.VmwareTanzuManageV1alpha1ManagementclusterProvisionerProvisioner{
87+
FullName: &provisionermodel.VmwareTanzuManageV1alpha1ManagementclusterProvisionerFullName{
88+
ManagementClusterName: eksManagementCluster,
89+
Name: prvName,
90+
},
91+
Meta: &objectmetamodel.VmwareTanzuCoreV1alpha1ObjectMeta{
92+
Description: "resource with updated description",
93+
Labels: map[string]string{
94+
"key1": "value1",
95+
"key2": "value2",
96+
"key3": "value3",
97+
},
98+
UID: "dummy-uid-1234",
99+
ResourceVersion: "res-version",
100+
},
101+
},
102+
}
103+
104+
readProvisionerEndpoint := helper.ConstructRequestURL(https, endpoint, apiVersion, mgmtClusters, eksManagementCluster, provisioners, prvName).String()
105+
106+
httpmock.RegisterResponder("GET", readProvisionerEndpoint,
107+
bodyInspectingResponder(t, nil, 200, provisionerResponse))
108+
}
109+
110+
//nolint:unparam
111+
func bodyInspectingResponder(t *testing.T, expectedContent interface{}, successResponse int, successResponseBody interface{}) httpmock.Responder {
112+
return func(r *http.Request) (*http.Response, error) {
113+
successFunc := func() (*http.Response, error) {
114+
return httpmock.NewJsonResponse(successResponse, successResponseBody)
115+
}
116+
117+
if expectedContent == nil {
118+
return successFunc()
119+
}
120+
121+
// Compare to expected content.
122+
expectedBytes, err := json.Marshal(expectedContent)
123+
if err != nil {
124+
t.Fail()
125+
return nil, err
126+
}
127+
128+
if r.Body == nil {
129+
t.Fail()
130+
return nil, fmt.Errorf("expected body on request")
131+
}
132+
133+
bodyBytes, err := io.ReadAll(r.Body)
134+
if err != nil {
135+
t.Fail()
136+
return nil, err
137+
}
138+
139+
var bodyInterface map[string]interface{}
140+
if err = json.Unmarshal(bodyBytes, &bodyInterface); err == nil {
141+
var expectedInterface map[string]interface{}
142+
143+
err = json.Unmarshal(expectedBytes, &expectedInterface)
144+
if err != nil {
145+
return nil, err
146+
}
147+
148+
diff := deep.Equal(bodyInterface, expectedInterface)
149+
if diff == nil {
150+
return successFunc()
151+
}
152+
} else {
153+
return nil, err
154+
}
155+
156+
return successFunc()
157+
}
158+
}
159+
160+
// Register a new responder when the given call is made.
161+
func changeStateResponder(registerFunc func(), successResponse int, successResponseBody interface{}) httpmock.Responder {
162+
return func(r *http.Request) (*http.Response, error) {
163+
registerFunc()
164+
return httpmock.NewJsonResponse(successResponse, successResponseBody)
165+
}
166+
}

internal/resources/provisioner/provisioner_provider_test.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ SPDX-License-Identifier: MPL-2.0
99
package provisioner
1010

1111
import (
12+
"context"
13+
"os"
1214
"testing"
1315

16+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1417
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1518
"github.com/stretchr/testify/require"
1619

@@ -26,11 +29,19 @@ func initTestProvider(t *testing.T) *schema.Provider {
2629
DataSourcesMap: map[string]*schema.Resource{
2730
ResourceName: DataSourceProvisioner(),
2831
},
29-
ConfigureContextFunc: authctx.ProviderConfigureContext,
32+
ConfigureContextFunc: getConfigureContextFunc(),
3033
}
3134
if err := testAccProvider.InternalValidate(); err != nil {
3235
require.NoError(t, err)
3336
}
3437

3538
return testAccProvider
3639
}
40+
41+
func getConfigureContextFunc() func(_ context.Context, d *schema.ResourceData) (interface{}, diag.Diagnostics) {
42+
if _, found := os.LookupEnv("ENABLE_PROVISIONER_ENV_TEST"); !found {
43+
return authctx.ProviderConfigureContextWithDefaultTransportForTesting
44+
}
45+
46+
return authctx.ProviderConfigureContext
47+
}

internal/resources/provisioner/provisioner_resource_test.go

+46-5
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121

2222
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/authctx"
2323
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/client/proxy"
24-
provisioner "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/provisioner"
24+
provisionermodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/provisioner"
2525
testhelper "github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/testing"
2626
)
2727

@@ -31,6 +31,32 @@ func TestAcceptanceForProvisionerResource(t *testing.T) {
3131
provisionerResourceName := fmt.Sprintf("%s.%s", ResourceName, resourceVar)
3232
provisionerName := acctest.RandomWithPrefix("tf-prv-test")
3333

34+
_, enableProvisionerEnvTest := os.LookupEnv("ENABLE_PROVISIONER_ENV_TEST")
35+
36+
if !enableProvisionerEnvTest {
37+
endpoint := "play.abc.def.ghi.com"
38+
39+
os.Setenv("TF_ACC", "true")
40+
os.Setenv(authctx.ServerEndpointEnvVar, endpoint)
41+
os.Setenv("VMW_CLOUD_API_TOKEN", "dummy")
42+
os.Setenv("VMW_CLOUD_ENDPOINT", "console.cloud.vmware.com")
43+
44+
setupHTTPMocks(t)
45+
setUpProvisionerEndPointMocks(t, endpoint, provisionerName)
46+
} else {
47+
requiredVars := []string{
48+
"VMW_CLOUD_ENDPOINT",
49+
"TMC_ENDPOINT",
50+
"VMW_CLOUD_API_TOKEN",
51+
}
52+
53+
for _, name := range requiredVars {
54+
if _, found := os.LookupEnv(name); !found {
55+
t.Errorf("required environment variable '%s' missing", name)
56+
}
57+
}
58+
}
59+
3460
resource.Test(t, resource.TestCase{
3561
PreCheck: testhelper.TestPreCheck(t),
3662
ProviderFactories: testhelper.GetTestProviderFactories(provider),
@@ -43,6 +69,13 @@ func TestAcceptanceForProvisionerResource(t *testing.T) {
4369
),
4470
},
4571
{
72+
PreConfig: func() {
73+
if !enableProvisionerEnvTest {
74+
t.Log("Setting up the updated GET mock responder...")
75+
setupHTTPMocks(t)
76+
setUpHTTPMockUpdate(t, provisionerName)
77+
}
78+
},
4679
Config: updateTestProvisionerWithResourceConfigValue(provisionerName),
4780
Check: resource.ComposeTestCheckFunc(
4881
checkUpdateResourceAttributes(provider, provisionerResourceName, provisionerName),
@@ -118,20 +151,20 @@ func verifyProvisionerResourceCreation(
118151
return fmt.Errorf("ID not set, resource: %s", resourceName)
119152
}
120153

121-
config := authctx.TanzuContext{
154+
config := &authctx.TanzuContext{
122155
ServerEndpoint: os.Getenv(authctx.ServerEndpointEnvVar),
123156
Token: os.Getenv(authctx.VMWCloudAPITokenEnvVar),
124157
VMWCloudEndPoint: os.Getenv(authctx.VMWCloudEndpointEnvVar),
125158
TLSConfig: &proxy.TLSConfig{},
126159
}
127160

128-
err := config.Setup()
161+
err := getSetupConfig(config)
129162
if err != nil {
130163
return errors.Wrap(err, "unable to set the context")
131164
}
132165

133-
fn := &provisioner.VmwareTanzuManageV1alpha1ManagementclusterProvisionerFullName{
134-
ManagementClusterName: "eks",
166+
fn := &provisionermodel.VmwareTanzuManageV1alpha1ManagementclusterProvisionerFullName{
167+
ManagementClusterName: eksManagementCluster,
135168
Name: provisionerName,
136169
}
137170

@@ -148,6 +181,14 @@ func verifyProvisionerResourceCreation(
148181
}
149182
}
150183

184+
func getSetupConfig(config *authctx.TanzuContext) error {
185+
if _, found := os.LookupEnv("ENABLE_PROVISIONER_ENV_TEST"); !found {
186+
return config.SetupWithDefaultTransportForTesting()
187+
}
188+
189+
return config.Setup()
190+
}
191+
151192
func metaResourceAttributeCheck(resourceName string) []resource.TestCheckFunc {
152193
return []resource.TestCheckFunc{
153194
resource.TestCheckResourceAttr(resourceName, "meta.#", "1"),

0 commit comments

Comments
 (0)