molecule-core/workspace-template/tests/test_hermes_adapter.py
Hongming Wang 24fec62d7f initial commit — Molecule AI platform
Forked clean from public hackathon repo (Starfire-AgentTeam, BSL 1.1)
with full rebrand to Molecule AI under github.com/Molecule-AI/molecule-monorepo.

Brand: Starfire → Molecule AI.
Slug: starfire / agent-molecule → molecule.
Env vars: STARFIRE_* → MOLECULE_*.
Go module: github.com/agent-molecule/platform → github.com/Molecule-AI/molecule-monorepo/platform.
Python packages: starfire_plugin → molecule_plugin, starfire_agent → molecule_agent.
DB: agentmolecule → molecule.

History truncated; see public repo for prior commits and contributor
attribution. Verified green: go test -race ./... (platform), pytest
(workspace-template 1129 + sdk 132), vitest (canvas 352), build (mcp).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:55:37 -07:00

102 lines
3.7 KiB
Python

"""Smoke tests for the Hermes adapter.
Verifies:
1. Required files exist under adapters/hermes/
2. requirements.txt declares openai>=1.0.0 (primary runtime dep)
3. discover_adapters() completes without error
4. Other adapters (e.g. langgraph) are unaffected
"""
from __future__ import annotations
import sys
from pathlib import Path
import pytest
HERMES_DIR = Path(__file__).parent.parent / "adapters" / "hermes"
# ---------------------------------------------------------------------------
# Fixture: isolate adapter cache and sys.modules per test
# ---------------------------------------------------------------------------
@pytest.fixture(autouse=True)
def _reset_adapter_cache():
"""Clear the module-level adapter cache and evict hermes from sys.modules
before each test so loader state is fresh, then restore afterwards."""
import adapters as pkg
original_cache = dict(pkg._ADAPTER_CACHE)
pkg._ADAPTER_CACHE.clear()
evicted = {k: sys.modules.pop(k) for k in list(sys.modules)
if k == "adapters.hermes" or k.startswith("adapters.hermes.")}
yield
# Restore
pkg._ADAPTER_CACHE.clear()
pkg._ADAPTER_CACHE.update(original_cache)
sys.modules.update(evicted)
# ---------------------------------------------------------------------------
# 1. Directory layout — PR-1 shell must have exactly these three files
# ---------------------------------------------------------------------------
class TestHermesShellLayout:
def test_directory_exists(self):
assert HERMES_DIR.is_dir(), "adapters/hermes/ directory is missing"
def test_dockerfile_present(self):
assert (HERMES_DIR / "Dockerfile").is_file(), "Dockerfile missing from hermes shell"
def test_init_py_present(self):
assert (HERMES_DIR / "__init__.py").is_file(), "__init__.py missing from hermes shell"
def test_requirements_txt_present(self):
assert (HERMES_DIR / "requirements.txt").is_file(), "requirements.txt missing"
# ---------------------------------------------------------------------------
# 2. requirements.txt — primary dependency contract
# ---------------------------------------------------------------------------
class TestHermesRequirements:
def test_openai_version_pin(self):
text = (HERMES_DIR / "requirements.txt").read_text()
assert "openai>=1.0.0" in text, (
"Expected 'openai>=1.0.0' in requirements.txt — "
"the Hermes adapter relies on the OpenAI-compat client for Nous Portal / OpenRouter."
)
def test_no_heavy_framework_deps(self):
"""PR-1 shell must not introduce heavy deps that aren't committed to yet."""
text = (HERMES_DIR / "requirements.txt").read_text().lower()
heavy = ["langchain", "crewai", "autogen", "langgraph"]
found = [dep for dep in heavy if dep in text]
assert not found, f"Unexpected heavy deps in hermes requirements.txt: {found}"
# ---------------------------------------------------------------------------
# 3. Loader integration
# ---------------------------------------------------------------------------
class TestHermesLoaderIntegration:
def test_discover_does_not_raise(self):
"""discover_adapters() must complete without raising."""
from adapters import discover_adapters
result = discover_adapters()
assert isinstance(result, dict)
def test_other_adapters_unaffected(self):
"""Hermes registration must not block other adapters from loading.
langgraph has no heavy optional deps and should always be discoverable."""
from adapters import discover_adapters
result = discover_adapters()
assert "langgraph" in result, (
"langgraph adapter missing — loader may have short-circuited."
)