[FIX] kdbx : nommer le coffre avant que getpass ne pose sa question
L'invite de `getpass` part vers le terminal, la ligne qui nomme le coffre vers la sortie standard — un TUBE dès qu'un menu nous lance. Sans vidage, les deux ressortaient dans le désordre : « Mot de passe du coffre : Coffre KeePass : <chemin> », la question avant ce dont elle parle. Le bouchon de `print` des tests accepte désormais la signature complète de `print` : sans `**k`, ajouter un `flush` au code testé faisait échouer six tests sur une différence étrangère à ce qu'ils vérifient. --- EN --- The `getpass` prompt goes to the terminal, the line naming the vault to standard output — a PIPE as soon as a menu launches us. Without a flush the two came out in the wrong order: "Vault password: KeePass vault: <path>", the question before what it is about. The tests' `print` stub now accepts the full signature of `print`: without `**k`, adding a `flush` to the code under test failed six tests over a difference foreign to what they check. Assisted-by: Claude Opus 5
This commit is contained in:
parent
cedf702226
commit
ae9463ebcb
2 changed files with 15 additions and 3 deletions
|
|
@ -82,7 +82,11 @@ class KdbxManager:
|
||||||
# pas une panne : la bibliothèque lève `CredentialsError` et, sans
|
# pas une panne : la bibliothèque lève `CredentialsError` et, sans
|
||||||
# ce rattrapage, la trace remontait jusqu'à tuer le CLI. On nomme
|
# ce rattrapage, la trace remontait jusqu'à tuer le CLI. On nomme
|
||||||
# aussi le coffre — l'invite ne disait pas DE QUOI elle parlait.
|
# aussi le coffre — l'invite ne disait pas DE QUOI elle parlait.
|
||||||
print(f"{t('kdbx_vault_is')} {kdbx_file_path}")
|
# `flush` : l'invite de getpass part vers le terminal, ce `print`
|
||||||
|
# vers la sortie standard — qui est un TUBE quand le menu nous lance.
|
||||||
|
# Sans vidage, on lisait « Mot de passe du coffre : Coffre KeePass :
|
||||||
|
# /chemin » — la question avant ce dont elle parle.
|
||||||
|
print(f"{t('kdbx_vault_is')} {kdbx_file_path}", flush=True)
|
||||||
for _ in range(attempts):
|
for _ in range(attempts):
|
||||||
password = getpass.getpass(prompt=t("kdbx_ask_password"))
|
password = getpass.getpass(prompt=t("kdbx_ask_password"))
|
||||||
if not password:
|
if not password:
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,11 @@ class KdbxCase(unittest.TestCase):
|
||||||
vues = []
|
vues = []
|
||||||
with patch("getpass.getpass", side_effect=list(reponses)), patch(
|
with patch("getpass.getpass", side_effect=list(reponses)), patch(
|
||||||
"builtins.print",
|
"builtins.print",
|
||||||
side_effect=lambda *a: vues.append(" ".join(map(str, a))),
|
# `**k` : un bouchon de `print` doit accepter la signature de
|
||||||
|
# `print`. Sans lui, ajouter un `flush=True` dans le code
|
||||||
|
# testé faisait échouer six tests sur une différence qui n'a
|
||||||
|
# rien à voir avec ce qu'ils vérifient.
|
||||||
|
side_effect=lambda *a, **k: vues.append(" ".join(map(str, a))),
|
||||||
):
|
):
|
||||||
resultat = self._manager().get_kdbx()
|
resultat = self._manager().get_kdbx()
|
||||||
return resultat, "\n".join(vues)
|
return resultat, "\n".join(vues)
|
||||||
|
|
@ -106,7 +110,11 @@ class TestRecoveryAndSuccess(KdbxCase):
|
||||||
vues = []
|
vues = []
|
||||||
with patch(
|
with patch(
|
||||||
"builtins.print",
|
"builtins.print",
|
||||||
side_effect=lambda *a: vues.append(" ".join(map(str, a))),
|
# `**k` : un bouchon de `print` doit accepter la signature de
|
||||||
|
# `print`. Sans lui, ajouter un `flush=True` dans le code
|
||||||
|
# testé faisait échouer six tests sur une différence qui n'a
|
||||||
|
# rien à voir avec ce qu'ils vérifient.
|
||||||
|
side_effect=lambda *a, **k: vues.append(" ".join(map(str, a))),
|
||||||
):
|
):
|
||||||
resultat = self._manager("mauvais").get_kdbx()
|
resultat = self._manager("mauvais").get_kdbx()
|
||||||
self.assertIsNone(resultat)
|
self.assertIsNone(resultat)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue