@@ -81,7 +81,7 @@ def test_do_not_load_disabled_secrets(self, mocker: MockerFixture) -> None:
8181        class  AzureKeyVaultSettings (BaseSettings ):
8282            """AzureKeyVault settings.""" 
8383
84-             sql_server_password : str 
84+             SqlServerPassword : str 
8585            DisabledSqlServerPassword : str 
8686
8787        disabled_secret_name  =  'SqlServerPassword' 
@@ -108,13 +108,14 @@ def test_azure_key_vault_settings_source(self, mocker: MockerFixture) -> None:
108108        """Test AzureKeyVaultSettingsSource.""" 
109109
110110        class  SqlServer (BaseModel ):
111-             password : str 
111+             password : str   =   Field (...,  alias = 'Password' ) 
112112
113113        class  AzureKeyVaultSettings (BaseSettings ):
114114            """AzureKeyVault settings.""" 
115115
116-             sql_server_user : str 
117-             sql_server : SqlServer 
116+             SqlServerUser : str 
117+             sql_server_user : str  =  Field (..., alias = 'SqlServerUser' )
118+             sql_server : SqlServer  =  Field (..., alias = 'SqlServer' )
118119
119120            @classmethod  
120121            def  settings_customise_sources (
@@ -147,6 +148,7 @@ def settings_customise_sources(
147148
148149        settings  =  AzureKeyVaultSettings ()  # type: ignore 
149150
151+         assert  settings .SqlServerUser  ==  expected_secret_value 
150152        assert  settings .sql_server_user  ==  expected_secret_value 
151153        assert  settings .sql_server .password  ==  expected_secret_value 
152154
@@ -159,14 +161,61 @@ def _raise_resource_not_found_when_getting_parent_secret_name(self, secret_name:
159161
160162        return  key_vault_secret 
161163
162-     def  test_snake_case_translation (self , mocker : MockerFixture ) ->  None :
164+     def  test_dash_to_underscore_translation (self , mocker : MockerFixture ) ->  None :
165+         """Test that dashes in secret names are mapped to underscores in field names.""" 
166+ 
167+         class  AzureKeyVaultSettings (BaseSettings ):
168+             my_field : str 
169+             alias_field : str  =  Field (..., alias = 'Secret-Alias' )
170+ 
171+             @classmethod  
172+             def  settings_customise_sources (
173+                 cls ,
174+                 settings_cls : type [BaseSettings ],
175+                 init_settings : PydanticBaseSettingsSource ,
176+                 env_settings : PydanticBaseSettingsSource ,
177+                 dotenv_settings : PydanticBaseSettingsSource ,
178+                 file_secret_settings : PydanticBaseSettingsSource ,
179+             ) ->  tuple [PydanticBaseSettingsSource , ...]:
180+                 return  (
181+                     AzureKeyVaultSettingsSource (
182+                         settings_cls ,
183+                         'https://my-resource.vault.azure.net/' ,
184+                         DefaultAzureCredential (),
185+                         dash_to_underscore = True ,
186+                     ),
187+                 )
188+ 
189+         expected_secrets  =  [
190+             type ('' , (), {'name' : 'my-field' , 'enabled' : True }),
191+             type ('' , (), {'name' : 'Secret-Alias' , 'enabled' : True }),
192+         ]
193+         expected_secret_value  =  'SecretValue' 
194+ 
195+         mocker .patch (
196+             f'{ AzureKeyVaultSettingsSource .__module__ }  .{ SecretClient .list_properties_of_secrets .__qualname__ }  ' ,
197+             return_value = expected_secrets ,
198+         )
199+         mocker .patch (
200+             f'{ AzureKeyVaultSettingsSource .__module__ }  .{ SecretClient .get_secret .__qualname__ }  ' ,
201+             return_value = KeyVaultSecret (SecretProperties (), expected_secret_value ),
202+         )
203+ 
204+         settings  =  AzureKeyVaultSettings ()
205+ 
206+         assert  settings .my_field  ==  expected_secret_value 
207+         assert  settings .alias_field  ==  expected_secret_value 
208+ 
209+     def  test_snake_case_conversion (self , mocker : MockerFixture ) ->  None :
163210        """Test that secret names are mapped to snake case in field names.""" 
164211
165212        class  NestedModel (BaseModel ):
166213            nested_field : str 
167214
168215        class  AzureKeyVaultSettings (BaseSettings ):
169-             my_field : str 
216+             my_field_from_kebab_case : str 
217+             my_field_from_pascal_case : str 
218+             my_field_from_camel_case : str 
170219            alias_field : str  =  Field (alias = 'Secret-Alias' )
171220            alias_field_2 : str  =  Field (alias = 'another-SECRET-AliaS' )
172221            nested_model : NestedModel 
@@ -185,11 +234,14 @@ def settings_customise_sources(
185234                        settings_cls ,
186235                        'https://my-resource.vault.azure.net/' ,
187236                        DefaultAzureCredential (),
237+                         snake_case_conversion = True ,
188238                    ),
189239                )
190240
191241        expected_secrets  =  [
192-             type ('' , (), {'name' : 'my-field' , 'enabled' : True }),
242+             type ('' , (), {'name' : 'my-field-from-kebab-case' , 'enabled' : True }),
243+             type ('' , (), {'name' : 'MyFieldFromPascalCase' , 'enabled' : True }),
244+             type ('' , (), {'name' : 'myFieldFromCamelCase' , 'enabled' : True }),
193245            type ('' , (), {'name' : 'Secret-Alias' , 'enabled' : True }),
194246            type ('' , (), {'name' : 'another-SECRET-AliaS' , 'enabled' : True }),
195247            type ('' , (), {'name' : 'NestedModel--NestedField' , 'enabled' : True }),
@@ -207,7 +259,9 @@ def settings_customise_sources(
207259
208260        settings  =  AzureKeyVaultSettings ()
209261
210-         assert  settings .my_field  ==  expected_secret_value 
262+         assert  settings .my_field_from_kebab_case  ==  expected_secret_value 
263+         assert  settings .my_field_from_pascal_case  ==  expected_secret_value 
264+         assert  settings .my_field_from_camel_case  ==  expected_secret_value 
211265        assert  settings .alias_field  ==  expected_secret_value 
212266        assert  settings .alias_field_2  ==  expected_secret_value 
213267        assert  settings .nested_model .nested_field  ==  expected_secret_value 
0 commit comments