90 lines
2.5 KiB
Python
90 lines
2.5 KiB
Python
import asyncio
|
||
|
||
|
||
class _Result:
|
||
def __init__(self, row=None):
|
||
self._row = row
|
||
|
||
def fetchone(self):
|
||
return self._row
|
||
|
||
|
||
class _Session:
|
||
def __init__(self, exists=False):
|
||
self.exists = exists
|
||
self.calls = []
|
||
self.commits = 0
|
||
|
||
def execute(self, statement, params=None):
|
||
self.calls.append((str(statement), params or {}))
|
||
return _Result((1,) if self.exists else None)
|
||
|
||
def commit(self):
|
||
self.commits += 1
|
||
|
||
def rollback(self):
|
||
pass
|
||
|
||
def close(self):
|
||
pass
|
||
|
||
|
||
def test_nemotron_direct_response_is_not_persisted(monkeypatch):
|
||
import services.ai_orchestrator as module
|
||
|
||
session = _Session()
|
||
monkeypatch.setattr(module, "get_session", lambda: session)
|
||
|
||
plan = {
|
||
"session_id": "tg-1",
|
||
"dispatch_to": "direct_response",
|
||
"action_plan": [{"action": "reply_simple", "params": {"message": "hello"}}],
|
||
}
|
||
|
||
asyncio.run(module.AIOrchestrator()._save_action_plan(plan))
|
||
|
||
assert session.calls == []
|
||
assert session.commits == 0
|
||
|
||
|
||
def test_nemotron_duplicate_executable_plan_is_skipped(monkeypatch):
|
||
import services.ai_orchestrator as module
|
||
|
||
session = _Session(exists=True)
|
||
monkeypatch.setattr(module, "get_session", lambda: session)
|
||
|
||
plan = {
|
||
"session_id": "tg-1",
|
||
"plan_type": "price_adjust",
|
||
"sku": "SKU-1",
|
||
"action_plan": [{"action": "flag_for_human_review"}],
|
||
}
|
||
|
||
asyncio.run(module.AIOrchestrator()._save_action_plan(plan))
|
||
|
||
assert len(session.calls) == 1
|
||
assert "SELECT id" in session.calls[0][0]
|
||
assert session.commits == 0
|
||
|
||
|
||
def test_code_review_active_file_dedupe_uses_file_path_marker():
|
||
from services.action_plan_dedupe import active_code_review_action_exists
|
||
|
||
session = _Session(exists=True)
|
||
|
||
assert active_code_review_action_exists(session, "services/config.py") is True
|
||
params = session.calls[0][1]
|
||
assert params["desc_prefix"] == "Code Review 修復:services/config.py|%"
|
||
assert '"file": "services/config.py"' in params["metadata_marker"]
|
||
|
||
|
||
def test_openclaw_metadata_contains_stable_fingerprint():
|
||
import json
|
||
from services.action_plan_dedupe import openclaw_action_metadata
|
||
|
||
first = json.loads(openclaw_action_metadata(10, "**立即調查**:昨日業績為零"))
|
||
second = json.loads(openclaw_action_metadata(10, "立即調查 : 昨日業績為零"))
|
||
|
||
assert first["created_by"] == "openclaw"
|
||
assert first["dedupe_fingerprint"] == second["dedupe_fingerprint"]
|