stock/tests/integration/test_workflow_integration.py
2026-02-27 03:17:12 +08:00

133 lines
4.8 KiB
Python

"""Integration tests for LangGraph workflow.
Tests the complete trading workflow with all agents.
"""
import pytest
from datetime import datetime
from typing import Dict, Any
from openclaw.workflow.trading_workflow import TradingWorkflow
from openclaw.workflow.state import TradingWorkflowState, create_initial_state
from openclaw.core.economy import TradingEconomicTracker
class TestTradingWorkflowIntegration:
"""Integration tests for the complete trading workflow."""
def test_workflow_initialization(self):
"""Test workflow can be initialized."""
workflow = TradingWorkflow(
symbol="AAPL",
initial_capital=1000.0,
enable_parallel=True
)
assert workflow.symbol == "AAPL"
assert workflow.initial_capital == 1000.0
assert workflow.enable_parallel is True
def test_initial_state_creation(self):
"""Test initial state is created correctly."""
state = create_initial_state(symbol="TSLA", initial_capital=500.0)
assert state["symbol"] == "TSLA"
assert state["initial_capital"] == 500.0
assert state["current_step"] == "START"
assert state["completed_steps"] == []
def test_workflow_nodes_exist(self):
"""Test all workflow nodes are importable."""
from openclaw.workflow.nodes import (
market_analysis_node,
sentiment_analysis_node,
fundamental_analysis_node,
bull_bear_debate_node,
decision_fusion_node,
risk_assessment_node,
)
assert callable(market_analysis_node)
assert callable(sentiment_analysis_node)
assert callable(fundamental_analysis_node)
assert callable(bull_bear_debate_node)
assert callable(decision_fusion_node)
assert callable(risk_assessment_node)
class TestWorkflowExecution:
"""Tests for workflow execution."""
@pytest.mark.asyncio
async def test_market_analysis_node(self):
"""Test market analysis node execution."""
from openclaw.workflow.nodes import market_analysis_node
from openclaw.workflow.state import create_initial_state
state = create_initial_state(symbol="AAPL", initial_capital=1000.0)
result = await market_analysis_node(state)
assert "market_report" in result
assert result["completed_steps"] == ["market_analysis"]
@pytest.mark.asyncio
async def test_sentiment_analysis_node(self):
"""Test sentiment analysis node execution."""
from openclaw.workflow.nodes import sentiment_analysis_node
from openclaw.workflow.state import create_initial_state
state = create_initial_state(symbol="AAPL", initial_capital=1000.0)
result = await sentiment_analysis_node(state)
assert "sentiment_report" in result
assert "sentiment_analysis" in result["completed_steps"]
@pytest.mark.asyncio
async def test_fundamental_analysis_node(self):
"""Test fundamental analysis node execution."""
from openclaw.workflow.nodes import fundamental_analysis_node
from openclaw.workflow.state import create_initial_state
state = create_initial_state(symbol="AAPL", initial_capital=1000.0)
result = await fundamental_analysis_node(state)
assert "fundamental_report" in result
assert "fundamental_analysis" in result["completed_steps"]
class TestWorkflowStateManagement:
"""Tests for workflow state management."""
def test_state_reducer_for_completed_steps(self):
"""Test that completed steps are accumulated."""
from openclaw.workflow.state import TradingWorkflowState
state1: TradingWorkflowState = {
"symbol": "AAPL",
"initial_capital": 1000.0,
"current_step": "market_analysis",
"completed_steps": ["START"],
"market_report": None,
"sentiment_report": None,
"fundamental_report": None,
"bull_case": None,
"bear_case": None,
"fusion_result": None,
"risk_assessment": None,
"final_decision": None,
"errors": [],
}
# Simulate adding a completed step
state1["completed_steps"] = state1["completed_steps"] + ["market_analysis"]
assert "market_analysis" in state1["completed_steps"]
assert "START" in state1["completed_steps"]
def test_state_error_handling(self):
"""Test that errors are tracked in state."""
from openclaw.workflow.state import create_initial_state
state = create_initial_state(symbol="AAPL", initial_capital=1000.0)
assert state["errors"] == []
# Simulate adding an error
state["errors"] = state["errors"] + ["Test error"]
assert "Test error" in state["errors"]