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>
102 lines
3.7 KiB
Python
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."
|
|
)
|