2222ACCOUNT  =  os .getenv ("SNOWFLAKE_TEST_WIF_ACCOUNT" )
2323HOST  =  os .getenv ("SNOWFLAKE_TEST_WIF_HOST" )
2424PROVIDER  =  os .getenv ("SNOWFLAKE_TEST_WIF_PROVIDER" )
25+ EXPECTED_USERNAME  =  os .getenv ("SNOWFLAKE_TEST_WIF_USERNAME" )
26+ IMPERSONATION_PATH  =  os .getenv ("SNOWFLAKE_TEST_WIF_IMPERSONATION_PATH" )
27+ EXPECTED_USERNAME_IMPERSONATION  =  os .getenv ("SNOWFLAKE_TEST_WIF_USERNAME_IMPERSONATION" )
2528
2629
2730@pytest .mark .wif  
@@ -33,8 +36,8 @@ def test_wif_defined_provider():
3336        "workload_identity_provider" : PROVIDER ,
3437    }
3538    assert  connect_and_execute_simple_query (
36-         connection_params 
37-     ), "Failed to connect with using WIF - automatic  provider detection " 
39+         connection_params ,  EXPECTED_USERNAME 
40+     ), f "Failed to connect with using WIF using  provider { PROVIDER }  "
3841
3942
4043@pytest .mark .wif  
@@ -51,21 +54,48 @@ def test_should_authenticate_using_oidc():
5154    }
5255
5356    assert  connect_and_execute_simple_query (
54-         connection_params 
57+         connection_params ,  expected_user = None 
5558    ), "Failed to connect using WIF with OIDC provider" 
5659
5760
61+ @pytest .mark .wif  
62+ @pytest .mark .skip ("Impersonation is still being developed" ) 
63+ def  test_should_authenticate_with_impersonation ():
64+     if  not  isinstance (IMPERSONATION_PATH , str ) or  not  IMPERSONATION_PATH :
65+         pytest .skip ("Skipping test - IMPERSONATION_PATH is not set" )
66+ 
67+     logger .debug (f"Using impersonation path: { IMPERSONATION_PATH }  " )
68+     impersonation_path_list  =  IMPERSONATION_PATH .split ("," )
69+ 
70+     connection_params  =  {
71+         "host" : HOST ,
72+         "account" : ACCOUNT ,
73+         "authenticator" : "WORKLOAD_IDENTITY" ,
74+         "workload_identity_provider" : PROVIDER ,
75+         "workload_identity_impersonation_path" : impersonation_path_list ,
76+     }
77+ 
78+     assert  connect_and_execute_simple_query (
79+         connection_params , EXPECTED_USERNAME_IMPERSONATION 
80+     ), f"Failed to connect using WIF with provider { PROVIDER }  " 
81+ 
82+ 
5883def  is_provider_gcp () ->  bool :
5984    return  PROVIDER  ==  "GCP" 
6085
6186
62- def  connect_and_execute_simple_query (connection_params ) ->  bool :
87+ def  connect_and_execute_simple_query (connection_params ,  expected_user = None ) ->  bool :
6388    try :
6489        logger .info ("Trying to connect to Snowflake" )
6590        with  snowflake .connector .connect (** connection_params ) as  con :
66-             result  =  con .cursor ().execute ("select 1;" )
67-             logger .debug (result .fetchall ())
68-             logger .info ("Successfully connected to Snowflake" )
91+             result  =  con .cursor ().execute ("select current_user();" )
92+             (user ,) =  result .fetchone ()
93+             logger .debug (user )
94+             if  expected_user :
95+                 assert  (
96+                     expected_user  ==  user 
97+                 ), f"Expected user '{ expected_user }  ', got user '{ user }  '" 
98+             logger .info (f"Successfully connected to Snowflake as { user }  " )
6999            return  True 
70100    except  Exception  as  e :
71101        logger .error (e )
0 commit comments