11package azure
22
33import (
4- "encoding/json"
54 "net/http"
65 "net/http/httptest"
76 "strings"
87 "testing"
9-
10- "k8s.io/apimachinery/pkg/api/resource"
11- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+ "time"
129
1310 clusterv1beta1 "go.goms.io/fleet/apis/cluster/v1beta1"
1411 placementv1beta1 "go.goms.io/fleet/apis/placement/v1beta1"
12+
13+ "k8s.io/apimachinery/pkg/api/resource"
14+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1515)
1616
1717func TestExtractAzureInfoFromLabels (t * testing.T ) {
@@ -239,31 +239,85 @@ func TestExtractCapacityRequirements(t *testing.T) {
239239 }
240240}
241241
242- func TestValidateCapacityRequirement (t * testing.T ) {
243- // Mock response JSON for recommendedVmSizes
244- mockResponse := map [string ]interface {}{
245- "recommendedVmSizes" : map [string ]interface {}{
246- "regularVmSizes" : []map [string ]interface {}{
247- {"name" : "Standard_D2s_v3" },
248- {"name" : "Standard_A1_v2" },
249- },
242+ func TestNewAzureCapacityService (t * testing.T ) {
243+ tests := []struct {
244+ name string
245+ serverAddress string
246+ client * http.Client
247+ }{
248+ {
249+ name : "with valid client" ,
250+ serverAddress : "test.example.com" ,
251+ client : & http.Client {},
252+ },
253+ {
254+ name : "with nil client" ,
255+ serverAddress : "test.example.com" ,
256+ client : nil ,
250257 },
251258 }
252- respBytes , _ := json .Marshal (mockResponse )
253259
254- // Start a test HTTP server
255- ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
256- w .Header ().Set ("Content-Type" , "application/json" )
260+ for _ , tt := range tests {
261+ t .Run (tt .name , func (t * testing.T ) {
262+ svc := NewAzureCapacityService (tt .serverAddress , tt .client ).(* defaultAzureCapacityService )
263+ if svc == nil {
264+ t .Fatal ("NewAzureCapacityService returned nil" )
265+ }
266+ if svc .Client == nil {
267+ t .Error ("client is nil" )
268+ }
269+ if svc .ServerAddress != tt .serverAddress {
270+ t .Errorf ("serverAddress = %v, want %v" , svc .ServerAddress , tt .serverAddress )
271+ }
272+ })
273+ }
274+ }
275+
276+ // Mock the expected response from the Azure API.
277+ var mockAzureResponse = `{
278+ "recommendedVmSizes": {
279+ "regularVmSizes": [
280+ {
281+ "family": "Dsv3",
282+ "name": "Standard_D2s_v3",
283+ "size": "D2"
284+ },
285+ {
286+ "family": "Standard",
287+ "name": "Standard_B1s",
288+ "size": "Standard_B1s"
289+ }
290+ ]
291+ }
292+ }`
293+
294+ func TestValidateCapacityRequirement (t * testing.T ) {
295+ // Create mock server
296+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
297+ // Verify request method
298+ if r .Method != http .MethodPost {
299+ t .Errorf ("got %s, want POST request" , r .Method )
300+ }
301+
302+ // Verify headers
303+ if r .Header .Get ("Content-Type" ) != "application/json" {
304+ t .Errorf ("got %s, want Content-Type: application/json" , r .Header .Get ("Content-Type" ))
305+ }
306+ if r .Header .Get ("Accept" ) != "application/json" {
307+ t .Errorf ("got %s, want Accept: application/json" , r .Header .Get ("Accept" ))
308+ }
309+
310+ // Write mock response
257311 w .WriteHeader (http .StatusOK )
258- w .Write (respBytes )
312+ if _ , err := w .Write ([]byte (mockAzureResponse )); err != nil {
313+ t .Fatalf ("failed to write response: %v" , err )
314+ }
259315 }))
260- defer ts .Close ()
261316
262- // Create the service pointing to the test server
263- svc := & DefaultAzureCapacityService {
264- endpoint : ts .URL ,
265- client : ts .Client (),
266- }
317+ client := & http.Client {Timeout : 60 * time .Second }
318+
319+ // Step 2: Create the AzureCapacityService with the mock client and server URL
320+ svc := NewAzureCapacityService (server .URL , client )
267321
268322 // Prepare test data
269323 cluster := & clusterv1beta1.MemberCluster {
@@ -279,6 +333,7 @@ func TestValidateCapacityRequirement(t *testing.T) {
279333 name string
280334 cluster * clusterv1beta1.MemberCluster
281335 req placementv1beta1.PropertySelectorRequirement
336+ mockStatusCode int
282337 wantAvailable bool
283338 expectError bool
284339 errorSubstring string
@@ -287,18 +342,21 @@ func TestValidateCapacityRequirement(t *testing.T) {
287342 name : "valid request" ,
288343 cluster : cluster ,
289344 req : placementv1beta1.PropertySelectorRequirement {
290- Name : "kubernetes.azure.com/vm-size/Standard_D2s_v3/capacity" ,
291- Values : []string {"10" },
345+ Name : "kubernetes.azure.com/vm-size/Standard_D2s_v3/capacity" ,
346+ Operator : placementv1beta1 .PropertySelectorGreaterThan ,
347+ Values : []string {"10" },
292348 },
293- wantAvailable : true ,
294- expectError : false ,
349+ mockStatusCode : http .StatusOK ,
350+ wantAvailable : true ,
351+ expectError : false ,
295352 },
296353 {
297354 name : "invalid capacity request" ,
298355 cluster : cluster ,
299356 req : placementv1beta1.PropertySelectorRequirement {
300- Name : "kubernetes.azure.com/vm-size/Standard_D3s_v3/capacity" ,
301- Values : []string {"2" },
357+ Name : "kubernetes.azure.com/vm-size/Standard_D3s_v3/capacity" ,
358+ Operator : placementv1beta1 .PropertySelectorGreaterThan ,
359+ Values : []string {"2" },
302360 },
303361 wantAvailable : false ,
304362 expectError : false ,
@@ -313,8 +371,9 @@ func TestValidateCapacityRequirement(t *testing.T) {
313371 },
314372 },
315373 req : placementv1beta1.PropertySelectorRequirement {
316- Name : "kubernetes.azure.com/vm-size/Standard_D2s_v3/capacity" ,
317- Values : []string {"10" },
374+ Name : "kubernetes.azure.com/vm-size/Standard_D2s_v3/capacity" ,
375+ Operator : placementv1beta1 .PropertySelectorGreaterThan ,
376+ Values : []string {"10" },
318377 },
319378 expectError : true ,
320379 errorSubstring : "does not have required Azure labels" ,
@@ -323,14 +382,14 @@ func TestValidateCapacityRequirement(t *testing.T) {
323382 name : "invalid capacity property" ,
324383 cluster : cluster ,
325384 req : placementv1beta1.PropertySelectorRequirement {
326- Name : "kubernetes.azure.com/vm-size/Standard_D2s_v3/usage" ,
327- Values : []string {"10" },
385+ Name : "kubernetes.azure.com/vm-size/Standard_D2s_v3/usage" ,
386+ Operator : placementv1beta1 .PropertySelectorGreaterThan ,
387+ Values : []string {"10" },
328388 },
329389 expectError : true ,
330390 errorSubstring : "invalid Azure SKU capacity property format" ,
331391 },
332392 }
333-
334393 for _ , tt := range tests {
335394 t .Run (tt .name , func (t * testing.T ) {
336395 result , err := svc .ValidateCapacityRequirement (tt .cluster , tt .req )
0 commit comments