Marco Ricci commited on 2024-06-30 21:37:17
              Zeige 2 geänderte Dateien mit 20 Einfügungen und 7 Löschungen.
            
| ... | ... | 
                      @@ -5,6 +5,7 @@  | 
                  
| 5 | 5 | 
                        from __future__ import annotations  | 
                    
| 6 | 6 | 
                         | 
                    
| 7 | 7 | 
                        import base64  | 
                    
| 8 | 
                        +from collections.abc import Callable  | 
                    |
| 8 | 9 | 
                        import json  | 
                    
| 9 | 10 | 
                        import os  | 
                    
| 10 | 11 | 
                        import socket  | 
                    
| ... | ... | 
                      @@ -131,7 +132,7 @@ SINGLES: dict[tuple[str, ...], SingleConfiguration] = {
                     | 
                  
| 131 | 132 | 
                             ('--import', '-'): SingleConfiguration(False, b'{"services": {}}', True),
                       | 
                    
| 132 | 133 | 
                        }  | 
                    
| 133 | 134 | 
                        INTERESTING_OPTION_COMBINATIONS: list[OptionCombination] = []  | 
                    
| 134 | 
                        -config: OptionCombination | SingleConfiguration  | 
                    |
| 135 | 
                        +config: IncompatibleConfiguration | SingleConfiguration  | 
                    |
| 135 | 136 | 
                        for opt, config in INCOMPATIBLE.items():  | 
                    
| 136 | 137 | 
                        for opt2 in config.other_options:  | 
                    
| 137 | 138 | 
                        INTERESTING_OPTION_COMBINATIONS.extend([  | 
                    
| ... | ... | 
                      @@ -180,7 +181,7 @@ class TestCLI:  | 
                  
| 180 | 181 | 
                                     f'program died unexpectedly with exit code {result.exit_code}'
                       | 
                    
| 181 | 182 | 
                        )  | 
                    
| 182 | 183 | 
                        assert not result.stderr_bytes, (  | 
                    
| 183 | 
                        -            f'program barfed on stderr: {result.stderr_bytes}'
                       | 
                    |
| 184 | 
                        +            f'program barfed on stderr: {result.stderr_bytes!r}'
                       | 
                    |
| 184 | 185 | 
                        )  | 
                    
| 185 | 186 | 
                        for c in charset:  | 
                    
| 186 | 187 | 
                        assert c not in result.stdout, (  | 
                    
| ... | ... | 
                      @@ -198,7 +199,7 @@ class TestCLI:  | 
                  
| 198 | 199 | 
                                     f'program died unexpectedly with exit code {result.exit_code}'
                       | 
                    
| 199 | 200 | 
                        )  | 
                    
| 200 | 201 | 
                        assert not result.stderr_bytes, (  | 
                    
| 201 | 
                        -            f'program barfed on stderr: {result.stderr_bytes}'
                       | 
                    |
| 202 | 
                        +            f'program barfed on stderr: {result.stderr_bytes!r}'
                       | 
                    |
| 202 | 203 | 
                        )  | 
                    
| 203 | 204 | 
                                 passphrase = result.stdout.rstrip('\r\n')
                       | 
                    
| 204 | 205 | 
                        for i in range(len(passphrase) - 1):  | 
                    
| ... | ... | 
                      @@ -422,13 +423,17 @@ class TestCLI:  | 
                  
| 422 | 423 | 
                        self, monkeypatch: Any,  | 
                    
| 423 | 424 | 
                        ) -> None:  | 
                    
| 424 | 425 | 
                        runner = click.testing.CliRunner(mix_stderr=False)  | 
                    
| 426 | 
                        + # `isolated_config` validates the configuration. So, to pass an  | 
                    |
| 427 | 
                        + # actual broken configuration, we must open the configuration file  | 
                    |
| 428 | 
                        + # ourselves afterwards, inside the context.  | 
                    |
| 425 | 429 | 
                        with tests.isolated_config(monkeypatch=monkeypatch, runner=runner,  | 
                    
| 426 | 430 | 
                                                            config={'services': {}}):
                       | 
                    
| 427 | 431 | 
                        with open(cli._config_filename(), 'wt') as outfile:  | 
                    
| 428 | 432 | 
                                         print('This string is not valid JSON.', file=outfile)
                       | 
                    
| 433 | 
                        + dname = os.path.dirname(cli._config_filename())  | 
                    |
| 429 | 434 | 
                        result = runner.invoke(  | 
                    
| 430 | 435 | 
                        cli.derivepassphrase,  | 
                    
| 431 | 
                        - ['--import', os.path.dirname(cli._config_filename())],  | 
                    |
| 436 | 
                        + ['--import', os.fsdecode(dname)],  | 
                    |
| 432 | 437 | 
                        catch_exceptions=False)  | 
                    
| 433 | 438 | 
                        assert result.exit_code > 0, (  | 
                    
| 434 | 439 | 
                        'program unexpectedly succeeded'  | 
                    
| ... | ... | 
                      @@ -504,7 +509,7 @@ class TestCLI:  | 
                  
| 504 | 509 | 
                                                            config={'services': {}}):
                       | 
                    
| 505 | 510 | 
                        dname = os.path.dirname(cli._config_filename())  | 
                    
| 506 | 511 | 
                        result = runner.invoke(cli.derivepassphrase,  | 
                    
| 507 | 
                        - ['--export', dname],  | 
                    |
| 512 | 
                        + ['--export', os.fsdecode(dname)],  | 
                    |
| 508 | 513 | 
                        input=b'null', catch_exceptions=False)  | 
                    
| 509 | 514 | 
                        assert result.exit_code > 0, (  | 
                    
| 510 | 515 | 
                        'program unexpectedly succeeded'  | 
                    
| ... | ... | 
                      @@ -579,6 +584,7 @@ contents go here  | 
                  
| 579 | 584 | 
                        result = runner.invoke(cli.derivepassphrase, ['--notes', 'sv'],  | 
                    
| 580 | 585 | 
                        catch_exceptions=False)  | 
                    
| 581 | 586 | 
                        assert result.exit_code != 0, 'program unexpectedly succeeded'  | 
                    
| 587 | 
                        + assert result.stderr_bytes is not None  | 
                    |
| 582 | 588 | 
                        assert b'user aborted request' in result.stderr_bytes, (  | 
                    
| 583 | 589 | 
                        'expected error message missing'  | 
                    
| 584 | 590 | 
                        )  | 
                    
| ... | ... | 
                      @@ -648,7 +654,7 @@ contents go here  | 
                  
| 648 | 654 | 
                        ])  | 
                    
| 649 | 655 | 
                        def test_225_store_config_fail(  | 
                    
| 650 | 656 | 
                        self, monkeypatch: Any, command_line: list[str],  | 
                    
| 651 | 
                        - input: bytes, err_text: str,  | 
                    |
| 657 | 
                        + input: bytes, err_text: bytes,  | 
                    |
| 652 | 658 | 
                        ) -> None:  | 
                    
| 653 | 659 | 
                        runner = click.testing.CliRunner(mix_stderr=False)  | 
                    
| 654 | 660 | 
                        with tests.isolated_config(monkeypatch=monkeypatch, runner=runner,  | 
                    
| ... | ... | 
                      @@ -660,6 +666,7 @@ contents go here  | 
                  
| 660 | 666 | 
                        ['--config'] + command_line,  | 
                    
| 661 | 667 | 
                        catch_exceptions=False, input=input)  | 
                    
| 662 | 668 | 
                        assert result.exit_code != 0, 'program unexpectedly succeeded?!'  | 
                    
| 669 | 
                        + assert result.stderr_bytes is not None  | 
                    |
| 663 | 670 | 
                        assert err_text in result.stderr_bytes, (  | 
                    
| 664 | 671 | 
                        'expected error message missing'  | 
                    
| 665 | 672 | 
                        )  | 
                    
| ... | ... | 
                      @@ -678,6 +685,7 @@ contents go here  | 
                  
| 678 | 685 | 
                        ['--key', '--config'],  | 
                    
| 679 | 686 | 
                        catch_exceptions=False)  | 
                    
| 680 | 687 | 
                        assert result.exit_code != 0, 'program unexpectedly succeeded'  | 
                    
| 688 | 
                        + assert result.stderr_bytes is not None  | 
                    |
| 681 | 689 | 
                        assert b'custom error message' in result.stderr_bytes, (  | 
                    
| 682 | 690 | 
                        'expected error message missing'  | 
                    
| 683 | 691 | 
                        )  | 
                    
| ... | ... | 
                      @@ -687,6 +695,7 @@ contents go here  | 
                  
| 687 | 695 | 
                        result = runner.invoke(cli.derivepassphrase, [],  | 
                    
| 688 | 696 | 
                        catch_exceptions=False)  | 
                    
| 689 | 697 | 
                        assert result.exit_code != 0, 'program unexpectedly succeeded'  | 
                    
| 698 | 
                        + assert result.stderr_bytes is not None  | 
                    |
| 690 | 699 | 
                        assert b'SERVICE is required' in result.stderr_bytes, (  | 
                    
| 691 | 700 | 
                        'expected error message missing'  | 
                    
| 692 | 701 | 
                        )  | 
                    
| ... | ... | 
                      @@ -696,6 +705,7 @@ contents go here  | 
                  
| 696 | 705 | 
                        result = runner.invoke(cli.derivepassphrase, [DUMMY_SERVICE],  | 
                    
| 697 | 706 | 
                        catch_exceptions=False)  | 
                    
| 698 | 707 | 
                        assert result.exit_code != 0, 'program unexpectedly succeeded'  | 
                    
| 708 | 
                        + assert result.stderr_bytes is not None  | 
                    |
| 699 | 709 | 
                        assert b'no passphrase or key given' in result.stderr_bytes, (  | 
                    
| 700 | 710 | 
                        'expected error message missing'  | 
                    
| 701 | 711 | 
                        )  | 
                    
| ... | ... | 
                      @@ -887,7 +897,9 @@ Boo.  | 
                  
| 887 | 897 | 
                        @tests.skip_if_no_agent  | 
                    
| 888 | 898 | 
                        @pytest.mark.parametrize(['conn_hint'],  | 
                    
| 889 | 899 | 
                                                      [('none',), ('socket',), ('client',)])
                       | 
                    
| 890 | 
                        - def test_227_get_suitable_ssh_keys(self, monkeypatch, conn_hint):  | 
                    |
| 900 | 
                        + def test_227_get_suitable_ssh_keys(  | 
                    |
| 901 | 
                        + self, monkeypatch: Any, conn_hint: str,  | 
                    |
| 902 | 
                        + ) -> None:  | 
                    |
| 891 | 903 | 
                        monkeypatch.setattr(ssh_agent_client.SSHAgentClient,  | 
                    
| 892 | 904 | 
                        'list_keys', tests.list_keys)  | 
                    
| 893 | 905 | 
                        hint: ssh_agent_client.SSHAgentClient | socket.socket | None  | 
                    
| 894 | 906 |