mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
Systematic prune per AGENTS.md test policy, one pass over every major test tree (gateway, hermes_cli, tools, agent, run_agent, plugins, cli, cron, tui_gateway, honcho/openviking, root-level): - DELETE: source-reading tests (read_text/getsource on prod files), change-detector tests (exact catalog counts, model-name snapshots, config version literals), mock-echo tests (assert a mock returns what it was told), assertion-free/trivial tests, near-duplicate parametrizations (boundaries + one representative kept), async/sync twin duplicates, cosmetic within-file variations. - KEEP (mandatory): security/redaction/approval guards, message-role alternation invariants, prompt-caching/deterministic-call-id invariants, issue-number regression tests (deduped), E2E tests. - 6 test files deleted outright (script-style/no-assert or fully redundant); conftest.py, fakes/, fixtures/ untouched. - tests/acp/conftest.py added: autouse fixture stubs the live models.dev/GitHub/Copilot/Anthropic inventory fetches that ACP server tests performed on every session create — test_server.py 147s → 3.4s, and the tests are now genuinely hermetic. - Sleep-based slowness shrunk where safe (codex_ttfb_watchdog, compression_concurrent_fork, etc.); no wall-clock assertion tightened. Verification: full hermetic suite via scripts/run_tests.sh — 2439 files, 31,130 tests passed, 0 failed, 0 flaky retries, 315s wall (baseline: 583s wall, 13,564s subprocess CPU).
88 lines
2.3 KiB
Python
88 lines
2.3 KiB
Python
"""Behavior tests for the status-bar battery helper (agent/battery.py)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
import types
|
|
|
|
import pytest
|
|
|
|
from agent import battery as battery_mod
|
|
from agent.battery import (
|
|
BatteryStatus,
|
|
battery_category,
|
|
battery_glyph,
|
|
format_battery,
|
|
read_battery,
|
|
)
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def _clear_cache():
|
|
battery_mod.clear_cache()
|
|
yield
|
|
battery_mod.clear_cache()
|
|
|
|
|
|
def _fake_psutil(percent, plugged):
|
|
"""Install a fake psutil module whose sensors_battery returns a reading."""
|
|
mod = types.ModuleType("psutil")
|
|
reading = types.SimpleNamespace(percent=percent, power_plugged=plugged)
|
|
mod.sensors_battery = lambda: reading # type: ignore[attr-defined]
|
|
return mod
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_read_battery_caches(monkeypatch):
|
|
monkeypatch.setitem(sys.modules, "psutil", _fake_psutil(50, False))
|
|
first = read_battery(use_cache=True)
|
|
assert first.percent == 50
|
|
|
|
# Swap the reading; a cached call must still return the first value.
|
|
monkeypatch.setitem(sys.modules, "psutil", _fake_psutil(10, True))
|
|
cached = read_battery(use_cache=True)
|
|
assert cached.percent == 50
|
|
|
|
# Bypassing the cache picks up the new reading.
|
|
fresh = read_battery(use_cache=False)
|
|
assert fresh.percent == 10
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"percent,plugged,expected",
|
|
[
|
|
(100, False, "good"),
|
|
(51, False, "good"),
|
|
(50, False, "warn"),
|
|
(21, False, "warn"),
|
|
(20, False, "bad"),
|
|
(11, False, "bad"),
|
|
(10, False, "critical"),
|
|
(1, False, "critical"),
|
|
# On AC power the level never reads as low.
|
|
(5, True, "good"),
|
|
],
|
|
)
|
|
def test_battery_category_thresholds(percent, plugged, expected):
|
|
status = BatteryStatus(available=True, percent=percent, plugged=plugged)
|
|
assert battery_category(status) == expected
|
|
|
|
|
|
|
|
|
|
def test_format_and_glyph():
|
|
on_battery = BatteryStatus(available=True, percent=82, plugged=False)
|
|
charging = BatteryStatus(available=True, percent=82, plugged=True)
|
|
|
|
assert battery_glyph(on_battery) == "\U0001f50b" # 🔋
|
|
assert battery_glyph(charging) == "\u26a1" # ⚡
|
|
assert format_battery(on_battery) == "\U0001f50b 82%"
|
|
assert format_battery(charging) == "\u26a1 82%"
|
|
assert format_battery(BatteryStatus(available=False)) == ""
|