| import pytest | |
| def test_run_select_indicators_returns_dict(): | |
| from core.runner import run_skill_script | |
| result = run_skill_script("select_indicators.py", ["--sectors", "WASH"]) | |
| assert isinstance(result, dict) | |
| assert "selected" in result | |
| assert "count_by_sector" in result | |
| def test_run_select_indicators_sectors_present(): | |
| from core.runner import run_skill_script | |
| result = run_skill_script( | |
| "select_indicators.py", | |
| ["--sectors", "WASH", "Food Security", "Shelter"], | |
| ) | |
| assert result["count_by_sector"].get("WASH", 0) > 0 | |
| def test_run_skill_script_raises_on_bad_script(): | |
| from core.runner import run_skill_script | |
| with pytest.raises((RuntimeError, FileNotFoundError)): | |
| run_skill_script("does_not_exist.py", []) | |
| def test_run_select_indicators_unknown_sector_returns_empty(): | |
| from core.runner import run_skill_script | |
| result = run_skill_script("select_indicators.py", ["--sectors", "INVALID_SECTOR_XYZ_NOT_REAL"]) | |
| assert isinstance(result, dict) | |
| assert result.get("count_by_sector", {}).get("INVALID_SECTOR_XYZ_NOT_REAL", 0) == 0 | |
| def test_run_skill_script_raw_via_subprocess(tmp_path, monkeypatch): | |
| """run_skill_script_raw: stdout returned as string; non-zero exit raises.""" | |
| import core.runner as runner_mod | |
| helper_ok = tmp_path / "ok.py" | |
| helper_ok.write_text('import sys; sys.stdout.write("wrote /tmp/out.json")') | |
| helper_fail = tmp_path / "fail.py" | |
| helper_fail.write_text('import sys; sys.stderr.write("boom"); sys.exit(1)') | |
| monkeypatch.setattr(runner_mod, "_SCRIPTS", tmp_path) | |
| assert runner_mod.run_skill_script_raw("ok.py", []) == "wrote /tmp/out.json" | |
| import pytest | |
| with pytest.raises(RuntimeError, match="boom"): | |
| runner_mod.run_skill_script_raw("fail.py", []) | |