@@ -222,8 +222,33 @@ def my_import(name, *args, **kwargs):
222222 monkeypatch .setattr (builtins , '__import__' , my_import )
223223
224224
225- def test_get_password_keyring_missing_prompts (monkeypatch , keyring_missing ):
225+ @pytest .fixture
226+ def entered_password (monkeypatch ):
226227 monkeypatch .setattr (utils , 'password_prompt' , lambda prompt : 'entered pw' )
227228
228- pw = utils .get_password ('system' , 'user' , None , {})
229- assert pw == 'entered pw'
229+
230+ def test_get_password_keyring_missing_prompts (
231+ entered_password , keyring_missing ):
232+ assert utils .get_password ('system' , 'user' , None , {}) == 'entered pw'
233+
234+
235+ @pytest .fixture
236+ def keyring_no_backends (monkeypatch ):
237+ """
238+ Simulate that keyring has no available backends. When keyring
239+ has no backends for the system, the backend will be a
240+ fail.Keyring, which raises RuntimeError on get_password.
241+ """
242+ class FailKeyring (object ):
243+ @staticmethod
244+ def get_password (system , username ):
245+ raise RuntimeError ("fail!" )
246+ monkeypatch .setitem (sys .modules , 'keyring' , FailKeyring ())
247+
248+
249+ def test_get_password_runtime_error_suppressed (
250+ entered_password , keyring_no_backends , recwarn ):
251+ assert utils .get_password ('system' , 'user' , None , {}) == 'entered pw'
252+ assert len (recwarn ) == 1
253+ warning = recwarn .pop (UserWarning )
254+ assert 'fail!' in str (warning )
0 commit comments