@@ -879,6 +879,49 @@ class CaseInsensitiveSettings(BaseSettings):
879879 settings = CaseInsensitiveSettings ()
880880 assert settings .foo == 'foo_value'
881881
882+ def test_init_settings_source_extra_fields_case_sensitive (monkeypatch ):
883+ class CaseSensitiveSettings (BaseSettings ):
884+ foo : str = Field (..., alias = 'FOO' )
885+
886+ model_config = SettingsConfigDict (case_sensitive = True , extra = 'allow' )
887+
888+ monkeypatch .setattr (os , 'environ' , value = {})
889+ init_kwargs_case_sensitive = {
890+ 'FOO' : 'foo_value' ,
891+ 'extra_field' : 'extra_value' ,
892+ 'Foo' : 'wrong_value'
893+ }
894+ with pytest .raises (ValidationError ) as exc_info :
895+ CaseSensitiveSettings (** init_kwargs_case_sensitive )
896+ assert exc_info .value .errors (include_url = False ) == [
897+ {'type' : 'missing' , 'loc' : ('foo' ,), 'msg' : 'Field required' , 'input' : init_kwargs_case_sensitive }
898+ ]
899+
900+ # Test with correct case and extra field
901+ monkeypatch .setattr (os , 'environ' , value = {})
902+ settings_correct = CaseSensitiveSettings (FOO = 'foo_value' , extra_field = 'extra_value' )
903+ assert settings_correct .foo == 'foo_value'
904+ assert settings_correct .__pydantic_extra__ == {'extra_field' : 'extra_value' }
905+
906+ class CaseInsensitiveSettings (BaseSettings ):
907+ foo : str = Field (..., alias = 'FOO' )
908+
909+ model_config = SettingsConfigDict (case_sensitive = False , extra = 'allow' )
910+
911+ # Test when case sensitivity is disabled
912+ monkeypatch .setattr (os , 'environ' , value = {})
913+ init_kwargs_case_insensitive = {
914+ 'Foo' : 'foo_value' ,
915+ 'extra_field' : 'extra_value' ,
916+ 'EXTRA_FIELD' : 'another_value'
917+ }
918+ settings = CaseInsensitiveSettings (** init_kwargs_case_insensitive )
919+ assert settings .foo == 'foo_value'
920+ assert settings .__pydantic_extra__ == {
921+ 'extra_field' : 'extra_value' ,
922+ 'EXTRA_FIELD' : 'another_value'
923+ }
924+
882925
883926@pytest .mark .parametrize ('env_nested_delimiter' , [None , '' ])
884927def test_case_sensitive_no_nested_delimiter (monkeypatch , env_nested_delimiter ):
0 commit comments