test: add webhook-to-dispatcher integration test
This commit is contained in:
parent
d35efae12e
commit
a58bbca9b7
67
tests/test_integration_webhook_flow.py
Normal file
67
tests/test_integration_webhook_flow.py
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
"""Integration tests for webhook-to-dispatcher flow."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
import os
|
||||||
|
import tempfile
|
||||||
|
from unittest.mock import AsyncMock, patch
|
||||||
|
|
||||||
|
from agent.task_queue import PersistentTaskQueue
|
||||||
|
from agent.dispatcher import Dispatcher
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
async def task_queue():
|
||||||
|
"""Create a temporary task queue for testing."""
|
||||||
|
fd, db_path = tempfile.mkstemp(suffix=".db")
|
||||||
|
os.close(fd)
|
||||||
|
queue = PersistentTaskQueue(db_path=db_path)
|
||||||
|
await queue.initialize()
|
||||||
|
yield queue
|
||||||
|
await queue.close()
|
||||||
|
os.unlink(db_path)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_webhook_to_dispatcher_flow(task_queue):
|
||||||
|
"""Gitea webhook → TaskQueue → Dispatcher 전체 흐름."""
|
||||||
|
from agent.webapp import parse_gitea_event, generate_thread_id
|
||||||
|
|
||||||
|
# 1. Webhook 이벤트 파싱
|
||||||
|
payload = {
|
||||||
|
"action": "created",
|
||||||
|
"comment": {"body": "@agent factor_calculator에 듀얼 모멘텀 추가해줘"},
|
||||||
|
"issue": {"number": 42, "title": "Feature request", "body": "desc"},
|
||||||
|
"repository": {"full_name": "quant/galaxis-po", "name": "galaxis-po"},
|
||||||
|
}
|
||||||
|
event = parse_gitea_event("issue_comment", payload)
|
||||||
|
assert event["should_process"] is True
|
||||||
|
|
||||||
|
# 2. TaskQueue에 enqueue
|
||||||
|
thread_id = generate_thread_id("galaxis-po", 42)
|
||||||
|
task_id = await task_queue.enqueue(
|
||||||
|
thread_id=thread_id,
|
||||||
|
source="gitea",
|
||||||
|
payload={
|
||||||
|
"issue_number": event["issue_number"],
|
||||||
|
"repo_owner": event["repo_owner"],
|
||||||
|
"repo_name": event["repo_name"],
|
||||||
|
"message": event["message"],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
# 3. Dispatcher가 처리
|
||||||
|
mock_run_agent = AsyncMock(return_value={"status": "completed"})
|
||||||
|
dispatcher = Dispatcher(task_queue=task_queue)
|
||||||
|
dispatcher._run_agent_for_task = mock_run_agent
|
||||||
|
|
||||||
|
await dispatcher._poll_once()
|
||||||
|
|
||||||
|
# 4. 에이전트가 호출되었는지 확인
|
||||||
|
mock_run_agent.assert_called_once()
|
||||||
|
call_task = mock_run_agent.call_args[0][0]
|
||||||
|
assert call_task["thread_id"] == thread_id
|
||||||
|
assert call_task["payload"]["issue_number"] == 42
|
||||||
|
|
||||||
|
# 5. 작업이 완료 처리되었는지 확인
|
||||||
|
pending = await task_queue.get_pending()
|
||||||
|
assert len(pending) == 0
|
||||||
Loading…
x
Reference in New Issue
Block a user