Rebuild & Deploy / rebuild (push) Successful in 14s
The fake audio upstream bound the test host's loopback, which the Unraid media server cannot reach (and its LAN route is firewalled). Local runs keep the controlled upstream; remote runs use a public reference mp3 and assert Range semantics without byte equality. docker-exec MCP probes skip on remote targets (they necessarily exercise the local container).
Hope test suite
End-to-end tests that drive the actual running container — no mocks. They run on the host and hit the live web UI, token endpoint, LLM API, MCP tool servers, and agent process.
Prerequisites
- The container is up:
docker compose up -d(and healthy) - Host deps installed:
pip install -r tests/requirements.txt(oruv pip install -r tests/requirements.txt) - The LLM at
LLM_BASE_URL(defaulthttp://192.168.86.2:3005/api, OpenWebUI) is reachable - Internet access for the weather tool tests (wttr.in)
Run
cd /home/shane/dev/voice
python -m pytest tests/ -v # everything
python -m pytest tests/ -v -m "not slow" # skip LLM/network-heavy tests
What each file covers
| File | Target | Notes |
|---|---|---|
test_web_ui.py |
nginx HTTPS UI (:9178) + token endpoint (:8091) | static assets, /token (direct + via nginx), /livekit/ proxy |
test_llm_api.py |
LLM API directly | completion, tool calling, enable_thinking=false latency, streaming |
test_mcp_tools.py |
MCP servers via docker exec |
weather/time, authenticated remote memory save/recall/delete, and local skills — probes are cleaned up |
test_media.py |
media server API + player UI + media MCP | library/player state flow, Range proxy, static mp3 Range, live YT Music search (-m slow), gated full download (HOPE_RUN_YTDLP_DOWNLOAD=1) |
test_agent_integration.py |
running container | agent process alive, worker registered with LiveKit, all 4 supervised processes up, container health, LiveKit HTTP API |
test_compaction.py |
HopeLLM._compact_context in-container |
compaction triggers >24 items, system prompt preserved, short context untouched |
Notes
- LLM and MCP tests are marked
@pytest.mark.slow(1–30s each). - The token endpoint is POST
/token→{"token": "<JWT>"}. - Process checks use
/proc/*/cmdlinebecause the container image has nops, and the supervisorctl unix socket is not exposed in this build.