e8f3ec854c425cc36565a40adbf00d22a2febeec
Marco Ricci Change the author e-mail ad...

Marco Ricci authored 1 week ago

1) # SPDX-FileCopyrightText: 2024 Marco Ricci <software@the13thletter.info>
Marco Ricci Add prototype command-line...

Marco Ricci authored 2 months ago

2) #
3) # SPDX-License-Identifier: MIT
4) 
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

5) from __future__ import annotations
6) 
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

7) import contextlib
Marco Ricci Remove `click` handling of...

Marco Ricci authored 2 weeks ago

8) import errno
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

9) import json
10) import os
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

11) import shutil
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

12) import socket
Marco Ricci Fix typing issues in mypy s...

Marco Ricci authored 1 month ago

13) from typing import TYPE_CHECKING
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

14) 
Marco Ricci Add prototype command-line...

Marco Ricci authored 2 months ago

15) import click.testing
16) import pytest
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

17) from typing_extensions import NamedTuple
18) 
19) import derivepassphrase as dpp
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

20) import tests
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 1 month ago

21) from derivepassphrase import _types, cli, ssh_agent
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

22) 
23) if TYPE_CHECKING:
24)     from collections.abc import Callable
25) 
26)     from typing_extensions import Any
Marco Ricci Add prototype command-line...

Marco Ricci authored 2 months ago

27) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

28) DUMMY_SERVICE = tests.DUMMY_SERVICE
29) DUMMY_PASSPHRASE = tests.DUMMY_PASSPHRASE
30) DUMMY_CONFIG_SETTINGS = tests.DUMMY_CONFIG_SETTINGS
31) DUMMY_RESULT_PASSPHRASE = tests.DUMMY_RESULT_PASSPHRASE
32) DUMMY_RESULT_KEY1 = tests.DUMMY_RESULT_KEY1
33) DUMMY_PHRASE_FROM_KEY1_RAW = tests.DUMMY_PHRASE_FROM_KEY1_RAW
34) DUMMY_PHRASE_FROM_KEY1 = tests.DUMMY_PHRASE_FROM_KEY1
35) 
36) DUMMY_KEY1 = tests.DUMMY_KEY1
37) DUMMY_KEY1_B64 = tests.DUMMY_KEY1_B64
38) DUMMY_KEY2 = tests.DUMMY_KEY2
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 1 month ago

39) DUMMY_KEY2_B64 = tests.DUMMY_KEY2_B64
40) DUMMY_KEY3 = tests.DUMMY_KEY3
41) DUMMY_KEY3_B64 = tests.DUMMY_KEY3_B64
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

42) 
43) 
44) class IncompatibleConfiguration(NamedTuple):
45)     other_options: list[tuple[str, ...]]
46)     needs_service: bool | None
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

47)     input: str | None
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

48) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

49) 
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

50) class SingleConfiguration(NamedTuple):
51)     needs_service: bool | None
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

52)     input: str | None
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

53)     check_success: bool
54) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

55) 
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

56) class OptionCombination(NamedTuple):
57)     options: list[str]
58)     incompatible: bool
59)     needs_service: bool | None
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

60)     input: str | None
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

61)     check_success: bool
62) 
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

63) 
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

64) PASSWORD_GENERATION_OPTIONS: list[tuple[str, ...]] = [
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

65)     ('--phrase',),
66)     ('--key',),
67)     ('--length', '20'),
68)     ('--repeat', '20'),
69)     ('--lower', '1'),
70)     ('--upper', '1'),
71)     ('--number', '1'),
72)     ('--space', '1'),
73)     ('--dash', '1'),
74)     ('--symbol', '1'),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

75) ]
76) CONFIGURATION_OPTIONS: list[tuple[str, ...]] = [
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

77)     ('--notes',),
78)     ('--config',),
79)     ('--delete',),
80)     ('--delete-globals',),
81)     ('--clear',),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

82) ]
83) CONFIGURATION_COMMANDS: list[tuple[str, ...]] = [
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

84)     ('--notes',),
85)     ('--delete',),
86)     ('--delete-globals',),
87)     ('--clear',),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

88) ]
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

89) STORAGE_OPTIONS: list[tuple[str, ...]] = [('--export', '-'), ('--import', '-')]
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

90) INCOMPATIBLE: dict[tuple[str, ...], IncompatibleConfiguration] = {
91)     ('--phrase',): IncompatibleConfiguration(
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

92)         [('--key',), *CONFIGURATION_COMMANDS, *STORAGE_OPTIONS],
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

93)         True,
94)         DUMMY_PASSPHRASE,
95)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

96)     ('--key',): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

97)         CONFIGURATION_COMMANDS + STORAGE_OPTIONS, True, DUMMY_PASSPHRASE
98)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

99)     ('--length', '20'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

100)         CONFIGURATION_COMMANDS + STORAGE_OPTIONS, True, DUMMY_PASSPHRASE
101)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

102)     ('--repeat', '20'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

103)         CONFIGURATION_COMMANDS + STORAGE_OPTIONS, True, DUMMY_PASSPHRASE
104)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

105)     ('--lower', '1'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

106)         CONFIGURATION_COMMANDS + STORAGE_OPTIONS, True, DUMMY_PASSPHRASE
107)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

108)     ('--upper', '1'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

109)         CONFIGURATION_COMMANDS + STORAGE_OPTIONS, True, DUMMY_PASSPHRASE
110)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

111)     ('--number', '1'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

112)         CONFIGURATION_COMMANDS + STORAGE_OPTIONS, True, DUMMY_PASSPHRASE
113)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

114)     ('--space', '1'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

115)         CONFIGURATION_COMMANDS + STORAGE_OPTIONS, True, DUMMY_PASSPHRASE
116)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

117)     ('--dash', '1'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

118)         CONFIGURATION_COMMANDS + STORAGE_OPTIONS, True, DUMMY_PASSPHRASE
119)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

120)     ('--symbol', '1'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

121)         CONFIGURATION_COMMANDS + STORAGE_OPTIONS, True, DUMMY_PASSPHRASE
122)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

123)     ('--notes',): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

124)         [
125)             ('--config',),
126)             ('--delete',),
127)             ('--delete-globals',),
128)             ('--clear',),
129)             *STORAGE_OPTIONS,
130)         ],
131)         True,
132)         None,
133)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

134)     ('--config', '-p'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

135)         [('--delete',), ('--delete-globals',), ('--clear',), *STORAGE_OPTIONS],
136)         None,
137)         DUMMY_PASSPHRASE,
138)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

139)     ('--delete',): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

140)         [('--delete-globals',), ('--clear',), *STORAGE_OPTIONS], True, None
141)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

142)     ('--delete-globals',): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

143)         [('--clear',), *STORAGE_OPTIONS], False, None
144)     ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

145)     ('--clear',): IncompatibleConfiguration(STORAGE_OPTIONS, False, None),
146)     ('--export', '-'): IncompatibleConfiguration(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

147)         [('--import', '-')], False, None
148)     ),
149)     ('--import', '-'): IncompatibleConfiguration([], False, None),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

150) }
151) SINGLES: dict[tuple[str, ...], SingleConfiguration] = {
152)     ('--phrase',): SingleConfiguration(True, DUMMY_PASSPHRASE, True),
153)     ('--key',): SingleConfiguration(True, None, False),
154)     ('--length', '20'): SingleConfiguration(True, DUMMY_PASSPHRASE, True),
155)     ('--repeat', '20'): SingleConfiguration(True, DUMMY_PASSPHRASE, True),
156)     ('--lower', '1'): SingleConfiguration(True, DUMMY_PASSPHRASE, True),
157)     ('--upper', '1'): SingleConfiguration(True, DUMMY_PASSPHRASE, True),
158)     ('--number', '1'): SingleConfiguration(True, DUMMY_PASSPHRASE, True),
159)     ('--space', '1'): SingleConfiguration(True, DUMMY_PASSPHRASE, True),
160)     ('--dash', '1'): SingleConfiguration(True, DUMMY_PASSPHRASE, True),
161)     ('--symbol', '1'): SingleConfiguration(True, DUMMY_PASSPHRASE, True),
162)     ('--notes',): SingleConfiguration(True, None, False),
163)     ('--config', '-p'): SingleConfiguration(None, DUMMY_PASSPHRASE, False),
164)     ('--delete',): SingleConfiguration(True, None, False),
165)     ('--delete-globals',): SingleConfiguration(False, None, True),
166)     ('--clear',): SingleConfiguration(False, None, True),
167)     ('--export', '-'): SingleConfiguration(False, None, True),
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

168)     ('--import', '-'): SingleConfiguration(False, '{"services": {}}', True),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

169) }
170) INTERESTING_OPTION_COMBINATIONS: list[OptionCombination] = []
Marco Ricci Fix miscellaneous type chec...

Marco Ricci authored 2 months ago

171) config: IncompatibleConfiguration | SingleConfiguration
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

172) for opt, config in INCOMPATIBLE.items():
173)     for opt2 in config.other_options:
174)         INTERESTING_OPTION_COMBINATIONS.extend([
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

175)             OptionCombination(
176)                 options=list(opt + opt2),
177)                 incompatible=True,
178)                 needs_service=config.needs_service,
179)                 input=config.input,
180)                 check_success=False,
181)             ),
182)             OptionCombination(
183)                 options=list(opt2 + opt),
184)                 incompatible=True,
185)                 needs_service=config.needs_service,
186)                 input=config.input,
187)                 check_success=False,
188)             ),
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

189)         ])
190) for opt, config in SINGLES.items():
191)     INTERESTING_OPTION_COMBINATIONS.append(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

192)         OptionCombination(
193)             options=list(opt),
194)             incompatible=False,
195)             needs_service=config.needs_service,
196)             input=config.input,
197)             check_success=config.check_success,
198)         )
199)     )
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

200) 
201) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

202) class TestCLI:
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

203)     def test_200_help_output(self, monkeypatch: pytest.MonkeyPatch) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

204)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

205)         with tests.isolated_config(
206)             monkeypatch=monkeypatch,
207)             runner=runner,
208)             config={'services': {}},
209)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

210)             _result = runner.invoke(
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

211)                 cli.derivepassphrase, ['--help'], catch_exceptions=False
212)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

213)             result = tests.ReadableResult.parse(_result)
214)         assert result.clean_exit(
215)             empty_stderr=True, output='Password generation:\n'
216)         ), 'expected clean exit, and option groups in help text'
217)         assert result.clean_exit(
218)             empty_stderr=True, output='Use NUMBER=0, e.g. "--symbol 0"'
219)         ), 'expected clean exit, and option group epilog in help text'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

220) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

221)     @pytest.mark.parametrize(
222)         'charset_name', ['lower', 'upper', 'number', 'space', 'dash', 'symbol']
223)     )
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

224)     def test_201_disable_character_set(
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

225)         self, monkeypatch: pytest.MonkeyPatch, charset_name: str
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

226)     ) -> None:
227)         monkeypatch.setattr(cli, '_prompt_for_passphrase', tests.auto_prompt)
228)         option = f'--{charset_name}'
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 1 month ago

229)         charset = dpp.vault.Vault._CHARSETS[charset_name].decode('ascii')
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

230)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

231)         with tests.isolated_config(
232)             monkeypatch=monkeypatch,
233)             runner=runner,
234)             config={'services': {}},
235)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

236)             _result = runner.invoke(
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

237)                 cli.derivepassphrase,
238)                 [option, '0', '-p', DUMMY_SERVICE],
239)                 input=DUMMY_PASSPHRASE,
240)                 catch_exceptions=False,
241)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

242)             result = tests.ReadableResult.parse(_result)
243)         assert result.clean_exit(empty_stderr=True), 'expected clean exit:'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

244)         for c in charset:
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

245)             assert (
246)                 c not in result.output
247)             ), f'derived password contains forbidden character {c!r}'
Marco Ricci Add prototype command-line...

Marco Ricci authored 2 months ago

248) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

249)     def test_202_disable_repetition(
250)         self, monkeypatch: pytest.MonkeyPatch
251)     ) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

252)         monkeypatch.setattr(cli, '_prompt_for_passphrase', tests.auto_prompt)
253)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

254)         with tests.isolated_config(
255)             monkeypatch=monkeypatch,
256)             runner=runner,
257)             config={'services': {}},
258)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

259)             _result = runner.invoke(
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

260)                 cli.derivepassphrase,
261)                 ['--repeat', '0', '-p', DUMMY_SERVICE],
262)                 input=DUMMY_PASSPHRASE,
263)                 catch_exceptions=False,
264)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

265)             result = tests.ReadableResult.parse(_result)
266)         assert result.clean_exit(
267)             empty_stderr=True
268)         ), 'expected clean exit and empty stderr'
269)         passphrase = result.output.rstrip('\r\n')
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

270)         for i in range(len(passphrase) - 1):
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

271)             assert passphrase[i : i + 1] != passphrase[i + 1 : i + 2], (
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

272)                 f'derived password contains repeated character '
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

273)                 f'at position {i}: {result.output!r}'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

274)             )
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

275) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

276)     @pytest.mark.parametrize(
277)         'config',
278)         [
279)             pytest.param(
280)                 {
281)                     'global': {'key': DUMMY_KEY1_B64},
282)                     'services': {DUMMY_SERVICE: DUMMY_CONFIG_SETTINGS},
283)                 },
284)                 id='global',
285)             ),
286)             pytest.param(
287)                 {
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

288)                     'global': {'phrase': DUMMY_PASSPHRASE.rstrip('\n')},
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

289)                     'services': {
290)                         DUMMY_SERVICE: {
291)                             'key': DUMMY_KEY1_B64,
292)                             **DUMMY_CONFIG_SETTINGS,
293)                         }
294)                     },
295)                 },
296)                 id='service',
297)             ),
298)         ],
299)     )
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

300)     def test_204a_key_from_config(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

301)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

302)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 1 month ago

303)         config: _types.VaultConfig,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

304)     ) -> None:
305)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

306)         with tests.isolated_config(
307)             monkeypatch=monkeypatch, runner=runner, config=config
308)         ):
309)             monkeypatch.setattr(
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 1 month ago

310)                 dpp.vault.Vault, 'phrase_from_key', tests.phrase_from_key
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

311)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

312)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

313)                 cli.derivepassphrase, [DUMMY_SERVICE], catch_exceptions=False
314)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

315)         result = tests.ReadableResult.parse(_result)
316)         assert result.clean_exit(
317)             empty_stderr=True
318)         ), 'expected clean exit and empty stderr'
319)         assert _result.stdout_bytes
320)         assert (
321)             _result.stdout_bytes.rstrip(b'\n') != DUMMY_RESULT_PASSPHRASE
322)         ), 'known false output: phrase-based instead of key-based'
323)         assert (
324)             _result.stdout_bytes.rstrip(b'\n') == DUMMY_RESULT_KEY1
325)         ), 'expected known output'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

326) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

327)     def test_204b_key_from_command_line(
328)         self, monkeypatch: pytest.MonkeyPatch
329)     ) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

330)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

331)         with tests.isolated_config(
332)             monkeypatch=monkeypatch,
333)             runner=runner,
334)             config={'services': {DUMMY_SERVICE: DUMMY_CONFIG_SETTINGS}},
335)         ):
336)             monkeypatch.setattr(
337)                 cli, '_get_suitable_ssh_keys', tests.suitable_ssh_keys
338)             )
339)             monkeypatch.setattr(
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 1 month ago

340)                 dpp.vault.Vault, 'phrase_from_key', tests.phrase_from_key
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

341)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

342)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

343)                 cli.derivepassphrase,
344)                 ['-k', DUMMY_SERVICE],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

345)                 input='1\n',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

346)                 catch_exceptions=False,
347)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

348)         result = tests.ReadableResult.parse(_result)
349)         assert result.clean_exit(), 'expected clean exit'
350)         assert _result.stdout_bytes, 'expected program output'
351)         last_line = _result.stdout_bytes.splitlines(True)[-1]
352)         assert (
353)             last_line.rstrip(b'\n') != DUMMY_RESULT_PASSPHRASE
354)         ), 'known false output: phrase-based instead of key-based'
355)         assert (
356)             last_line.rstrip(b'\n') == DUMMY_RESULT_KEY1
357)         ), 'expected known output'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

358) 
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 1 month ago

359)     @tests.skip_if_no_agent
360)     @pytest.mark.parametrize(
361)         'config',
362)         [
363)             pytest.param(
364)                 {
365)                     'global': {'key': DUMMY_KEY1_B64},
366)                     'services': {DUMMY_SERVICE: {}},
367)                 },
368)                 id='global_config',
369)             ),
370)             pytest.param(
371)                 {'services': {DUMMY_SERVICE: {'key': DUMMY_KEY2_B64}}},
372)                 id='service_config',
373)             ),
374)             pytest.param(
375)                 {
376)                     'global': {'key': DUMMY_KEY1_B64},
377)                     'services': {DUMMY_SERVICE: {'key': DUMMY_KEY2_B64}},
378)                 },
379)                 id='full_config',
380)             ),
381)         ],
382)     )
383)     @pytest.mark.parametrize('key_index', [1, 2, 3], ids=lambda i: f'index{i}')
384)     def test_204c_key_override_on_command_line(
385)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

386)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 1 month ago

387)         config: dict[str, Any],
388)         key_index: int,
389)     ) -> None:
390)         def sign(
Marco Ricci Apply new ruff ruleset to c...

Marco Ricci authored 2 weeks ago

391)             _: Any, key: bytes | bytearray, message: bytes | bytearray
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 1 month ago

392)         ) -> bytes:
393)             del message  # Unused.
394)             for value in tests.SUPPORTED_KEYS.values():
395)                 if value['public_key_data'] == key:
396)                     assert value['expected_signature'] is not None
397)                     return value['expected_signature']
398)             raise AssertionError
399) 
400)         monkeypatch.setattr(
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 1 month ago

401)             ssh_agent.SSHAgentClient, 'list_keys', tests.list_keys
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 1 month ago

402)         )
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 1 month ago

403)         monkeypatch.setattr(ssh_agent.SSHAgentClient, 'sign', sign)
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 1 month ago

404)         runner = click.testing.CliRunner(mix_stderr=False)
405)         with tests.isolated_config(
406)             monkeypatch=monkeypatch, runner=runner, config=config
407)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

408)             _result = runner.invoke(
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 1 month ago

409)                 cli.derivepassphrase,
410)                 ['-k', DUMMY_SERVICE],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

411)                 input=f'{key_index}\n',
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 1 month ago

412)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

413)         result = tests.ReadableResult.parse(_result)
414)         assert result.clean_exit(), 'expected clean exit'
415)         assert result.output, 'expected program output'
416)         assert result.stderr, 'expected stderr'
417)         assert (
418)             'Error:' not in result.stderr
419)         ), 'expected no error messages on stderr'
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 1 month ago

420) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

421)     def test_205_service_phrase_if_key_in_global_config(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

422)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

423)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

424)     ) -> None:
425)         runner = click.testing.CliRunner(mix_stderr=False)
426)         with tests.isolated_config(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

427)             monkeypatch=monkeypatch,
428)             runner=runner,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

429)             config={
430)                 'global': {'key': DUMMY_KEY1_B64},
431)                 'services': {
432)                     DUMMY_SERVICE: {
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

433)                         'phrase': DUMMY_PASSPHRASE.rstrip('\n'),
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

434)                         **DUMMY_CONFIG_SETTINGS,
435)                     }
436)                 },
437)             },
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

438)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

439)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

440)                 cli.derivepassphrase, [DUMMY_SERVICE], catch_exceptions=False
441)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

442)         result = tests.ReadableResult.parse(_result)
443)         assert result.clean_exit(), 'expected clean exit'
444)         assert _result.stdout_bytes, 'expected program output'
445)         last_line = _result.stdout_bytes.splitlines(True)[-1]
446)         assert (
447)             last_line.rstrip(b'\n') != DUMMY_RESULT_KEY1
448)         ), 'known false output: key-based instead of phrase-based'
449)         assert (
450)             last_line.rstrip(b'\n') == DUMMY_RESULT_PASSPHRASE
451)         ), 'expected known output'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

452) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

453)     @pytest.mark.parametrize(
454)         'option',
455)         [
456)             '--lower',
457)             '--upper',
458)             '--number',
459)             '--space',
460)             '--dash',
461)             '--symbol',
462)             '--repeat',
463)             '--length',
464)         ],
465)     )
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

466)     def test_210_invalid_argument_range(
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

467)         self, monkeypatch: pytest.MonkeyPatch, option: str
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

468)     ) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

469)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

470)         with tests.isolated_config(
471)             monkeypatch=monkeypatch,
472)             runner=runner,
473)             config={'services': {}},
474)         ):
475)             for value in '-42', 'invalid':
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

476)                 _result = runner.invoke(
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

477)                     cli.derivepassphrase,
478)                     [option, value, '-p', DUMMY_SERVICE],
479)                     input=DUMMY_PASSPHRASE,
480)                     catch_exceptions=False,
481)                 )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

482)                 result = tests.ReadableResult.parse(_result)
483)                 assert result.error_exit(
484)                     error='Error: Invalid value'
485)                 ), 'expected error exit and known error message'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

486) 
487)     @pytest.mark.parametrize(
488)         ['options', 'service', 'input', 'check_success'],
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

489)         [
490)             (o.options, o.needs_service, o.input, o.check_success)
491)             for o in INTERESTING_OPTION_COMBINATIONS
492)             if not o.incompatible
493)         ],
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

494)     )
495)     def test_211_service_needed(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

496)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

497)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

498)         options: list[str],
499)         service: bool | None,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

500)         input: str | None,
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

501)         check_success: bool,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

502)     ) -> None:
503)         monkeypatch.setattr(cli, '_prompt_for_passphrase', tests.auto_prompt)
504)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

505)         with tests.isolated_config(
506)             monkeypatch=monkeypatch,
507)             runner=runner,
508)             config={'global': {'phrase': 'abc'}, 'services': {}},
509)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

510)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

511)                 cli.derivepassphrase,
512)                 options if service else [*options, DUMMY_SERVICE],
513)                 input=input,
514)                 catch_exceptions=False,
515)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

516)             result = tests.ReadableResult.parse(_result)
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

517)             if service is not None:
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

518)                 err_msg = (
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

519)                     ' requires a SERVICE'
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

520)                     if service
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

521)                     else ' does not take a SERVICE argument'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

522)                 )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

523)                 assert result.error_exit(
524)                     error=err_msg
525)                 ), 'expected error exit and known error message'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

526)             else:
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

527)                 assert result.clean_exit(
528)                     empty_stderr=True
529)                 ), 'expected clean exit'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

530)         if check_success:
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

531)             with tests.isolated_config(
532)                 monkeypatch=monkeypatch,
533)                 runner=runner,
534)                 config={'global': {'phrase': 'abc'}, 'services': {}},
535)             ):
536)                 monkeypatch.setattr(
537)                     cli, '_prompt_for_passphrase', tests.auto_prompt
538)                 )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

539)                 _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

540)                     cli.derivepassphrase,
541)                     [*options, DUMMY_SERVICE] if service else options,
542)                     input=input,
543)                     catch_exceptions=False,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

544)                 )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

545)                 result = tests.ReadableResult.parse(_result)
546)             assert result.clean_exit(empty_stderr=True), 'expected clean exit'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

547) 
548)     @pytest.mark.parametrize(
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

549)         ['options', 'service'],
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

550)         [
551)             (o.options, o.needs_service)
552)             for o in INTERESTING_OPTION_COMBINATIONS
553)             if o.incompatible
554)         ],
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

555)     )
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

556)     def test_212_incompatible_options(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

557)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

558)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

559)         options: list[str],
560)         service: bool | None,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

561)     ) -> None:
562)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

563)         with tests.isolated_config(
564)             monkeypatch=monkeypatch,
565)             runner=runner,
566)             config={'services': {}},
567)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

568)             _result = runner.invoke(
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

569)                 cli.derivepassphrase,
570)                 [*options, DUMMY_SERVICE] if service else options,
571)                 input=DUMMY_PASSPHRASE,
572)                 catch_exceptions=False,
573)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

574)         result = tests.ReadableResult.parse(_result)
575)         assert result.error_exit(
576)             error='mutually exclusive with '
577)         ), 'expected error exit and known error message'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

578) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

579)     def test_213_import_bad_config_not_vault_config(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

580)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

581)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

582)     ) -> None:
583)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

584)         with tests.isolated_config(
585)             monkeypatch=monkeypatch, runner=runner, config={'services': {}}
586)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

587)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

588)                 cli.derivepassphrase,
589)                 ['--import', '-'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

590)                 input='null',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

591)                 catch_exceptions=False,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

592)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

593)         result = tests.ReadableResult.parse(_result)
594)         assert result.error_exit(
595)             error='Invalid vault config'
596)         ), 'expected error exit and known error message'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

597) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

598)     def test_213a_import_bad_config_not_json_data(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

599)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

600)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

601)     ) -> None:
602)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

603)         with tests.isolated_config(
604)             monkeypatch=monkeypatch, runner=runner, config={'services': {}}
605)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

606)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

607)                 cli.derivepassphrase,
608)                 ['--import', '-'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

609)                 input='This string is not valid JSON.',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

610)                 catch_exceptions=False,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

611)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

612)         result = tests.ReadableResult.parse(_result)
613)         assert result.error_exit(
614)             error='cannot decode JSON'
615)         ), 'expected error exit and known error message'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

616) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

617)     def test_213b_import_bad_config_not_a_file(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

618)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

619)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

620)     ) -> None:
621)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Fix miscellaneous type chec...

Marco Ricci authored 2 months ago

622)         # `isolated_config` validates the configuration.  So, to pass an
623)         # actual broken configuration, we must open the configuration file
624)         # ourselves afterwards, inside the context.
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

625)         with tests.isolated_config(
626)             monkeypatch=monkeypatch, runner=runner, config={'services': {}}
627)         ):
628)             with open(
629)                 cli._config_filename(), 'w', encoding='UTF-8'
630)             ) as outfile:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

631)                 print('This string is not valid JSON.', file=outfile)
Marco Ricci Fix miscellaneous type chec...

Marco Ricci authored 2 months ago

632)             dname = os.path.dirname(cli._config_filename())
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

633)             _result = runner.invoke(
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

634)                 cli.derivepassphrase,
Marco Ricci Fix miscellaneous type chec...

Marco Ricci authored 2 months ago

635)                 ['--import', os.fsdecode(dname)],
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

636)                 catch_exceptions=False,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

637)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

638)         result = tests.ReadableResult.parse(_result)
639)         assert result.error_exit(
640)             error=os.strerror(errno.EISDIR)
641)         ), 'expected error exit and known error message'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

642) 
643)     def test_214_export_settings_no_stored_settings(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

644)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

645)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

646)     ) -> None:
647)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

648)         with tests.isolated_config(
649)             monkeypatch=monkeypatch, runner=runner, config={'services': {}}
650)         ):
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

651)             with contextlib.suppress(FileNotFoundError):
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

652)                 os.remove(cli._config_filename())
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

653)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

654)                 cli.derivepassphrase, ['--export', '-'], catch_exceptions=False
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

655)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

656)         result = tests.ReadableResult.parse(_result)
657)         assert result.clean_exit(empty_stderr=True), 'expected clean exit'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

658) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

659)     def test_214a_export_settings_bad_stored_config(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

660)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

661)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

662)     ) -> None:
663)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

664)         with tests.isolated_config(
665)             monkeypatch=monkeypatch, runner=runner, config={}
666)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

667)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

668)                 cli.derivepassphrase,
669)                 ['--export', '-'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

670)                 input='null',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

671)                 catch_exceptions=False,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

672)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

673)         result = tests.ReadableResult.parse(_result)
674)         assert result.error_exit(
675)             error='Cannot load config'
676)         ), 'expected error exit and known error message'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

677) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

678)     def test_214b_export_settings_not_a_file(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

679)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

680)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

681)     ) -> None:
682)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

683)         with tests.isolated_config(
684)             monkeypatch=monkeypatch, runner=runner, config={'services': {}}
685)         ):
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

686)             with contextlib.suppress(FileNotFoundError):
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

687)                 os.remove(cli._config_filename())
688)             os.makedirs(cli._config_filename())
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

689)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

690)                 cli.derivepassphrase,
691)                 ['--export', '-'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

692)                 input='null',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

693)                 catch_exceptions=False,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

694)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

695)         result = tests.ReadableResult.parse(_result)
696)         assert result.error_exit(
697)             error='Cannot load config'
698)         ), 'expected error exit and known error message'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

699) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

700)     def test_214c_export_settings_target_not_a_file(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

701)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

702)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

703)     ) -> None:
704)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

705)         with tests.isolated_config(
706)             monkeypatch=monkeypatch, runner=runner, config={'services': {}}
707)         ):
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

708)             dname = os.path.dirname(cli._config_filename())
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

709)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

710)                 cli.derivepassphrase,
711)                 ['--export', os.fsdecode(dname)],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

712)                 input='null',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

713)                 catch_exceptions=False,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

714)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

715)         result = tests.ReadableResult.parse(_result)
716)         assert result.error_exit(
717)             error='Cannot store config'
718)         ), 'expected error exit and known error message'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

719) 
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

720)     def test_214d_export_settings_settings_directory_not_a_directory(
721)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

722)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

723)     ) -> None:
724)         runner = click.testing.CliRunner(mix_stderr=False)
725)         with tests.isolated_config(
726)             monkeypatch=monkeypatch, runner=runner, config={'services': {}}
727)         ):
728)             with contextlib.suppress(FileNotFoundError):
729)                 shutil.rmtree('.derivepassphrase')
730)             with open('.derivepassphrase', 'w', encoding='UTF-8') as outfile:
731)                 print('Obstruction!!', file=outfile)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

732)             _result = runner.invoke(
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

733)                 cli.derivepassphrase,
734)                 ['--export', '-'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

735)                 input='null',
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

736)                 catch_exceptions=False,
737)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

738)         result = tests.ReadableResult.parse(_result)
739)         assert result.error_exit(
740)             error='Cannot load config'
741)         ), 'expected error exit and known error message'
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

742) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

743)     def test_220_edit_notes_successfully(
744)         self, monkeypatch: pytest.MonkeyPatch
745)     ) -> None:
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

746)         edit_result = """
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

747) 
748) # - - - - - >8 - - - - - >8 - - - - - >8 - - - - - >8 - - - - -
749) contents go here
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

750) """
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

751)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

752)         with tests.isolated_config(
753)             monkeypatch=monkeypatch,
754)             runner=runner,
755)             config={'global': {'phrase': 'abc'}, 'services': {}},
756)         ):
757)             monkeypatch.setattr(click, 'edit', lambda *a, **kw: edit_result)  # noqa: ARG005
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

758)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

759)                 cli.derivepassphrase, ['--notes', 'sv'], catch_exceptions=False
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

760)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

761)             result = tests.ReadableResult.parse(_result)
762)             assert result.clean_exit(empty_stderr=True), 'expected clean exit'
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

763)             with open(cli._config_filename(), encoding='UTF-8') as infile:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

764)                 config = json.load(infile)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

765)             assert config == {
766)                 'global': {'phrase': 'abc'},
767)                 'services': {'sv': {'notes': 'contents go here'}},
768)             }
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

769) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

770)     def test_221_edit_notes_noop(
771)         self, monkeypatch: pytest.MonkeyPatch
772)     ) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

773)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

774)         with tests.isolated_config(
775)             monkeypatch=monkeypatch,
776)             runner=runner,
777)             config={'global': {'phrase': 'abc'}, 'services': {}},
778)         ):
779)             monkeypatch.setattr(click, 'edit', lambda *a, **kw: None)  # noqa: ARG005
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

780)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

781)                 cli.derivepassphrase, ['--notes', 'sv'], catch_exceptions=False
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

782)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

783)             result = tests.ReadableResult.parse(_result)
784)             assert result.clean_exit(empty_stderr=True), 'expected clean exit'
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

785)             with open(cli._config_filename(), encoding='UTF-8') as infile:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

786)                 config = json.load(infile)
787)             assert config == {'global': {'phrase': 'abc'}, 'services': {}}
788) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

789)     def test_222_edit_notes_marker_removed(
790)         self, monkeypatch: pytest.MonkeyPatch
791)     ) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

792)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

793)         with tests.isolated_config(
794)             monkeypatch=monkeypatch,
795)             runner=runner,
796)             config={'global': {'phrase': 'abc'}, 'services': {}},
797)         ):
798)             monkeypatch.setattr(click, 'edit', lambda *a, **kw: 'long\ntext')  # noqa: ARG005
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

799)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

800)                 cli.derivepassphrase, ['--notes', 'sv'], catch_exceptions=False
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

801)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

802)             result = tests.ReadableResult.parse(_result)
803)             assert result.clean_exit(empty_stderr=True), 'expected clean exit'
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

804)             with open(cli._config_filename(), encoding='UTF-8') as infile:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

805)                 config = json.load(infile)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

806)             assert config == {
807)                 'global': {'phrase': 'abc'},
808)                 'services': {'sv': {'notes': 'long\ntext'}},
809)             }
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

810) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

811)     def test_223_edit_notes_abort(
812)         self, monkeypatch: pytest.MonkeyPatch
813)     ) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

814)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

815)         with tests.isolated_config(
816)             monkeypatch=monkeypatch,
817)             runner=runner,
818)             config={'global': {'phrase': 'abc'}, 'services': {}},
819)         ):
820)             monkeypatch.setattr(click, 'edit', lambda *a, **kw: '\n\n')  # noqa: ARG005
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

821)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

822)                 cli.derivepassphrase, ['--notes', 'sv'], catch_exceptions=False
823)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

824)             result = tests.ReadableResult.parse(_result)
825)             assert result.error_exit(
826)                 error='user aborted request'
827)             ), 'expected known error message'
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

828)             with open(cli._config_filename(), encoding='UTF-8') as infile:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

829)                 config = json.load(infile)
830)             assert config == {'global': {'phrase': 'abc'}, 'services': {}}
831) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

832)     @pytest.mark.parametrize(
833)         ['command_line', 'input', 'result_config'],
834)         [
835)             (
836)                 ['--phrase'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

837)                 'my passphrase\n',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

838)                 {'global': {'phrase': 'my passphrase'}, 'services': {}},
839)             ),
840)             (
841)                 ['--key'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

842)                 '1\n',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

843)                 {'global': {'key': DUMMY_KEY1_B64}, 'services': {}},
844)             ),
845)             (
846)                 ['--phrase', 'sv'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

847)                 'my passphrase\n',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

848)                 {
849)                     'global': {'phrase': 'abc'},
850)                     'services': {'sv': {'phrase': 'my passphrase'}},
851)                 },
852)             ),
853)             (
854)                 ['--key', 'sv'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

855)                 '1\n',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

856)                 {
857)                     'global': {'phrase': 'abc'},
858)                     'services': {'sv': {'key': DUMMY_KEY1_B64}},
859)                 },
860)             ),
861)             (
862)                 ['--key', '--length', '15', 'sv'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

863)                 '1\n',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

864)                 {
865)                     'global': {'phrase': 'abc'},
866)                     'services': {'sv': {'key': DUMMY_KEY1_B64, 'length': 15}},
867)                 },
868)             ),
869)         ],
870)     )
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

871)     def test_224_store_config_good(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

872)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

873)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

874)         command_line: list[str],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

875)         input: str,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

876)         result_config: Any,
877)     ) -> None:
878)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

879)         with tests.isolated_config(
880)             monkeypatch=monkeypatch,
881)             runner=runner,
882)             config={'global': {'phrase': 'abc'}, 'services': {}},
883)         ):
884)             monkeypatch.setattr(
885)                 cli, '_get_suitable_ssh_keys', tests.suitable_ssh_keys
886)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

887)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

888)                 cli.derivepassphrase,
889)                 ['--config', *command_line],
890)                 catch_exceptions=False,
891)                 input=input,
892)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

893)             result = tests.ReadableResult.parse(_result)
894)             assert result.clean_exit(), 'expected clean exit'
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

895)             with open(cli._config_filename(), encoding='UTF-8') as infile:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

896)                 config = json.load(infile)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

897)             assert (
898)                 config == result_config
899)             ), 'stored config does not match expectation'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

900) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

901)     @pytest.mark.parametrize(
902)         ['command_line', 'input', 'err_text'],
903)         [
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

904)             ([], '', 'Cannot update global settings without actual settings'),
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

905)             (
906)                 ['sv'],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

907)                 '',
908)                 'Cannot update service settings without actual settings',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

909)             ),
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

910)             (['--phrase', 'sv'], '', 'No passphrase given'),
911)             (['--key'], '', 'No valid SSH key selected'),
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

912)         ],
913)     )
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

914)     def test_225_store_config_fail(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

915)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

916)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

917)         command_line: list[str],
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

918)         input: str,
919)         err_text: str,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

920)     ) -> None:
921)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

922)         with tests.isolated_config(
923)             monkeypatch=monkeypatch,
924)             runner=runner,
925)             config={'global': {'phrase': 'abc'}, 'services': {}},
926)         ):
927)             monkeypatch.setattr(
928)                 cli, '_get_suitable_ssh_keys', tests.suitable_ssh_keys
929)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

930)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

931)                 cli.derivepassphrase,
932)                 ['--config', *command_line],
933)                 catch_exceptions=False,
934)                 input=input,
935)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

936)         result = tests.ReadableResult.parse(_result)
937)         assert result.error_exit(
938)             error=err_text
939)         ), 'expected error exit and known error message'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

940) 
941)     def test_225a_store_config_fail_manual_no_ssh_key_selection(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

942)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

943)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

944)     ) -> None:
945)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

946)         with tests.isolated_config(
947)             monkeypatch=monkeypatch,
948)             runner=runner,
949)             config={'global': {'phrase': 'abc'}, 'services': {}},
950)         ):
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

951)             custom_error = 'custom error message'
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

952) 
Marco Ricci Fix typing issues in mypy s...

Marco Ricci authored 1 month ago

953)             def raiser() -> None:
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

954)                 raise RuntimeError(custom_error)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

955) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

956)             monkeypatch.setattr(cli, '_select_ssh_key', raiser)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

957)             _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

958)                 cli.derivepassphrase,
959)                 ['--key', '--config'],
960)                 catch_exceptions=False,
961)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

962)         result = tests.ReadableResult.parse(_result)
963)         assert result.error_exit(
964)             error=custom_error
965)         ), 'expected error exit and known error message'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

966) 
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

967)     def test_225b_store_config_fail_manual_no_ssh_agent(
968)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

969)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

970)     ) -> None:
971)         runner = click.testing.CliRunner(mix_stderr=False)
972)         with tests.isolated_config(
973)             monkeypatch=monkeypatch,
974)             runner=runner,
975)             config={'global': {'phrase': 'abc'}, 'services': {}},
976)         ):
977)             monkeypatch.delenv('SSH_AUTH_SOCK', raising=False)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

978)             _result = runner.invoke(
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

979)                 cli.derivepassphrase,
980)                 ['--key', '--config'],
981)                 catch_exceptions=False,
982)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

983)         result = tests.ReadableResult.parse(_result)
984)         assert result.error_exit(
985)             error='Cannot find running SSH agent'
986)         ), 'expected error exit and known error message'
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

987) 
988)     def test_225c_store_config_fail_manual_bad_ssh_agent_connection(
989)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

990)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

991)     ) -> None:
992)         runner = click.testing.CliRunner(mix_stderr=False)
993)         with tests.isolated_config(
994)             monkeypatch=monkeypatch,
995)             runner=runner,
996)             config={'global': {'phrase': 'abc'}, 'services': {}},
997)         ):
998)             monkeypatch.setenv('SSH_AUTH_SOCK', os.getcwd())
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

999)             _result = runner.invoke(
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1000)                 cli.derivepassphrase,
1001)                 ['--key', '--config'],
1002)                 catch_exceptions=False,
1003)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1004)         result = tests.ReadableResult.parse(_result)
1005)         assert result.error_exit(
1006)             error='Cannot connect to SSH agent'
1007)         ), 'expected error exit and known error message'
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1008) 
1009)     @pytest.mark.parametrize('try_race_free_implementation', [True, False])
1010)     def test_225d_store_config_fail_manual_read_only_file(
1011)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1012)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1013)         try_race_free_implementation: bool,
1014)     ) -> None:
1015)         runner = click.testing.CliRunner(mix_stderr=False)
1016)         with tests.isolated_config(
1017)             monkeypatch=monkeypatch,
1018)             runner=runner,
1019)             config={'global': {'phrase': 'abc'}, 'services': {}},
1020)         ):
1021)             tests.make_file_readonly(
1022)                 cli._config_filename(),
1023)                 try_race_free_implementation=try_race_free_implementation,
1024)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1025)             _result = runner.invoke(
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1026)                 cli.derivepassphrase,
1027)                 ['--config', '--length=15', DUMMY_SERVICE],
1028)                 catch_exceptions=False,
1029)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1030)         result = tests.ReadableResult.parse(_result)
1031)         assert result.error_exit(
1032)             error='Cannot store config'
1033)         ), 'expected error exit and known error message'
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1034) 
1035)     def test_225e_store_config_fail_manual_custom_error(
1036)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1037)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1038)     ) -> None:
1039)         runner = click.testing.CliRunner(mix_stderr=False)
1040)         with tests.isolated_config(
1041)             monkeypatch=monkeypatch,
1042)             runner=runner,
1043)             config={'global': {'phrase': 'abc'}, 'services': {}},
1044)         ):
1045)             custom_error = 'custom error message'
1046) 
1047)             def raiser(config: Any) -> None:
1048)                 del config
1049)                 raise RuntimeError(custom_error)
1050) 
1051)             monkeypatch.setattr(cli, '_save_config', raiser)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1052)             _result = runner.invoke(
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1053)                 cli.derivepassphrase,
1054)                 ['--config', '--length=15', DUMMY_SERVICE],
1055)                 catch_exceptions=False,
1056)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1057)         result = tests.ReadableResult.parse(_result)
1058)         assert result.error_exit(
1059)             error=custom_error
1060)         ), 'expected error exit and known error message'
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1061) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1062)     def test_226_no_arguments(self, monkeypatch: pytest.MonkeyPatch) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1063)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

1064)         with tests.isolated_config(
1065)             monkeypatch=monkeypatch,
1066)             runner=runner,
1067)             config={'services': {}},
1068)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1069)             _result = runner.invoke(
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

1070)                 cli.derivepassphrase, [], catch_exceptions=False
1071)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1072)         result = tests.ReadableResult.parse(_result)
1073)         assert result.error_exit(
1074)             error='SERVICE is required'
1075)         ), 'expected error exit and known error message'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

1076) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1077)     def test_226a_no_passphrase_or_key(
1078)         self, monkeypatch: pytest.MonkeyPatch
1079)     ) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1080)         runner = click.testing.CliRunner(mix_stderr=False)
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

1081)         with tests.isolated_config(
1082)             monkeypatch=monkeypatch,
1083)             runner=runner,
1084)             config={'services': {}},
1085)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1086)             _result = runner.invoke(
Marco Ricci Isolate tests properly and...

Marco Ricci authored 1 month ago

1087)                 cli.derivepassphrase, [DUMMY_SERVICE], catch_exceptions=False
1088)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1089)         result = tests.ReadableResult.parse(_result)
1090)         assert result.error_exit(
1091)             error='No passphrase or key given'
1092)         ), 'expected error exit and known error message'
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

1093) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1094)     def test_230_config_directory_nonexistant(
1095)         self, monkeypatch: pytest.MonkeyPatch
1096)     ) -> None:
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

1097)         """the-13th-letter/derivepassphrase#6"""
1098)         runner = click.testing.CliRunner(mix_stderr=False)
1099)         with tests.isolated_config(
1100)             monkeypatch=monkeypatch,
1101)             runner=runner,
1102)             config={'services': {}},
1103)         ):
1104)             os.remove('.derivepassphrase/settings.json')
1105)             os.rmdir('.derivepassphrase')
1106)             os_makedirs_called = False
1107)             real_os_makedirs = os.makedirs
1108) 
1109)             def makedirs(*args: Any, **kwargs: Any) -> Any:
1110)                 nonlocal os_makedirs_called
1111)                 os_makedirs_called = True
1112)                 return real_os_makedirs(*args, **kwargs)
1113) 
1114)             monkeypatch.setattr(os, 'makedirs', makedirs)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1115)             _result = runner.invoke(
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

1116)                 cli.derivepassphrase,
1117)                 ['--config', '-p'],
1118)                 catch_exceptions=False,
1119)                 input='abc\n',
1120)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1121)             result = tests.ReadableResult.parse(_result)
1122)             assert result.clean_exit(), 'expected clean exit'
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

1123)             assert (
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1124)                 result.stderr == 'Passphrase:'
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

1125)             ), 'program unexpectedly failed?!'
1126)             assert os_makedirs_called, 'os.makedirs has not been called?!'
1127)             with open(cli._config_filename(), encoding='UTF-8') as infile:
1128)                 config_readback = json.load(infile)
1129)             assert config_readback == {
1130)                 'global': {'phrase': 'abc'},
1131)                 'services': {},
1132)             }, 'config mismatch'
1133) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1134)     def test_230a_config_directory_not_a_file(
1135)         self, monkeypatch: pytest.MonkeyPatch
1136)     ) -> None:
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

1137)         """the-13th-letter/derivepassphrase#6"""
1138)         runner = click.testing.CliRunner(mix_stderr=False)
1139)         with tests.isolated_config(
1140)             monkeypatch=monkeypatch,
1141)             runner=runner,
1142)             config={'services': {}},
1143)         ):
1144)             _save_config = cli._save_config
1145) 
1146)             def obstruct_config_saving(*args: Any, **kwargs: Any) -> Any:
1147)                 with contextlib.suppress(FileNotFoundError):
1148)                     shutil.rmtree('.derivepassphrase')
1149)                 with open(
1150)                     '.derivepassphrase', 'w', encoding='UTF-8'
1151)                 ) as outfile:
1152)                     print('Obstruction!!', file=outfile)
1153)                 monkeypatch.setattr(cli, '_save_config', _save_config)
1154)                 return _save_config(*args, **kwargs)
1155) 
1156)             monkeypatch.setattr(cli, '_save_config', obstruct_config_saving)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1157)             _result = runner.invoke(
Marco Ricci Fix error bubbling in outda...

Marco Ricci authored 1 month ago

1158)                 cli.derivepassphrase,
1159)                 ['--config', '-p'],
1160)                 catch_exceptions=False,
1161)                 input='abc\n',
1162)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1163)             result = tests.ReadableResult.parse(_result)
1164)             assert result.error_exit(
1165)                 error='Cannot store config'
1166)             ), 'expected error exit and known error message'
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1167) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1168)     def test_230b_store_config_custom_error(
1169)         self, monkeypatch: pytest.MonkeyPatch
1170)     ) -> None:
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1171)         runner = click.testing.CliRunner(mix_stderr=False)
1172)         with tests.isolated_config(
1173)             monkeypatch=monkeypatch,
1174)             runner=runner,
1175)             config={'services': {}},
1176)         ):
1177)             _save_config = cli._save_config
1178) 
1179)             def obstruct_config_saving(*args: Any, **kwargs: Any) -> Any:
1180)                 with contextlib.suppress(FileNotFoundError):
1181)                     shutil.rmtree('.derivepassphrase')
1182)                 with open(
1183)                     '.derivepassphrase', 'w', encoding='UTF-8'
1184)                 ) as outfile:
1185)                     print('Obstruction!!', file=outfile)
1186)                 monkeypatch.setattr(cli, '_save_config', _save_config)
1187)                 return _save_config(*args, **kwargs)
1188) 
1189)             monkeypatch.setattr(cli, '_save_config', obstruct_config_saving)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1190)             _result = runner.invoke(
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 1 month ago

1191)                 cli.derivepassphrase,
1192)                 ['--config', '-p'],
1193)                 catch_exceptions=False,
1194)                 input='abc\n',
1195)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1196)             result = tests.ReadableResult.parse(_result)
1197)             assert result.error_exit(
1198)                 error='Cannot store config'
1199)             ), 'expected error exit and known error message'
Marco Ricci Create the configuration di...

Marco Ricci authored 1 month ago

1200) 
Marco Ricci Allow all textual strings,...

Marco Ricci authored 2 weeks ago

1201)     @pytest.mark.parametrize(
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1202)         ['command_line', 'input', 'warning_message'],
Marco Ricci Allow all textual strings,...

Marco Ricci authored 2 weeks ago

1203)         [
1204)             pytest.param(
1205)                 ['--import', '-'],
1206)                 json.dumps({
1207)                     'global': {'phrase': 'Du\u0308sseldorf'},
1208)                     'services': {},
1209)                 }),
1210)                 'the global passphrase is not NFC-normalized',
1211)                 id='global-NFC',
1212)             ),
1213)             pytest.param(
1214)                 ['--import', '-'],
1215)                 json.dumps({
1216)                     'services': {
1217)                         DUMMY_SERVICE: DUMMY_CONFIG_SETTINGS.copy(),
1218)                         'weird entry name': {'phrase': 'Du\u0308sseldorf'},
1219)                     }
1220)                 }),
1221)                 (
1222)                     "the services.'weird entry name' passphrase "
1223)                     'is not NFC-normalized'
1224)                 ),
1225)                 id='service-weird-name-NFC',
1226)             ),
1227)             pytest.param(
1228)                 ['--config', '-p', DUMMY_SERVICE],
1229)                 'Du\u0308sseldorf',
1230)                 (
1231)                     f'the services.{DUMMY_SERVICE} passphrase '
1232)                     f'is not NFC-normalized'
1233)                 ),
1234)                 id='config-NFC',
1235)             ),
1236)             pytest.param(
1237)                 ['-p', DUMMY_SERVICE],
1238)                 'Du\u0308sseldorf',
1239)                 'the interactive passphrase is not NFC-normalized',
1240)                 id='direct-input-NFC',
1241)             ),
1242)             pytest.param(
1243)                 ['--import', '-'],
1244)                 json.dumps({
1245)                     'global': {
1246)                         'unicode_normalization_form': 'NFD',
1247)                         'phrase': 'D\u00fcsseldorf',
1248)                     },
1249)                     'services': {},
1250)                 }),
1251)                 'the global passphrase is not NFD-normalized',
1252)                 id='global-NFD',
1253)             ),
1254)             pytest.param(
1255)                 ['--import', '-'],
1256)                 json.dumps({
1257)                     'global': {
1258)                         'unicode_normalization_form': 'NFD',
1259)                     },
1260)                     'services': {
1261)                         DUMMY_SERVICE: DUMMY_CONFIG_SETTINGS.copy(),
1262)                         'weird entry name': {'phrase': 'D\u00fcsseldorf'},
Marco Ricci Apply new ruff ruleset to c...

Marco Ricci authored 2 weeks ago

1263)                     },
Marco Ricci Allow all textual strings,...

Marco Ricci authored 2 weeks ago

1264)                 }),
1265)                 (
1266)                     "the services.'weird entry name' passphrase "
1267)                     'is not NFD-normalized'
1268)                 ),
1269)                 id='service-weird-name-NFD',
1270)             ),
1271)         ],
1272)     )
1273)     def test_300_unicode_normalization_form_warning(
1274)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1275)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Allow all textual strings,...

Marco Ricci authored 2 weeks ago

1276)         command_line: list[str],
1277)         input: str | None,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1278)         warning_message: str,
Marco Ricci Allow all textual strings,...

Marco Ricci authored 2 weeks ago

1279)     ) -> None:
1280)         runner = click.testing.CliRunner(mix_stderr=False)
1281)         with tests.isolated_config(
1282)             monkeypatch=monkeypatch,
1283)             runner=runner,
1284)             config={'services': {DUMMY_SERVICE: DUMMY_CONFIG_SETTINGS.copy()}},
1285)         ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1286)             _result = runner.invoke(
Marco Ricci Allow all textual strings,...

Marco Ricci authored 2 weeks ago

1287)                 cli.derivepassphrase,
1288)                 command_line,
1289)                 catch_exceptions=False,
1290)                 input=input,
1291)             )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1292)         result = tests.ReadableResult.parse(_result)
1293)         assert result.clean_exit(), 'expected clean exit'
1294)         assert (
1295)             warning_message in result.stderr
1296)         ), 'expected known warning message in stderr'
Marco Ricci Allow all textual strings,...

Marco Ricci authored 2 weeks ago

1297) 
Marco Ricci Add finished command-line i...

Marco Ricci authored 2 months ago

1298) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1299) class TestCLIUtils:
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1300)     def test_100_save_bad_config(
1301)         self, monkeypatch: pytest.MonkeyPatch
1302)     ) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1303)         runner = click.testing.CliRunner()
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1304)         with (
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1305)             tests.isolated_config(
1306)                 monkeypatch=monkeypatch, runner=runner, config={}
1307)             ),
1308)             pytest.raises(ValueError, match='Invalid vault config'),
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1309)         ):
Marco Ricci Apply new ruff ruleset to c...

Marco Ricci authored 2 weeks ago

1310)             cli._save_config(None)  # type: ignore[arg-type]
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1311) 
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1312)     def test_101_prompt_for_selection_multiple(self) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1313)         @click.command()
1314)         @click.option('--heading', default='Our menu:')
1315)         @click.argument('items', nargs=-1)
Marco Ricci Fix typing issues in mypy s...

Marco Ricci authored 1 month ago

1316)         def driver(heading: str, items: list[str]) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1317)             # from https://montypython.fandom.com/wiki/Spam#The_menu
1318)             items = items or [
1319)                 'Egg and bacon',
1320)                 'Egg, sausage and bacon',
1321)                 'Egg and spam',
1322)                 'Egg, bacon and spam',
1323)                 'Egg, bacon, sausage and spam',
1324)                 'Spam, bacon, sausage and spam',
1325)                 'Spam, egg, spam, spam, bacon and spam',
1326)                 'Spam, spam, spam, egg and spam',
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1327)                 (
1328)                     'Spam, spam, spam, spam, spam, spam, baked beans, '
1329)                     'spam, spam, spam and spam'
1330)                 ),
1331)                 (
1332)                     'Lobster thermidor aux crevettes with a mornay sauce '
1333)                     'garnished with truffle paté, brandy '
1334)                     'and a fried egg on top and spam'
1335)                 ),
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1336)             ]
1337)             index = cli._prompt_for_selection(items, heading=heading)
1338)             click.echo('A fine choice: ', nl=False)
1339)             click.echo(items[index])
1340)             click.echo('(Note: Vikings strictly optional.)')
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1341) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1342)         runner = click.testing.CliRunner(mix_stderr=True)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1343)         _result = runner.invoke(driver, [], input='9')
1344)         result = tests.ReadableResult.parse(_result)
1345)         assert result.clean_exit(
1346)             output="""\
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1347) Our menu:
1348) [1] Egg and bacon
1349) [2] Egg, sausage and bacon
1350) [3] Egg and spam
1351) [4] Egg, bacon and spam
1352) [5] Egg, bacon, sausage and spam
1353) [6] Spam, bacon, sausage and spam
1354) [7] Spam, egg, spam, spam, bacon and spam
1355) [8] Spam, spam, spam, egg and spam
1356) [9] Spam, spam, spam, spam, spam, spam, baked beans, spam, spam, spam and spam
1357) [10] Lobster thermidor aux crevettes with a mornay sauce garnished with truffle paté, brandy and a fried egg on top and spam
1358) Your selection? (1-10, leave empty to abort): 9
1359) A fine choice: Spam, spam, spam, spam, spam, spam, baked beans, spam, spam, spam and spam
1360) (Note: Vikings strictly optional.)
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1361) """  # noqa: E501
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1362)         ), 'expected clean exit'
1363)         _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1364)             driver, ['--heading='], input='', catch_exceptions=True
1365)         )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1366)         result = tests.ReadableResult.parse(_result)
1367)         assert result.error_exit(
1368)             error=IndexError
1369)         ), 'expected error exit and known error type'
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1370)         assert (
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1371)             result.output
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1372)             == """\
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1373) [1] Egg and bacon
1374) [2] Egg, sausage and bacon
1375) [3] Egg and spam
1376) [4] Egg, bacon and spam
1377) [5] Egg, bacon, sausage and spam
1378) [6] Spam, bacon, sausage and spam
1379) [7] Spam, egg, spam, spam, bacon and spam
1380) [8] Spam, spam, spam, egg and spam
1381) [9] Spam, spam, spam, spam, spam, spam, baked beans, spam, spam, spam and spam
1382) [10] Lobster thermidor aux crevettes with a mornay sauce garnished with truffle paté, brandy and a fried egg on top and spam
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1383) Your selection? (1-10, leave empty to abort):\x20
1384) """  # noqa: E501
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1385)         ), 'expected known output'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1386) 
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1387)     def test_102_prompt_for_selection_single(self) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1388)         @click.command()
1389)         @click.option('--item', default='baked beans')
1390)         @click.argument('prompt')
Marco Ricci Fix typing issues in mypy s...

Marco Ricci authored 1 month ago

1391)         def driver(item: str, prompt: str) -> None:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1392)             try:
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1393)                 cli._prompt_for_selection(
1394)                     [item], heading='', single_choice_prompt=prompt
1395)                 )
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1396)             except IndexError:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1397)                 click.echo('Boo.')
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1398)                 raise
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1399)             else:
1400)                 click.echo('Great!')
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1401) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1402)         runner = click.testing.CliRunner(mix_stderr=True)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1403)         _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1404)             driver, ['Will replace with spam. Confirm, y/n?'], input='y'
1405)         )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1406)         result = tests.ReadableResult.parse(_result)
1407)         assert result.clean_exit(
1408)             output="""\
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1409) [1] baked beans
1410) Will replace with spam. Confirm, y/n? y
1411) Great!
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1412) """
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1413)         ), 'expected clean exit'
1414)         _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1415)             driver,
1416)             ['Will replace with spam, okay? ' '(Please say "y" or "n".)'],
1417)             input='',
1418)         )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1419)         result = tests.ReadableResult.parse(_result)
1420)         assert result.error_exit(
1421)             error=IndexError
1422)         ), 'expected error exit and known error type'
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1423)         assert (
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1424)             result.output
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1425)             == """\
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1426) [1] baked beans
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1427) Will replace with spam, okay? (Please say "y" or "n".):\x20
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1428) Boo.
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1429) """
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1430)         ), 'expected known output'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1431) 
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1432)     def test_103_prompt_for_passphrase(
1433)         self, monkeypatch: pytest.MonkeyPatch
1434)     ) -> None:
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1435)         monkeypatch.setattr(
1436)             click,
1437)             'prompt',
1438)             lambda *a, **kw: json.dumps({'args': a, 'kwargs': kw}),
1439)         )
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1440)         res = json.loads(cli._prompt_for_passphrase())
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1441)         err_msg = 'missing arguments to passphrase prompt'
1442)         assert 'args' in res, err_msg
1443)         assert 'kwargs' in res, err_msg
1444)         assert res['args'][:1] == ['Passphrase'], err_msg
1445)         assert res['kwargs'].get('default') == '', err_msg
1446)         assert not res['kwargs'].get('show_default', True), err_msg
1447)         assert res['kwargs'].get('err'), err_msg
1448)         assert res['kwargs'].get('hide_input'), err_msg
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1449) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1450)     @pytest.mark.parametrize(
1451)         ['command_line', 'config', 'result_config'],
1452)         [
1453)             (
1454)                 ['--delete-globals'],
1455)                 {'global': {'phrase': 'abc'}, 'services': {}},
1456)                 {'services': {}},
1457)             ),
1458)             (
1459)                 ['--delete', DUMMY_SERVICE],
1460)                 {
1461)                     'global': {'phrase': 'abc'},
1462)                     'services': {DUMMY_SERVICE: {'notes': '...'}},
1463)                 },
1464)                 {'global': {'phrase': 'abc'}, 'services': {}},
1465)             ),
1466)             (
1467)                 ['--clear'],
1468)                 {
1469)                     'global': {'phrase': 'abc'},
1470)                     'services': {DUMMY_SERVICE: {'notes': '...'}},
1471)                 },
1472)                 {'services': {}},
1473)             ),
1474)         ],
1475)     )
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1476)     def test_203_repeated_config_deletion(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1477)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1478)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1479)         command_line: list[str],
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 1 month ago

1480)         config: _types.VaultConfig,
1481)         result_config: _types.VaultConfig,
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1482)     ) -> None:
1483)         runner = click.testing.CliRunner(mix_stderr=False)
1484)         for start_config in [config, result_config]:
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1485)             with tests.isolated_config(
1486)                 monkeypatch=monkeypatch, runner=runner, config=start_config
1487)             ):
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1488)                 _result = runner.invoke(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1489)                     cli.derivepassphrase, command_line, catch_exceptions=False
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1490)                 )
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1491)                 result = tests.ReadableResult.parse(_result)
1492)                 assert result.clean_exit(
1493)                     empty_stderr=True
1494)                 ), 'expected clean exit'
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1495)                 with open(cli._config_filename(), encoding='UTF-8') as infile:
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1496)                     config_readback = json.load(infile)
1497)                 assert config_readback == result_config
1498) 
1499)     def test_204_phrase_from_key_manually(self) -> None:
1500)         assert (
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 1 month ago

1501)             dpp.vault.Vault(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1502)                 phrase=DUMMY_PHRASE_FROM_KEY1, **DUMMY_CONFIG_SETTINGS
1503)             ).generate(DUMMY_SERVICE)
1504)             == DUMMY_RESULT_KEY1
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1505)         )
1506) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1507)     @pytest.mark.parametrize(
1508)         ['vfunc', 'input'],
1509)         [
1510)             (cli._validate_occurrence_constraint, 20),
1511)             (cli._validate_length, 20),
1512)         ],
1513)     )
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1514)     def test_210a_validate_constraints_manually(
1515)         self,
1516)         vfunc: Callable[[click.Context, click.Parameter, Any], int | None],
1517)         input: int,
1518)     ) -> None:
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1519)         ctx = cli.derivepassphrase.make_context(cli.PROG_NAME, [])
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1520)         param = cli.derivepassphrase.params[0]
1521)         assert vfunc(ctx, param, input) == input
1522) 
1523)     @tests.skip_if_no_agent
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1524)     @pytest.mark.parametrize('conn_hint', ['none', 'socket', 'client'])
Marco Ricci Fix miscellaneous type chec...

Marco Ricci authored 2 months ago

1525)     def test_227_get_suitable_ssh_keys(
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1526)         self,
Marco Ricci Clean up testing machinery...

Marco Ricci authored 2 weeks ago

1527)         monkeypatch: pytest.MonkeyPatch,
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1528)         conn_hint: str,
Marco Ricci Fix miscellaneous type chec...

Marco Ricci authored 2 months ago

1529)     ) -> None:
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1530)         monkeypatch.setattr(
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 1 month ago

1531)             ssh_agent.SSHAgentClient, 'list_keys', tests.list_keys
Marco Ricci Reformat everything with ruff

Marco Ricci authored 1 month ago

1532)         )
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 1 month ago

1533)         hint: ssh_agent.SSHAgentClient | socket.socket | None
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1534)         match conn_hint:
1535)             case 'client':
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 1 month ago

1536)                 hint = ssh_agent.SSHAgentClient()
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1537)             case 'socket':
1538)                 hint = socket.socket(family=socket.AF_UNIX)
1539)                 hint.connect(os.environ['SSH_AUTH_SOCK'])
1540)             case _:
1541)                 assert conn_hint == 'none'
1542)                 hint = None
1543)         exception: Exception | None = None
1544)         try:
1545)             list(cli._get_suitable_ssh_keys(hint))
1546)         except RuntimeError:  # pragma: no cover
1547)             pass
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 1 month ago

1548)         except Exception as e:  # noqa: BLE001 # pragma: no cover
Marco Ricci Rename and regroup all test...

Marco Ricci authored 2 months ago

1549)             exception = e
1550)         finally: