@@ -21,33 +21,49 @@ import (
2121 computev1 "go.goms.io/fleet/apis/protos/azure/compute/v1"
2222)
2323
24+ const (
25+ testTenantID = "test-tenant-id"
26+ )
27+
2428func TestNewAttributeBasedVMSizeRecommenderClient (t * testing.T ) {
2529 tests := []struct {
2630 name string
31+ tenantID string
2732 serverAddress string
2833 httpClient * http.Client
2934 wantClient * AttributeBasedVMSizeRecommenderClient
3035 wantErr bool
3136 }{
37+ {
38+ name : "with missing tenant ID environment variable" ,
39+ serverAddress : "https://example.com" ,
40+ httpClient : http .DefaultClient ,
41+ wantClient : nil ,
42+ wantErr : true ,
43+ },
3244 {
3345 name : "with empty server address" ,
46+ tenantID : testTenantID ,
3447 serverAddress : "" ,
3548 httpClient : http .DefaultClient ,
3649 wantClient : nil ,
3750 wantErr : true ,
3851 },
3952 {
4053 name : "with nil HTTP client" ,
54+ tenantID : testTenantID ,
4155 serverAddress : "http://localhost:8080" ,
4256 httpClient : nil ,
4357 wantClient : nil ,
4458 wantErr : true ,
4559 },
4660 {
47- name : "with both server address and HTTP client" ,
61+ name : "with all fields properly set" ,
62+ tenantID : testTenantID ,
4863 serverAddress : "https://example.com" ,
4964 httpClient : http .DefaultClient ,
5065 wantClient : & AttributeBasedVMSizeRecommenderClient {
66+ tenantID : testTenantID ,
5167 baseURL : "https://example.com" ,
5268 httpClient : http .DefaultClient ,
5369 },
@@ -57,6 +73,7 @@ func TestNewAttributeBasedVMSizeRecommenderClient(t *testing.T) {
5773
5874 for _ , tt := range tests {
5975 t .Run (tt .name , func (t * testing.T ) {
76+ t .Setenv (tenantIDEnvVarName , tt .tenantID )
6077 got , gotErr := NewAttributeBasedVMSizeRecommenderClient (tt .serverAddress , tt .httpClient )
6178 if (gotErr != nil ) != tt .wantErr {
6279 t .Errorf ("NewAttributeBasedVMSizeRecommenderClient() error = %v, wantErr %v" , gotErr , tt .wantErr )
@@ -204,29 +221,38 @@ func TestClient_GenerateAttributeBasedRecommendations(t *testing.T) {
204221
205222 for _ , tt := range tests {
206223 t .Run (tt .name , func (t * testing.T ) {
207- // Create mock server
224+ // Set tenant ID environment variable to create client.
225+ t .Setenv (tenantIDEnvVarName , testTenantID )
226+ // Create mock server.
208227 server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
209- // Verify request method
228+ // Verify request method.
210229 if r .Method != http .MethodPost {
211230 t .Errorf ("got %s, want POST request" , r .Method )
212231 }
213232
214- // Verify headers
233+ // Verify headers.
215234 if r .Header .Get ("Content-Type" ) != "application/json" {
216235 t .Errorf ("got %s, want Content-Type: application/json" , r .Header .Get ("Content-Type" ))
217236 }
218237 if r .Header .Get ("Accept" ) != "application/json" {
219238 t .Errorf ("got %s, want Accept: application/json" , r .Header .Get ("Accept" ))
220239 }
240+ if r .Header .Get ("Grpc-Metadata-subscriptionTenantID" ) != testTenantID {
241+ t .Errorf ("got %s, want Grpc-Metadata-subscriptionTenantID: %s" ,
242+ r .Header .Get ("Grpc-Metadata-subscriptionTenantID" ), testTenantID )
243+ }
244+ if r .Header .Get ("Grpc-Metadata-clientRequestID" ) == "" {
245+ t .Error ("Grpc-Metadata-clientRequestID header is missing" )
246+ }
221247
222- // Verify URL path if request is not nil
248+ // Verify URL path if request is not nil.
223249 if tt .request != nil && tt .request .SubscriptionId != "" && tt .request .Location != "" {
224250 wantPath := fmt .Sprintf (recommendationsPathTemplate , tt .request .SubscriptionId , tt .request .Location )
225251 if r .URL .Path != wantPath {
226252 t .Errorf ("got %s, want path %s" , r .URL .Path , wantPath )
227253 }
228254
229- // Verify request body using protojson for proper proto3 oneof support
255+ // Verify request body using protojson for proper proto3 oneof support.
230256 body , err := io .ReadAll (r .Body )
231257 if err != nil {
232258 t .Fatalf ("failed to read request body: %v" , err )
@@ -243,24 +269,24 @@ func TestClient_GenerateAttributeBasedRecommendations(t *testing.T) {
243269 }
244270 }
245271
246- // Write mock response
272+ // Write mock response.
247273 w .WriteHeader (tt .mockStatusCode )
248274 if _ , err := w .Write ([]byte (tt .mockResponse )); err != nil {
249275 t .Fatalf ("failed to write response: %v" , err )
250276 }
251277 }))
252278 defer server .Close ()
253279
254- // Create client
280+ // Create client.
255281 client , err := NewAttributeBasedVMSizeRecommenderClient (server .URL , http .DefaultClient )
256282 if err != nil {
257283 t .Errorf ("failed to create client: %v" , err )
258284 }
259285
260- // Execute request
286+ // Execute request.
261287 got , err := client .GenerateAttributeBasedRecommendations (context .Background (), tt .request )
262288
263- // Check error
289+ // Check error.
264290 if (err != nil ) != tt .wantErr {
265291 t .Errorf ("GenerateAttributeBasedRecommendations() error = %v, wantErr %v" , err , tt .wantErr )
266292 return
@@ -271,7 +297,7 @@ func TestClient_GenerateAttributeBasedRecommendations(t *testing.T) {
271297 return
272298 }
273299
274- // Compare response
300+ // Compare response.
275301 if ! proto .Equal (tt .wantResponse , got ) {
276302 t .Errorf ("GenerateAttributeBasedRecommendations() = %+v, want %+v" , got , tt .wantResponse )
277303 }
0 commit comments