Files
hermes-agent/tests/hermes_cli/test_pin_kanban_board_env.py
T
红尘 d73ff9b0fb
Deploy Site / deploy-vercel (push) Has been cancelled
Deploy Site / deploy-docs (push) Has been cancelled
Docker / shell lint / Lint Dockerfile (hadolint) (push) Has been cancelled
Docker / shell lint / Lint docker/ shell scripts (shellcheck) (push) Has been cancelled
Docker Build and Publish / build-amd64 (push) Has been cancelled
Docker Build and Publish / build-arm64 (push) Has been cancelled
Lint (ruff + ty) / ruff + ty diff (push) Has been cancelled
Lint (ruff + ty) / ruff enforcement (blocking) (push) Has been cancelled
Lint (ruff + ty) / Windows footguns (blocking) (push) Has been cancelled
Nix Lockfile Fix / auto-fix-main (push) Has been cancelled
Nix Lockfile Fix / fix (push) Has been cancelled
Nix / nix (macos-latest) (push) Has been cancelled
Nix / nix (ubuntu-latest) (push) Has been cancelled
OSV-Scanner / Scan lockfiles (push) Has been cancelled
Build Skills Index / build-index (push) Has been cancelled
Tests / test (1) (push) Has been cancelled
Tests / test (2) (push) Has been cancelled
Tests / test (3) (push) Has been cancelled
Tests / test (4) (push) Has been cancelled
Tests / test (5) (push) Has been cancelled
Tests / test (6) (push) Has been cancelled
Tests / e2e (push) Has been cancelled
uv.lock check / uv lock --check (push) Has been cancelled
Docker Build and Publish / merge (push) Has been cancelled
Build Skills Index / trigger-deploy (push) Has been cancelled
Tests / save-durations (push) Has been cancelled
Initial import of NousResearch/hermes-agent
2026-05-31 09:36:58 +08:00

76 lines
2.4 KiB
Python

"""Tests for `_pin_kanban_board_env` helper invoked by `cmd_chat`.
Regression coverage for #20074: a chat session must export the active kanban
board into `HERMES_KANBAN_BOARD` at boot so subprocess shell-outs (e.g.
`hermes kanban …`) inherit the same board the in-process kanban tools resolve.
Without this, a concurrent `hermes kanban boards switch` from another session
can flip the global current-board file mid-turn and silently divert the
shell calls to a different DB.
"""
import importlib
import os
import pytest
@pytest.fixture(autouse=True)
def _isolate_kanban_board_env():
"""Snapshot `HERMES_KANBAN_BOARD` and restore it after the test.
`_pin_kanban_board_env()` writes to ``os.environ`` directly, bypassing
any ``monkeypatch.setenv`` tracking. Without this fixture the mutation
leaks into subsequent tests and breaks anything that resolves a kanban
path from the env (e.g. ``TestSharedBoardPaths`` in test_kanban_db.py).
"""
prev = os.environ.get("HERMES_KANBAN_BOARD")
os.environ.pop("HERMES_KANBAN_BOARD", None)
try:
yield
finally:
if prev is None:
os.environ.pop("HERMES_KANBAN_BOARD", None)
else:
os.environ["HERMES_KANBAN_BOARD"] = prev
def test_pin_writes_resolved_board_when_env_unset(monkeypatch):
main_mod = importlib.import_module("hermes_cli.main")
import hermes_cli.kanban_db as kdb
monkeypatch.setattr(kdb, "get_current_board", lambda: "space")
main_mod._pin_kanban_board_env()
assert main_mod.os.environ.get("HERMES_KANBAN_BOARD") == "space"
def test_pin_does_not_overwrite_existing_env(monkeypatch):
monkeypatch.setenv("HERMES_KANBAN_BOARD", "preset")
main_mod = importlib.import_module("hermes_cli.main")
import hermes_cli.kanban_db as kdb
def _explode():
raise AssertionError("get_current_board must not be called when env is set")
monkeypatch.setattr(kdb, "get_current_board", _explode)
main_mod._pin_kanban_board_env()
assert main_mod.os.environ.get("HERMES_KANBAN_BOARD") == "preset"
def test_pin_swallows_resolution_failures(monkeypatch):
main_mod = importlib.import_module("hermes_cli.main")
import hermes_cli.kanban_db as kdb
def _boom():
raise RuntimeError("disk gone")
monkeypatch.setattr(kdb, "get_current_board", _boom)
main_mod._pin_kanban_board_env()
assert "HERMES_KANBAN_BOARD" not in main_mod.os.environ