Isolate tests properly and consistently from user configuration
Marco Ricci

Marco Ricci commited on 2024-07-28 14:27:31
Zeige 2 geänderte Dateien mit 43 Einfügungen und 4 Löschungen.


Running the tests on a machine which already had a broken
derivepassphrase configuration (e.g., invalid JSON in the
`settings.json` file) previously caused some unrelated tests to fail for
that reason.  Therefore, apply isolation to *all* tests calling the
command-line interface.
... ...
@@ -196,8 +196,13 @@ for opt, config in SINGLES.items():
196 196
 
197 197
 
198 198
 class TestCLI:
199
-    def test_200_help_output(self) -> None:
199
+    def test_200_help_output(self, monkeypatch: Any) -> None:
200 200
         runner = click.testing.CliRunner(mix_stderr=False)
201
+        with tests.isolated_config(
202
+            monkeypatch=monkeypatch,
203
+            runner=runner,
204
+            config={'services': {}},
205
+        ):
201 206
             result = runner.invoke(
202 207
                 cli.derivepassphrase, ['--help'], catch_exceptions=False
203 208
             )
... ...
@@ -219,6 +224,11 @@ class TestCLI:
219 224
         option = f'--{charset_name}'
220 225
         charset = dpp.Vault._CHARSETS[charset_name].decode('ascii')
221 226
         runner = click.testing.CliRunner(mix_stderr=False)
227
+        with tests.isolated_config(
228
+            monkeypatch=monkeypatch,
229
+            runner=runner,
230
+            config={'services': {}},
231
+        ):
222 232
             result = runner.invoke(
223 233
                 cli.derivepassphrase,
224 234
                 [option, '0', '-p', DUMMY_SERVICE],
... ...
@@ -240,6 +250,11 @@ class TestCLI:
240 250
     def test_202_disable_repetition(self, monkeypatch: Any) -> None:
241 251
         monkeypatch.setattr(cli, '_prompt_for_passphrase', tests.auto_prompt)
242 252
         runner = click.testing.CliRunner(mix_stderr=False)
253
+        with tests.isolated_config(
254
+            monkeypatch=monkeypatch,
255
+            runner=runner,
256
+            config={'services': {}},
257
+        ):
243 258
             result = runner.invoke(
244 259
                 cli.derivepassphrase,
245 260
                 ['--repeat', '0', '-p', DUMMY_SERVICE],
... ...
@@ -388,8 +403,15 @@ class TestCLI:
388 403
             '--length',
389 404
         ],
390 405
     )
391
-    def test_210_invalid_argument_range(self, option: str) -> None:
406
+    def test_210_invalid_argument_range(
407
+        self, monkeypatch: Any, option: str
408
+    ) -> None:
392 409
         runner = click.testing.CliRunner(mix_stderr=False)
410
+        with tests.isolated_config(
411
+            monkeypatch=monkeypatch,
412
+            runner=runner,
413
+            config={'services': {}},
414
+        ):
393 415
             for value in '-42', 'invalid':
394 416
                 result = runner.invoke(
395 417
                     cli.derivepassphrase,
... ...
@@ -482,10 +504,16 @@ class TestCLI:
482 504
     )
483 505
     def test_212_incompatible_options(
484 506
         self,
507
+        monkeypatch: Any,
485 508
         options: list[str],
486 509
         service: bool | None,
487 510
     ) -> None:
488 511
         runner = click.testing.CliRunner(mix_stderr=False)
512
+        with tests.isolated_config(
513
+            monkeypatch=monkeypatch,
514
+            runner=runner,
515
+            config={'services': {}},
516
+        ):
489 517
             result = runner.invoke(
490 518
                 cli.derivepassphrase,
491 519
                 [*options, DUMMY_SERVICE] if service else options,
... ...
@@ -886,8 +914,13 @@ contents go here
886 914
                 custom_error.encode() in result.stderr_bytes
887 915
             ), 'expected error message missing'
888 916
 
889
-    def test_226_no_arguments(self) -> None:
917
+    def test_226_no_arguments(self, monkeypatch: Any) -> None:
890 918
         runner = click.testing.CliRunner(mix_stderr=False)
919
+        with tests.isolated_config(
920
+            monkeypatch=monkeypatch,
921
+            runner=runner,
922
+            config={'services': {}},
923
+        ):
891 924
             result = runner.invoke(
892 925
                 cli.derivepassphrase, [], catch_exceptions=False
893 926
             )
... ...
@@ -897,8 +930,13 @@ contents go here
897 930
             b'SERVICE is required' in result.stderr_bytes
898 931
         ), 'expected error message missing'
899 932
 
900
-    def test_226a_no_passphrase_or_key(self) -> None:
933
+    def test_226a_no_passphrase_or_key(self, monkeypatch: Any) -> None:
901 934
         runner = click.testing.CliRunner(mix_stderr=False)
935
+        with tests.isolated_config(
936
+            monkeypatch=monkeypatch,
937
+            runner=runner,
938
+            config={'services': {}},
939
+        ):
902 940
             result = runner.invoke(
903 941
                 cli.derivepassphrase, [DUMMY_SERVICE], catch_exceptions=False
904 942
             )
... ...
@@ -0,0 +1 @@
1
+Isolate the tests properly and consistently from the user's configuration, so that user configuration problems do not cause unrelated test failures.
0 2