Marco Ricci commited on 2025-01-01 14:08:48
Zeige 2 geänderte Dateien mit 120 Einfügungen und 7 Löschungen.
These sections no longer need be excluded from coverage.
... | ... |
@@ -993,7 +993,7 @@ def version_option_callback( |
993 | 993 |
ctx: click.Context, |
994 | 994 |
param: click.Parameter, |
995 | 995 |
value: bool, # noqa: FBT001 |
996 |
-) -> None: # pragma: no cover |
|
996 |
+) -> None: |
|
997 | 997 |
del param |
998 | 998 |
if value and not ctx.resilient_parsing: |
999 | 999 |
click.echo( |
... | ... |
@@ -1027,9 +1027,9 @@ def color_forcing_callback( |
1027 | 1027 |
) -> None: |
1028 | 1028 |
"""Force the `click` context to honor `NO_COLOR` and `FORCE_COLOR`.""" |
1029 | 1029 |
del param, value |
1030 |
- if os.environ.get('NO_COLOR'): # pragma: no cover |
|
1030 |
+ if os.environ.get('NO_COLOR'): |
|
1031 | 1031 |
ctx.color = False |
1032 |
- if os.environ.get('FORCE_COLOR'): # pragma: no cover |
|
1032 |
+ if os.environ.get('FORCE_COLOR'): |
|
1033 | 1033 |
ctx.color = True |
1034 | 1034 |
|
1035 | 1035 |
|
... | ... |
@@ -2730,13 +2730,13 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
2730 | 2730 |
group = LoggingOption |
2731 | 2731 |
elif isinstance(param, CompatibilityOption): |
2732 | 2732 |
group = CompatibilityOption |
2733 |
- elif isinstance(param, StandardOption): # pragma: no branch |
|
2733 |
+ elif isinstance(param, StandardOption): |
|
2734 | 2734 |
group = StandardOption |
2735 | 2735 |
elif isinstance(param, OptionGroupOption): # pragma: no cover |
2736 | 2736 |
raise AssertionError( # noqa: DOC501,TRY003,TRY004 |
2737 | 2737 |
f'Unknown option group for {param!r}' # noqa: EM102 |
2738 | 2738 |
) |
2739 |
- else: # pragma: no cover |
|
2739 |
+ else: |
|
2740 | 2740 |
group = click.Option |
2741 | 2741 |
options_in_group.setdefault(group, []).append(param) |
2742 | 2742 |
params_by_str[param.human_readable_name] = param |
... | ... |
@@ -280,15 +280,106 @@ def vault_config_exporter_shell_interpreter( # noqa: C901 |
280 | 280 |
) |
281 | 281 |
|
282 | 282 |
|
283 |
+class TestAllCLI: |
|
284 |
+ @pytest.mark.parametrize( |
|
285 |
+ ['command', 'non_eager_arguments'], |
|
286 |
+ [ |
|
287 |
+ ([], []), |
|
288 |
+ ([], ['export']), |
|
289 |
+ (['export'], []), |
|
290 |
+ (['export'], ['vault']), |
|
291 |
+ (['export', 'vault'], []), |
|
292 |
+ (['export', 'vault'], ['--format', 'this-format-doesnt-exist']), |
|
293 |
+ (['vault'], []), |
|
294 |
+ (['vault'], ['--export', './']), |
|
295 |
+ ] |
|
296 |
+ ) |
|
297 |
+ @pytest.mark.parametrize('arguments', [['--help'], ['--version']]) |
|
298 |
+ def test_200_eager_options( |
|
299 |
+ self, |
|
300 |
+ monkeypatch: pytest.MonkeyPatch, |
|
301 |
+ command: list[str], |
|
302 |
+ arguments: list[str], |
|
303 |
+ non_eager_arguments: list[str], |
|
304 |
+ ) -> None: |
|
305 |
+ runner = click.testing.CliRunner(mix_stderr=False) |
|
306 |
+ with tests.isolated_config( |
|
307 |
+ monkeypatch=monkeypatch, |
|
308 |
+ runner=runner, |
|
309 |
+ ): |
|
310 |
+ _result = runner.invoke( |
|
311 |
+ cli.derivepassphrase, |
|
312 |
+ [*command, *arguments, *non_eager_arguments], |
|
313 |
+ catch_exceptions=False, |
|
314 |
+ ) |
|
315 |
+ result = tests.ReadableResult.parse(_result) |
|
316 |
+ assert result.clean_exit(empty_stderr=True), 'expected clean exit' |
|
317 |
+ |
|
318 |
+ @pytest.mark.parametrize('no_color', [False, True]) |
|
319 |
+ @pytest.mark.parametrize('force_color', [False, True]) |
|
320 |
+ @pytest.mark.parametrize('isatty', [False, True]) |
|
321 |
+ @pytest.mark.parametrize( |
|
322 |
+ ['command_line', 'input'], |
|
323 |
+ [ |
|
324 |
+ ( |
|
325 |
+ ['vault', '--import', '-'], |
|
326 |
+ '{"services": {"": {"length": 20}}}', |
|
327 |
+ ), |
|
328 |
+ ] |
|
329 |
+ ) |
|
330 |
+ def test_201_no_color_force_color( |
|
331 |
+ self, |
|
332 |
+ monkeypatch: pytest.MonkeyPatch, |
|
333 |
+ no_color: bool, |
|
334 |
+ force_color: bool, |
|
335 |
+ isatty: bool, |
|
336 |
+ command_line: list[str], |
|
337 |
+ input: str | None, |
|
338 |
+ ) -> None: |
|
339 |
+ # Force color on if force_color. Otherwise force color off if |
|
340 |
+ # no_color. Otherwise set color if and only if we have a TTY. |
|
341 |
+ color = force_color or not no_color if isatty else force_color |
|
342 |
+ runner = click.testing.CliRunner(mix_stderr=False) |
|
343 |
+ with tests.isolated_config( |
|
344 |
+ monkeypatch=monkeypatch, |
|
345 |
+ runner=runner, |
|
346 |
+ ): |
|
347 |
+ if no_color: |
|
348 |
+ monkeypatch.setenv('NO_COLOR', 'yes') |
|
349 |
+ if force_color: |
|
350 |
+ monkeypatch.setenv('FORCE_COLOR', 'yes') |
|
351 |
+ _result = runner.invoke( |
|
352 |
+ cli.derivepassphrase, |
|
353 |
+ command_line, |
|
354 |
+ input=input, |
|
355 |
+ catch_exceptions=False, |
|
356 |
+ color=isatty, |
|
357 |
+ ) |
|
358 |
+ result = tests.ReadableResult.parse(_result) |
|
359 |
+ assert ( |
|
360 |
+ not color |
|
361 |
+ or '\x1b[0m' in result.stderr |
|
362 |
+ or '\x1b[m' in result.stderr |
|
363 |
+ ), 'Expected color, but found no ANSI reset sequence' |
|
364 |
+ assert ( |
|
365 |
+ color or '\x1b[' not in result.stderr |
|
366 |
+ ), 'Expected no color, but found an ANSI control sequence' |
|
367 |
+ |
|
368 |
+ |
|
283 | 369 |
class TestCLI: |
284 |
- def test_200_help_output(self, monkeypatch: pytest.MonkeyPatch) -> None: |
|
370 |
+ def test_200_help_output( |
|
371 |
+ self, |
|
372 |
+ monkeypatch: pytest.MonkeyPatch, |
|
373 |
+ ) -> None: |
|
285 | 374 |
runner = click.testing.CliRunner(mix_stderr=False) |
286 | 375 |
with tests.isolated_config( |
287 | 376 |
monkeypatch=monkeypatch, |
288 | 377 |
runner=runner, |
289 | 378 |
): |
290 | 379 |
_result = runner.invoke( |
291 |
- cli.derivepassphrase_vault, ['--help'], catch_exceptions=False |
|
380 |
+ cli.derivepassphrase_vault, |
|
381 |
+ ['--help'], |
|
382 |
+ catch_exceptions=False, |
|
292 | 383 |
) |
293 | 384 |
result = tests.ReadableResult.parse(_result) |
294 | 385 |
assert result.clean_exit( |
... | ... |
@@ -298,6 +389,28 @@ class TestCLI: |
298 | 389 |
empty_stderr=True, output='Use $VISUAL or $EDITOR to configure' |
299 | 390 |
), 'expected clean exit, and option group epilog in help text' |
300 | 391 |
|
392 |
+ def test_200a_version_output( |
|
393 |
+ self, |
|
394 |
+ monkeypatch: pytest.MonkeyPatch, |
|
395 |
+ ) -> None: |
|
396 |
+ runner = click.testing.CliRunner(mix_stderr=False) |
|
397 |
+ with tests.isolated_config( |
|
398 |
+ monkeypatch=monkeypatch, |
|
399 |
+ runner=runner, |
|
400 |
+ ): |
|
401 |
+ _result = runner.invoke( |
|
402 |
+ cli.derivepassphrase_vault, |
|
403 |
+ ['--version'], |
|
404 |
+ catch_exceptions=False, |
|
405 |
+ ) |
|
406 |
+ result = tests.ReadableResult.parse(_result) |
|
407 |
+ assert result.clean_exit( |
|
408 |
+ empty_stderr=True, output=cli.PROG_NAME |
|
409 |
+ ), 'expected clean exit, and program name in version text' |
|
410 |
+ assert result.clean_exit( |
|
411 |
+ empty_stderr=True, output=cli.__version__ |
|
412 |
+ ), 'expected clean exit, and version in help text' |
|
413 |
+ |
|
301 | 414 |
@pytest.mark.parametrize( |
302 | 415 |
'charset_name', ['lower', 'upper', 'number', 'space', 'dash', 'symbol'] |
303 | 416 |
) |
304 | 417 |