|
17 | 17 |
|
18 | 18 | import json |
19 | 19 | import sys |
| 20 | +import types |
20 | 21 | from pathlib import Path |
21 | 22 |
|
22 | 23 | ROOT = Path(__file__).resolve().parents[1] |
@@ -461,3 +462,70 @@ def test_venv_status_and_use_system_json(monkeypatch, tmp_path) -> None: |
461 | 462 | assert use_system_result.exit_code == 0 |
462 | 463 | use_system_payload = json.loads(use_system_result.output) |
463 | 464 | assert use_system_payload["mode"] == "system" |
| 465 | + |
| 466 | + |
| 467 | +def test_engine_compile_json_exits_non_zero_on_failure(monkeypatch, tmp_path) -> None: |
| 468 | + runner = CliRunner() |
| 469 | + cli = build_cli("test") |
| 470 | + entry = tmp_path / "app.py" |
| 471 | + entry.write_text("print('ok')\n", encoding="utf-8") |
| 472 | + |
| 473 | + fake_mod = types.ModuleType("OnlyMod.EngineOnlyMod.app") |
| 474 | + |
| 475 | + class _FakeApp: |
| 476 | + def __init__(self, **_kwargs) -> None: |
| 477 | + return None |
| 478 | + |
| 479 | + def run_compilation(self, engine_id, file_path, dry_run=False): |
| 480 | + return { |
| 481 | + "success": False, |
| 482 | + "engine_id": engine_id, |
| 483 | + "file_path": file_path, |
| 484 | + "dry_run": dry_run, |
| 485 | + "error": "compile failed", |
| 486 | + } |
| 487 | + |
| 488 | + fake_mod.EnginesStandaloneApp = _FakeApp |
| 489 | + monkeypatch.setitem(sys.modules, "OnlyMod.EngineOnlyMod.app", fake_mod) |
| 490 | + |
| 491 | + result = runner.invoke( |
| 492 | + cli, ["engine", "compile", "pyinstaller", str(entry), "--json"] |
| 493 | + ) |
| 494 | + |
| 495 | + assert result.exit_code == 3 |
| 496 | + payload = json.loads(result.output) |
| 497 | + assert payload["success"] is False |
| 498 | + assert payload["error"] == "compile failed" |
| 499 | + |
| 500 | + |
| 501 | +def test_engine_compile_json_returns_zero_on_success(monkeypatch, tmp_path) -> None: |
| 502 | + runner = CliRunner() |
| 503 | + cli = build_cli("test") |
| 504 | + entry = tmp_path / "app.py" |
| 505 | + entry.write_text("print('ok')\n", encoding="utf-8") |
| 506 | + |
| 507 | + fake_mod = types.ModuleType("OnlyMod.EngineOnlyMod.app") |
| 508 | + |
| 509 | + class _FakeApp: |
| 510 | + def __init__(self, **_kwargs) -> None: |
| 511 | + return None |
| 512 | + |
| 513 | + def run_compilation(self, engine_id, file_path, dry_run=False): |
| 514 | + return { |
| 515 | + "success": True, |
| 516 | + "engine_id": engine_id, |
| 517 | + "file_path": file_path, |
| 518 | + "dry_run": dry_run, |
| 519 | + "stdout": "ok", |
| 520 | + } |
| 521 | + |
| 522 | + fake_mod.EnginesStandaloneApp = _FakeApp |
| 523 | + monkeypatch.setitem(sys.modules, "OnlyMod.EngineOnlyMod.app", fake_mod) |
| 524 | + |
| 525 | + result = runner.invoke( |
| 526 | + cli, ["engine", "compile", "pyinstaller", str(entry), "--json"] |
| 527 | + ) |
| 528 | + |
| 529 | + assert result.exit_code == 0 |
| 530 | + payload = json.loads(result.output) |
| 531 | + assert payload["success"] is True |
0 commit comments