|
4 | 4 |
|
5 | 5 | # 3rd party |
6 | 6 | import click |
| 7 | +import pytest |
| 8 | +from coincidence.regressions import AdvancedFileRegressionFixture |
7 | 9 | from pytest_regressions.file_regression import FileRegressionFixture |
8 | 10 |
|
9 | 11 | # this package |
10 | 12 | from consolekit import click_command |
11 | 13 | from consolekit.options import ( |
| 14 | + ChoiceOption, |
12 | 15 | DescribedArgument, |
13 | 16 | MultiValueOption, |
| 17 | + PromptOption, |
14 | 18 | auto_default_argument, |
15 | 19 | auto_default_option, |
16 | 20 | colour_option, |
|
21 | 25 | version_option |
22 | 26 | ) |
23 | 27 | from consolekit.terminal_colours import ColourTrilean |
24 | | -from consolekit.testing import CliRunner, Result |
| 28 | +from consolekit.testing import CliRunner, Result, _click_major, _click_version, click_8_only, not_click_8 |
25 | 29 |
|
26 | 30 |
|
27 | 31 | def test_described_argument( |
@@ -305,3 +309,107 @@ def main(greeting: str = "Hello") -> None: |
305 | 309 | result = cli_runner.invoke(main, args=["Good Morning"]) |
306 | 310 | assert result.stdout.rstrip() == "Good Morning User!" |
307 | 311 | assert result.exit_code == 0 |
| 312 | + |
| 313 | + |
| 314 | +@pytest.mark.parametrize( |
| 315 | + "click_version", |
| 316 | + [pytest.param('7', marks=click_8_only), pytest.param('8', marks=not_click_8)], |
| 317 | + ) |
| 318 | +def test_choice_option( |
| 319 | + advanced_file_regression: AdvancedFileRegressionFixture, |
| 320 | + click_version: str, |
| 321 | + cli_runner: CliRunner, |
| 322 | + ): |
| 323 | + |
| 324 | + @click.option( |
| 325 | + "-s", |
| 326 | + "--station", |
| 327 | + help="The station to play.", |
| 328 | + type=click.Choice(["Radio 1", "Radio 2", "Radio 3"], case_sensitive=False), |
| 329 | + cls=ChoiceOption, |
| 330 | + prompt="Select a station", |
| 331 | + ) |
| 332 | + @click_command() |
| 333 | + def main(station: str) -> None: |
| 334 | + print(f"Tuning to station: {station}") |
| 335 | + |
| 336 | + result = cli_runner.invoke(main, input="5\n0\n2\n") |
| 337 | + assert result.exit_code == 0 |
| 338 | + advanced_file_regression.check(result.stdout.rstrip()) |
| 339 | + |
| 340 | + result = cli_runner.invoke(main, args=["--station", "Radio 1"]) |
| 341 | + assert result.exit_code == 0 |
| 342 | + assert result.stdout.rstrip() == "Tuning to station: Radio 1" |
| 343 | + |
| 344 | + |
| 345 | +not_click_8_or_above_82 = pytest.mark.skipif( |
| 346 | + _click_major != 8 or (_click_major == 8 and _click_version[1] >= 2), reason="Output differs on click 8" |
| 347 | + ) |
| 348 | +not_click_8_or_below_82 = pytest.mark.skipif( |
| 349 | + _click_major != 8 or (_click_major == 8 and _click_version[1] < 2), reason="Output differs on click 8.2" |
| 350 | + ) |
| 351 | + |
| 352 | + |
| 353 | +@pytest.mark.parametrize( |
| 354 | + "click_version", |
| 355 | + [ |
| 356 | + pytest.param('7', marks=click_8_only), |
| 357 | + pytest.param('8', marks=not_click_8_or_above_82), |
| 358 | + pytest.param("8.2", marks=not_click_8_or_below_82), |
| 359 | + ], |
| 360 | + ) |
| 361 | +def test_prompt_option( |
| 362 | + advanced_file_regression: AdvancedFileRegressionFixture, |
| 363 | + click_version: str, |
| 364 | + cli_runner: CliRunner, |
| 365 | + ): |
| 366 | + |
| 367 | + @click.option( |
| 368 | + "-s", |
| 369 | + "--station", |
| 370 | + help="The station to play.", |
| 371 | + type=click.Choice(["Radio 1", "Radio 2", "Radio 3"], case_sensitive=False), |
| 372 | + cls=PromptOption, |
| 373 | + prompt="Select a station", |
| 374 | + ) |
| 375 | + @click_command() |
| 376 | + def main(station: str) -> None: |
| 377 | + print(f"Tuning to station: {station}") |
| 378 | + |
| 379 | + result = cli_runner.invoke(main, input="Radio 4\nRadio 2\n") |
| 380 | + assert result.exit_code == 0 |
| 381 | + advanced_file_regression.check(result.stdout.rstrip()) |
| 382 | + |
| 383 | + result = cli_runner.invoke(main, args=["--station", "Radio 1"]) |
| 384 | + assert result.exit_code == 0 |
| 385 | + assert result.stdout.rstrip() == "Tuning to station: Radio 1" |
| 386 | + |
| 387 | + |
| 388 | +@pytest.mark.parametrize( |
| 389 | + "click_version", |
| 390 | + [pytest.param('7', marks=click_8_only), pytest.param('8', marks=not_click_8)], |
| 391 | + ) |
| 392 | +def test_prompt_option_flag( |
| 393 | + advanced_file_regression: AdvancedFileRegressionFixture, |
| 394 | + click_version: str, |
| 395 | + cli_runner: CliRunner, |
| 396 | + ): |
| 397 | + |
| 398 | + @flag_option( |
| 399 | + "--colour/--no-colour", |
| 400 | + help="Show colour in output.", |
| 401 | + cls=PromptOption, |
| 402 | + default=None, |
| 403 | + prompt="Show colour:", |
| 404 | + ) |
| 405 | + @click_command() |
| 406 | + def main(colour: bool) -> None: |
| 407 | + print(f"Show colour? {colour}") |
| 408 | + |
| 409 | + result = cli_runner.invoke(main, input="Z\nY\n") |
| 410 | + assert result.exit_code == 0 |
| 411 | + advanced_file_regression.check(result.stdout.rstrip()) |
| 412 | + |
| 413 | + result = cli_runner.invoke(main, args=["--no-colour"]) |
| 414 | + assert result.exit_code == 0 |
| 415 | + assert result.stdout.rstrip() == "Show colour? False" |
0 commit comments