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