Skip to content

Commit 61afac7

Browse files
committed
chore(azure): consolidate test files and add WithClient variants for all modules
Test cleanup: - Delete old //go:build azure integration test stubs that required real Azure credentials and were never run in CI - Rename _withclient_test.go files to _test.go - Delete azure.go (package doc moved to client_factory.go) WithClient extraction (all remaining modules): - compute.go: GetVirtualMachineWithClient, ListVirtualMachinesForResourceGroupWithClient, GetVirtualMachinesForResourceGroupWithClient - storage.go: GetStorageAccountPropertyWithClient, GetStorageBlobContainerWithClient, GetStorageFileShareWithClient - appService.go: GetAppServiceWithClient - keyvault.go: GetKeyVaultWithClient - container_apps.go: GetManagedEnvironmentWithClient, GetContainerAppWithClient, GetContainerAppJobWithClient - datafactory.go: GetDataFactoryWithClient - privatednszone.go: GetPrivateDNSZoneWithClient - mysql.go: GetMYSQLServerWithClient, GetMYSQLDBWithClient, ListMySQLDBWithClient - postgresql.go: GetPostgreSQLServerWithClient, GetPostgreSQLDBWithClient, ListPostgreSQLDBWithClient - sql.go: GetSQLServerWithClient, GetSQLDatabaseWithClient, ListSQLServerDatabasesWithClient - sql_managedinstance.go: GetManagedInstanceWithClient, GetManagedInstanceDatabaseWithClient - synapse.go: GetSynapseWorkspaceWithClient, GetSynapseSQLPoolWithClient - nsg.go: GetDefaultNSGRulesWithClient, GetCustomNSGRulesWithClient Every module file now has azfake unit tests.
1 parent 86f6eab commit 61afac7

54 files changed

Lines changed: 3308 additions & 2580 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

modules/azure/appService.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,13 @@ func GetAppServiceContextE(ctx context.Context, appName string, resGroupName str
8787
return nil, err
8888
}
8989

90-
resp, err := client.Get(ctx, rgName, appName, nil)
90+
return GetAppServiceWithClient(ctx, client, rgName, appName)
91+
}
92+
93+
// GetAppServiceWithClient gets the App service object using the provided client.
94+
// This variant is useful for testing with fake clients.
95+
func GetAppServiceWithClient(ctx context.Context, client *armappservice.WebAppsClient, resourceGroupName string, appName string) (*armappservice.Site, error) {
96+
resp, err := client.Get(ctx, resourceGroupName, appName, nil)
9197
if err != nil {
9298
return nil, err
9399
}

modules/azure/appService_test.go

Lines changed: 80 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,101 @@
1-
//go:build azure
2-
// +build azure
3-
4-
// NOTE: We use build tags to differentiate azure testing because we currently do not have azure access setup for
5-
// CircleCI.
6-
71
package azure_test
82

93
import (
4+
"context"
5+
"net/http"
106
"testing"
117

8+
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
9+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
10+
azfake "github.com/Azure/azure-sdk-for-go/sdk/azcore/fake"
11+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
12+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
13+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appservice/armappservice/v2"
14+
appservicefake "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appservice/armappservice/v2/fake"
1215
"github.com/gruntwork-io/terratest/modules/azure"
16+
"github.com/stretchr/testify/assert"
1317
"github.com/stretchr/testify/require"
1418
)
1519

16-
/*
17-
The below tests are currently stubbed out, with the expectation that they will throw errors.
18-
If/when CRUD methods are introduced for Azure MySQL server and database, these tests can be extended
19-
*/
20+
// ---------------------------------------------------------------------------
21+
// Fake client helper
22+
// ---------------------------------------------------------------------------
2023

21-
func TestAppExistsE(t *testing.T) {
22-
t.Parallel()
24+
func newFakeWebAppsClient(t *testing.T, srv *appservicefake.WebAppsServer) *armappservice.WebAppsClient {
25+
t.Helper()
2326

24-
resGroupName := ""
25-
appName := ""
26-
subscriptionID := ""
27+
client, err := armappservice.NewWebAppsClient("fake-sub", &azfake.TokenCredential{},
28+
&arm.ClientOptions{ClientOptions: policy.ClientOptions{
29+
Transport: appservicefake.NewWebAppsServerTransport(srv),
30+
}})
31+
require.NoError(t, err)
2732

28-
_, err := azure.AppExistsE(appName, resGroupName, subscriptionID)
29-
require.Error(t, err)
33+
return client
3034
}
3135

32-
func TestGetAppServiceE(t *testing.T) {
36+
// ---------------------------------------------------------------------------
37+
// GetAppServiceWithClient tests
38+
// ---------------------------------------------------------------------------
39+
40+
func TestGetAppServiceWithClient(t *testing.T) {
3341
t.Parallel()
3442

35-
resGroupName := ""
36-
appName := ""
37-
subscriptionID := ""
43+
tests := []struct { //nolint:govet // fieldalignment not worth optimizing in test structs
44+
name string
45+
wantName string
46+
errSubstr string
47+
server appservicefake.WebAppsServer
48+
wantErr bool
49+
}{
50+
{
51+
name: "Success",
52+
server: appservicefake.WebAppsServer{
53+
Get: func(_ context.Context, _ string, _ string, _ *armappservice.WebAppsClientGetOptions) (resp azfake.Responder[armappservice.WebAppsClientGetResponse], errResp azfake.ErrorResponder) {
54+
result := armappservice.WebAppsClientGetResponse{
55+
Site: armappservice.Site{
56+
Name: to.Ptr("test-app"),
57+
},
58+
}
59+
resp.SetResponse(http.StatusOK, result, nil)
3860

39-
_, err := azure.GetAppServiceE(appName, resGroupName, subscriptionID)
40-
require.Error(t, err)
41-
}
61+
return
62+
},
63+
},
64+
wantName: "test-app",
65+
},
66+
{
67+
name: "NotFound",
68+
server: appservicefake.WebAppsServer{
69+
Get: func(_ context.Context, _ string, _ string, _ *armappservice.WebAppsClientGetOptions) (resp azfake.Responder[armappservice.WebAppsClientGetResponse], errResp azfake.ErrorResponder) {
70+
errResp.SetResponseError(http.StatusNotFound, "ResourceNotFound")
4271

43-
func TestGetAppServiceClientE(t *testing.T) {
44-
t.Parallel()
72+
return
73+
},
74+
},
75+
wantErr: true,
76+
errSubstr: "ResourceNotFound",
77+
},
78+
}
4579

46-
subscriptionID := ""
80+
for _, tc := range tests {
81+
t.Run(tc.name, func(t *testing.T) {
82+
t.Parallel()
4783

48-
_, err := azure.GetAppServiceClientE(subscriptionID)
49-
require.NoError(t, err)
84+
client := newFakeWebAppsClient(t, &tc.server)
85+
86+
site, err := azure.GetAppServiceWithClient(context.Background(), client, "rg", "app")
87+
if tc.wantErr {
88+
require.Error(t, err)
89+
90+
var respErr *azcore.ResponseError
91+
require.ErrorAs(t, err, &respErr)
92+
assert.Equal(t, tc.errSubstr, respErr.ErrorCode)
93+
94+
return
95+
}
96+
97+
require.NoError(t, err)
98+
assert.Equal(t, tc.wantName, *site.Name)
99+
})
100+
}
50101
}
Lines changed: 110 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,149 @@
1-
//go:build azure
2-
// +build azure
3-
4-
// NOTE: We use build tags to differentiate azure testing because we currently do not have azure access setup for
5-
// CircleCI.
6-
71
package azure_test
82

93
import (
104
"context"
5+
"net/http"
116
"testing"
127

8+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
9+
azfake "github.com/Azure/azure-sdk-for-go/sdk/azcore/fake"
10+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
11+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
12+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6"
13+
computefake "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6/fake"
1314
"github.com/gruntwork-io/terratest/modules/azure"
1415
"github.com/stretchr/testify/assert"
1516
"github.com/stretchr/testify/require"
1617
)
1718

18-
/*
19-
The below tests are currently stubbed out, with the expectation that they will throw errors.
20-
If/when methods to create and delete network resources are added, these tests can be extended.
21-
*/
22-
23-
func TestCreateAvailabilitySetClientE(t *testing.T) {
24-
t.Parallel()
19+
func newFakeAvailabilitySetsClient(t *testing.T, srv *computefake.AvailabilitySetsServer) *armcompute.AvailabilitySetsClient {
20+
t.Helper()
2521

26-
subscriptionID := ""
22+
transport := computefake.NewAvailabilitySetsServerTransport(srv)
23+
client, err := armcompute.NewAvailabilitySetsClient("fake-sub", &azfake.TokenCredential{}, &arm.ClientOptions{
24+
ClientOptions: policy.ClientOptions{Transport: transport},
25+
})
26+
require.NoError(t, err)
2727

28-
client, err := azure.CreateAvailabilitySetClientE(subscriptionID)
28+
return client
29+
}
2930

30-
require.NoError(t, err)
31-
assert.NotEmpty(t, *client)
31+
func fakeAvsGetHandler(avsName string, vmIDs []string, faultDomainCount int32) func(context.Context, string, string, *armcompute.AvailabilitySetsClientGetOptions) (azfake.Responder[armcompute.AvailabilitySetsClientGetResponse], azfake.ErrorResponder) {
32+
return func(_ context.Context, _ string, _ string, _ *armcompute.AvailabilitySetsClientGetOptions) (resp azfake.Responder[armcompute.AvailabilitySetsClientGetResponse], errResp azfake.ErrorResponder) {
33+
vms := make([]*armcompute.SubResource, len(vmIDs))
34+
for i, id := range vmIDs {
35+
vms[i] = &armcompute.SubResource{ID: to.Ptr(id)}
36+
}
37+
38+
resp.SetResponse(http.StatusOK, armcompute.AvailabilitySetsClientGetResponse{
39+
AvailabilitySet: armcompute.AvailabilitySet{
40+
Name: to.Ptr(avsName),
41+
Properties: &armcompute.AvailabilitySetProperties{
42+
VirtualMachines: vms,
43+
PlatformFaultDomainCount: to.Ptr(faultDomainCount),
44+
},
45+
},
46+
}, nil)
47+
48+
return
49+
}
3250
}
3351

34-
func TestGetAvailabilitySetE(t *testing.T) {
52+
func TestGetAvailabilitySetWithClient(t *testing.T) {
3553
t.Parallel()
3654

37-
avsName := ""
38-
rgName := ""
39-
subscriptionID := ""
40-
41-
_, err := azure.GetAvailabilitySetContextE(t, context.Background(), avsName, rgName, subscriptionID)
55+
srv := &computefake.AvailabilitySetsServer{
56+
Get: fakeAvsGetHandler("my-avs", nil, 2),
57+
}
58+
client := newFakeAvailabilitySetsClient(t, srv)
4259

43-
require.Error(t, err)
60+
avs, err := azure.GetAvailabilitySetWithClient(t.Context(), client, "rg", "my-avs")
61+
require.NoError(t, err)
62+
assert.Equal(t, "my-avs", *avs.Name)
4463
}
4564

46-
func TestCheckAvailabilitySetContainsVME(t *testing.T) {
65+
func TestCheckAvailabilitySetContainsVMWithClient(t *testing.T) {
4766
t.Parallel()
4867

49-
vmName := ""
50-
avsName := ""
51-
rgName := ""
52-
subscriptionID := ""
53-
54-
_, err := azure.CheckAvailabilitySetContainsVMContextE(t, context.Background(), vmName, avsName, rgName, subscriptionID)
55-
56-
require.Error(t, err)
68+
vmIDs := []string{
69+
"/subscriptions/sub/resourceGroups/RG/providers/Microsoft.Compute/virtualMachines/VM-ONE",
70+
"/subscriptions/sub/resourceGroups/RG/providers/Microsoft.Compute/virtualMachines/VM-TWO",
71+
}
72+
73+
tests := []struct {
74+
name string
75+
vmName string
76+
found bool
77+
wantErr bool
78+
}{
79+
{name: "exact case match", vmName: "VM-ONE", found: true},
80+
{name: "case insensitive match", vmName: "vm-one", found: true},
81+
{name: "not found", vmName: "vm-three", found: false, wantErr: true},
82+
}
83+
84+
for _, tc := range tests {
85+
t.Run(tc.name, func(t *testing.T) {
86+
t.Parallel()
87+
88+
srv := &computefake.AvailabilitySetsServer{
89+
Get: fakeAvsGetHandler("avs", vmIDs, 2),
90+
}
91+
client := newFakeAvailabilitySetsClient(t, srv)
92+
93+
found, err := azure.CheckAvailabilitySetContainsVMWithClient(t.Context(), client, "rg", "avs", tc.vmName)
94+
95+
if tc.wantErr {
96+
require.Error(t, err)
97+
} else {
98+
require.NoError(t, err)
99+
}
100+
101+
assert.Equal(t, tc.found, found)
102+
})
103+
}
57104
}
58105

59-
func TestGetAvailabilitySetVMNamesInCapsE(t *testing.T) {
106+
func TestGetAvailabilitySetVMNamesInCapsWithClient(t *testing.T) {
60107
t.Parallel()
61108

62-
avsName := ""
63-
rgName := ""
64-
subscriptionID := ""
109+
vmIDs := []string{
110+
"/subscriptions/sub/resourceGroups/RG/providers/Microsoft.Compute/virtualMachines/VM-ALPHA",
111+
"/subscriptions/sub/resourceGroups/RG/providers/Microsoft.Compute/virtualMachines/VM-BETA",
112+
}
65113

66-
_, err := azure.GetAvailabilitySetVMNamesInCapsContextE(t, context.Background(), avsName, rgName, subscriptionID)
114+
srv := &computefake.AvailabilitySetsServer{
115+
Get: fakeAvsGetHandler("avs", vmIDs, 3),
116+
}
117+
client := newFakeAvailabilitySetsClient(t, srv)
67118

68-
require.Error(t, err)
119+
names, err := azure.GetAvailabilitySetVMNamesInCapsWithClient(t.Context(), client, "rg", "avs")
120+
require.NoError(t, err)
121+
assert.Equal(t, []string{"VM-ALPHA", "VM-BETA"}, names)
69122
}
70123

71-
func TestGetAvailabilitySetFaultDomainCountE(t *testing.T) {
124+
func TestExtractAvailabilitySetFaultDomainCount(t *testing.T) {
72125
t.Parallel()
73126

74-
avsName := ""
75-
rgName := ""
76-
subscriptionID := ""
127+
t.Run("valid", func(t *testing.T) {
128+
t.Parallel()
77129

78-
_, err := azure.GetAvailabilitySetFaultDomainCountContextE(t, context.Background(), avsName, rgName, subscriptionID)
130+
avs := &armcompute.AvailabilitySet{
131+
Properties: &armcompute.AvailabilitySetProperties{
132+
PlatformFaultDomainCount: to.Ptr[int32](3),
133+
},
134+
}
79135

80-
require.Error(t, err)
81-
}
82-
83-
func TestAvailabilitySetExistsE(t *testing.T) {
84-
t.Parallel()
136+
count, err := azure.ExtractAvailabilitySetFaultDomainCount(avs)
137+
require.NoError(t, err)
138+
assert.Equal(t, int32(3), count)
139+
})
85140

86-
avsName := ""
87-
rgName := ""
88-
subscriptionID := ""
141+
t.Run("nil properties", func(t *testing.T) {
142+
t.Parallel()
89143

90-
_, err := azure.AvailabilitySetExistsContextE(t, context.Background(), avsName, rgName, subscriptionID)
144+
avs := &armcompute.AvailabilitySet{}
91145

92-
require.Error(t, err)
146+
_, err := azure.ExtractAvailabilitySetFaultDomainCount(avs)
147+
require.Error(t, err)
148+
})
93149
}

0 commit comments

Comments
 (0)