133 lines
4.8 KiB
Python
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"]
|