diff --git a/scripts/run_training_case_package.py b/scripts/run_training_case_package.py index f46bffb..db5d33c 100644 --- a/scripts/run_training_case_package.py +++ b/scripts/run_training_case_package.py @@ -116,6 +116,8 @@ def _display_path(path: Optional[Path]) -> Optional[str]: def _public_error(exc: Exception) -> str: + if isinstance(exc, IsADirectoryError): + return "input_path_is_directory" if isinstance(exc, FileNotFoundError): return "input_file_not_found" if isinstance(exc, json.JSONDecodeError): diff --git a/tests/unit/test_training_case_cli_m6.py b/tests/unit/test_training_case_cli_m6.py index 80ea768..f97a665 100644 --- a/tests/unit/test_training_case_cli_m6.py +++ b/tests/unit/test_training_case_cli_m6.py @@ -152,6 +152,27 @@ class TrainingCaseCliM6Tests(unittest.TestCase): self.assertNotIn("\n", line) self.assertNotIn("[Errno", line) + def test_cli_error_summary_uses_stable_code_for_directory_input_path(self) -> None: + with tempfile.TemporaryDirectory() as tmpdir: + input_path = Path(tmpdir) + output_path = Path(tmpdir) / "public_training_case_package.json" + stdout = io.StringIO() + + with contextlib.redirect_stdout(stdout): + exit_code = training_cli.main(["--input", str(input_path), "--output", str(output_path)]) + + line = stdout.getvalue().strip() + summary = json.loads(line) + + self.assertEqual(exit_code, 2) + self.assertEqual(list(summary), ["passed", "input", "output", "error"]) + self.assertFalse(summary["passed"]) + self.assertEqual(summary["input"], str(input_path)) + self.assertEqual(summary["output"], str(output_path)) + self.assertEqual(summary["error"], "input_path_is_directory") + self.assertNotIn("\n", line) + self.assertNotIn("[Errno", line) + def test_cli_exported_public_package_is_offline_projection_without_solution_fields(self) -> None: fixture_item = json.loads(FIXTURE.read_text(encoding="utf-8"))["items"][0]