@@ -411,10 +411,13 @@ def test_interactive_credential_timeout():
411
411
def test_username_password_credential ():
412
412
expected_token = "access-token"
413
413
transport = validating_transport (
414
- requests = [Request ()] * 2 , # not validating requests because they're formed by MSAL
414
+ requests = [Request ()] * 3 , # not validating requests because they're formed by MSAL
415
415
responses = [
416
- # expecting tenant discovery then a token request
416
+ # tenant discovery
417
417
mock_response (json_payload = {"authorization_endpoint" : "https://a/b" , "token_endpoint" : "https://a/b" }),
418
+ # user realm discovery, interests MSAL only when the response body contains account_type == "Federated"
419
+ mock_response (json_payload = {}),
420
+ # token request
418
421
mock_response (
419
422
json_payload = {
420
423
"access_token" : expected_token ,
@@ -436,3 +439,46 @@ def test_username_password_credential():
436
439
437
440
token = credential .get_token ("scope" )
438
441
assert token .token == expected_token
442
+
443
+
444
+ def test_username_password_environment_credential (monkeypatch ):
445
+ client_id = "fake-client-id"
446
+ username = "foo@bar.com"
447
+ password = "password"
448
+ expected_token = "***"
449
+
450
+ create_transport = functools .partial (
451
+ validating_transport ,
452
+ requests = [Request ()] * 3 , # not validating requests because they're formed by MSAL
453
+ responses = [
454
+ # tenant discovery
455
+ mock_response (json_payload = {"authorization_endpoint" : "https://a/b" , "token_endpoint" : "https://a/b" }),
456
+ # user realm discovery, interests MSAL only when the response body contains account_type == "Federated"
457
+ mock_response (json_payload = {}),
458
+ # token request
459
+ mock_response (
460
+ json_payload = {
461
+ "access_token" : expected_token ,
462
+ "expires_in" : 42 ,
463
+ "token_type" : "Bearer" ,
464
+ "ext_expires_in" : 42 ,
465
+ }
466
+ ),
467
+ ],
468
+ )
469
+
470
+ monkeypatch .setenv (EnvironmentVariables .AZURE_CLIENT_ID , client_id )
471
+ monkeypatch .setenv (EnvironmentVariables .AZURE_USERNAME , username )
472
+ monkeypatch .setenv (EnvironmentVariables .AZURE_PASSWORD , password )
473
+
474
+ token = EnvironmentCredential (transport = create_transport ()).get_token ("scope" )
475
+
476
+ # not validating expires_on because doing so requires monkeypatching time, and this is tested elsewhere
477
+ assert token .token == expected_token
478
+
479
+ # now with a tenant id
480
+ monkeypatch .setenv (EnvironmentVariables .AZURE_TENANT_ID , "tenant_id" )
481
+
482
+ token = EnvironmentCredential (transport = create_transport ()).get_token ("scope" )
483
+
484
+ assert token .token == expected_token
0 commit comments