mirror of
https://github.com/open-jarvis/OpenJarvis.git
synced 2026-07-28 05:12:26 +00:00
* fix(channels): wire channel→agent handler and fix Telegram send pipeline * format code * add supported tests
106 lines
3.3 KiB
Python
106 lines
3.3 KiB
Python
"""Integration tests for LearningOrchestrator agent_id scoping."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from unittest.mock import MagicMock
|
|
|
|
from openjarvis.learning.learning_orchestrator import LearningOrchestrator
|
|
|
|
|
|
def test_learning_orchestrator_run_with_agent_id(tmp_path):
|
|
"""run(agent_id=...) filters traces to that agent."""
|
|
mock_store = MagicMock()
|
|
mock_store.list_traces.return_value = []
|
|
|
|
orchestrator = LearningOrchestrator(
|
|
trace_store=mock_store,
|
|
config_dir=str(tmp_path),
|
|
)
|
|
|
|
result = orchestrator.run(agent_id="agent-123")
|
|
assert result["status"] == "skipped"
|
|
# Verify list_traces was called with agent="agent-123"
|
|
calls = mock_store.list_traces.call_args_list
|
|
assert any(call.kwargs.get("agent") == "agent-123" for call in calls)
|
|
|
|
|
|
def test_learning_orchestrator_run_without_agent_id(tmp_path):
|
|
"""run() without agent_id uses all traces (backwards compat)."""
|
|
mock_store = MagicMock()
|
|
mock_store.list_traces.return_value = []
|
|
|
|
orchestrator = LearningOrchestrator(
|
|
trace_store=mock_store,
|
|
config_dir=str(tmp_path),
|
|
)
|
|
|
|
result = orchestrator.run()
|
|
assert result["status"] == "skipped"
|
|
|
|
|
|
def test_scheduler_tracks_tick_count_for_learning(tmp_path):
|
|
"""Scheduler increments per-agent tick count and triggers learning."""
|
|
from openjarvis.agents.executor import AgentExecutor
|
|
from openjarvis.agents.manager import AgentManager
|
|
from openjarvis.agents.scheduler import AgentScheduler
|
|
from openjarvis.core.events import EventBus, EventType
|
|
|
|
mgr = AgentManager(str(tmp_path / "test.db"))
|
|
bus = EventBus(record_history=True)
|
|
executor = AgentExecutor(mgr, bus)
|
|
scheduler = AgentScheduler(mgr, executor, event_bus=bus)
|
|
|
|
agent = mgr.create_agent(
|
|
"tick-counter",
|
|
config={
|
|
"learning_enabled": True,
|
|
"learning_schedule": "every_3_ticks",
|
|
"schedule_type": "manual",
|
|
},
|
|
)
|
|
|
|
# Simulate 3 ticks completing
|
|
for _ in range(3):
|
|
scheduler._on_tick_completed(agent["id"])
|
|
|
|
# Should have triggered learning
|
|
learning_events = [
|
|
e for e in bus.history if e.event_type == EventType.AGENT_LEARNING_STARTED
|
|
]
|
|
assert len(learning_events) == 1
|
|
assert learning_events[0].data["agent_id"] == agent["id"]
|
|
|
|
# Counter should be reset
|
|
assert scheduler._tick_counts.get(agent["id"], 0) == 0
|
|
mgr.close()
|
|
|
|
|
|
def test_scheduler_no_learning_when_disabled(tmp_path):
|
|
"""Scheduler does not trigger learning when learning_enabled is False."""
|
|
from openjarvis.agents.executor import AgentExecutor
|
|
from openjarvis.agents.manager import AgentManager
|
|
from openjarvis.agents.scheduler import AgentScheduler
|
|
from openjarvis.core.events import EventBus, EventType
|
|
|
|
mgr = AgentManager(str(tmp_path / "test.db"))
|
|
bus = EventBus(record_history=True)
|
|
executor = AgentExecutor(mgr, bus)
|
|
scheduler = AgentScheduler(mgr, executor, event_bus=bus)
|
|
|
|
agent = mgr.create_agent(
|
|
"no-learning",
|
|
config={
|
|
"learning_enabled": False,
|
|
"learning_schedule": "every_3_ticks",
|
|
},
|
|
)
|
|
|
|
for _ in range(5):
|
|
scheduler._on_tick_completed(agent["id"])
|
|
|
|
learning_events = [
|
|
e for e in bus.history if e.event_type == EventType.AGENT_LEARNING_STARTED
|
|
]
|
|
assert len(learning_events) == 0
|
|
mgr.close()
|