|
1 | 1 | from pathlib import Path |
2 | 2 |
|
| 3 | +import pytest |
| 4 | + |
3 | 5 | from brigade import agents |
4 | 6 | from brigade import cli |
5 | 7 | from brigade import model_inventory |
@@ -416,6 +418,68 @@ def test_roster_doctor_fails_pin_on_ollama_ref(monkeypatch, tmp_target, capsys): |
416 | 418 | assert "ollama names its model in the cli ref" in out |
417 | 419 |
|
418 | 420 |
|
| 421 | +_CF_MODEL_ROUTE = "cloudflare-ai-gateway/openai/gpt-5.3-codex" |
| 422 | +_FAKE_CF_ACCOUNT = "fake-account-id-for-test" |
| 423 | +_FAKE_CF_GATEWAY = "fake-gateway-id-for-test" |
| 424 | + |
| 425 | + |
| 426 | +def _write_cloudflare_gateway_roster(tmp_target) -> None: |
| 427 | + _write_roster( |
| 428 | + tmp_target, |
| 429 | + 'orchestrator = "chef"\n' |
| 430 | + '[agents.chef]\ncli = "codex"\nmodel = "gpt-5.5"\nrole = "plan"\n' |
| 431 | + f'[agents.cf_worker]\ncli = "codex"\nmodel = "{_CF_MODEL_ROUTE}"\nrole = "worker"\n', |
| 432 | + ) |
| 433 | + |
| 434 | + |
| 435 | +def _clear_cloudflare_gateway_env(monkeypatch) -> None: |
| 436 | + monkeypatch.delenv("CLOUDFLARE_ACCOUNT_ID", raising=False) |
| 437 | + monkeypatch.delenv("CLOUDFLARE_GATEWAY_ID", raising=False) |
| 438 | + |
| 439 | + |
| 440 | +def test_roster_doctor_ok_for_cloudflare_gateway_when_env_present(monkeypatch, tmp_target, capsys): |
| 441 | + _write_cloudflare_gateway_roster(tmp_target) |
| 442 | + _clear_cloudflare_gateway_env(monkeypatch) |
| 443 | + monkeypatch.setattr(agents.proc, "which", lambda cmd: "/x/" + cmd) |
| 444 | + monkeypatch.setenv("CLOUDFLARE_ACCOUNT_ID", _FAKE_CF_ACCOUNT) |
| 445 | + monkeypatch.setenv("CLOUDFLARE_GATEWAY_ID", _FAKE_CF_GATEWAY) |
| 446 | + |
| 447 | + rc = roster_cmd.doctor(tmp_target) |
| 448 | + out = capsys.readouterr().out |
| 449 | + |
| 450 | + assert rc == 0 |
| 451 | + assert "[ok] agent: cf_worker cloudflare gateway" in out |
| 452 | + assert "required env vars are set" in out |
| 453 | + assert _FAKE_CF_ACCOUNT not in out |
| 454 | + assert _FAKE_CF_GATEWAY not in out |
| 455 | + |
| 456 | + |
| 457 | +@pytest.mark.parametrize( |
| 458 | + ("env", "missing_vars"), |
| 459 | + [ |
| 460 | + ({}, ("CLOUDFLARE_ACCOUNT_ID", "CLOUDFLARE_GATEWAY_ID")), |
| 461 | + ({"CLOUDFLARE_ACCOUNT_ID": _FAKE_CF_ACCOUNT}, ("CLOUDFLARE_GATEWAY_ID",)), |
| 462 | + ({"CLOUDFLARE_GATEWAY_ID": _FAKE_CF_GATEWAY}, ("CLOUDFLARE_ACCOUNT_ID",)), |
| 463 | + ], |
| 464 | +) |
| 465 | +def test_roster_doctor_fails_cloudflare_gateway_when_env_missing(monkeypatch, tmp_target, capsys, env, missing_vars): |
| 466 | + _write_cloudflare_gateway_roster(tmp_target) |
| 467 | + _clear_cloudflare_gateway_env(monkeypatch) |
| 468 | + monkeypatch.setattr(agents.proc, "which", lambda cmd: "/x/" + cmd) |
| 469 | + for name, value in env.items(): |
| 470 | + monkeypatch.setenv(name, value) |
| 471 | + |
| 472 | + rc = roster_cmd.doctor(tmp_target) |
| 473 | + out = capsys.readouterr().out |
| 474 | + |
| 475 | + assert rc == 1 |
| 476 | + assert "[fail] agent: cf_worker cloudflare gateway" in out |
| 477 | + for var in missing_vars: |
| 478 | + assert var in out |
| 479 | + assert _FAKE_CF_ACCOUNT not in out |
| 480 | + assert _FAKE_CF_GATEWAY not in out |
| 481 | + |
| 482 | + |
419 | 483 | def test_roster_doctor_endpoint_agent_skips_pin_check(tmp_target, capsys): |
420 | 484 | _write_roster( |
421 | 485 | tmp_target, |
|
0 commit comments