mirror of
https://github.com/Xe138/AI-Trader.git
synced 2026-04-01 17:17:24 -04:00
- Skip already-completed model-day pairs in create_job() - Return warnings for skipped simulations - Raise error if all simulations are already completed - Update create_job() return type from str to Dict[str, Any] - Update all callers to handle new dict return type - Add comprehensive test coverage for duplicate detection - Log warnings when simulations are skipped
104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
import pytest
|
|
import time
|
|
from api.database import initialize_database
|
|
from api.job_manager import JobManager
|
|
from api.simulation_worker import SimulationWorker
|
|
from unittest.mock import Mock, patch
|
|
|
|
def test_worker_prepares_data_before_execution(tmp_path):
|
|
"""Test that worker calls _prepare_data before executing trades."""
|
|
db_path = str(tmp_path / "test.db")
|
|
initialize_database(db_path)
|
|
job_manager = JobManager(db_path=db_path)
|
|
|
|
# Create job
|
|
job_result = job_manager.create_job(
|
|
config_path="configs/default_config.json",
|
|
date_range=["2025-10-01"],
|
|
models=["gpt-5"]
|
|
)
|
|
job_id = job_result["job_id"]
|
|
|
|
worker = SimulationWorker(job_id=job_id, db_path=db_path)
|
|
|
|
# Mock _prepare_data to track call
|
|
original_prepare = worker._prepare_data
|
|
prepare_called = []
|
|
|
|
def mock_prepare(*args, **kwargs):
|
|
prepare_called.append(True)
|
|
return (["2025-10-01"], [], {}) # Return available dates, no warnings, no completion skips
|
|
|
|
worker._prepare_data = mock_prepare
|
|
|
|
# Mock _execute_date to avoid actual execution
|
|
worker._execute_date = Mock()
|
|
|
|
# Run worker
|
|
result = worker.run()
|
|
|
|
# Verify _prepare_data was called
|
|
assert len(prepare_called) == 1
|
|
assert result["success"] is True
|
|
|
|
def test_worker_handles_no_available_dates(tmp_path):
|
|
"""Test worker fails gracefully when no dates are available."""
|
|
db_path = str(tmp_path / "test.db")
|
|
initialize_database(db_path)
|
|
job_manager = JobManager(db_path=db_path)
|
|
|
|
job_result = job_manager.create_job(
|
|
config_path="configs/default_config.json",
|
|
date_range=["2025-10-01"],
|
|
models=["gpt-5"]
|
|
)
|
|
job_id = job_result["job_id"]
|
|
|
|
worker = SimulationWorker(job_id=job_id, db_path=db_path)
|
|
|
|
# Mock _prepare_data to return empty dates
|
|
worker._prepare_data = Mock(return_value=([], [], {}))
|
|
|
|
# Run worker
|
|
result = worker.run()
|
|
|
|
# Should fail with descriptive error
|
|
assert result["success"] is False
|
|
assert "No trading dates available" in result["error"]
|
|
|
|
# Job should be marked as failed
|
|
job = job_manager.get_job(job_id)
|
|
assert job["status"] == "failed"
|
|
|
|
def test_worker_stores_warnings(tmp_path):
|
|
"""Test worker stores warnings from prepare_data."""
|
|
db_path = str(tmp_path / "test.db")
|
|
initialize_database(db_path)
|
|
job_manager = JobManager(db_path=db_path)
|
|
|
|
job_result = job_manager.create_job(
|
|
config_path="configs/default_config.json",
|
|
date_range=["2025-10-01"],
|
|
models=["gpt-5"]
|
|
)
|
|
job_id = job_result["job_id"]
|
|
|
|
worker = SimulationWorker(job_id=job_id, db_path=db_path)
|
|
|
|
# Mock _prepare_data to return warnings
|
|
warnings = ["Rate limited", "Skipped 1 date"]
|
|
worker._prepare_data = Mock(return_value=(["2025-10-01"], warnings, {}))
|
|
worker._execute_date = Mock()
|
|
|
|
# Run worker
|
|
result = worker.run()
|
|
|
|
# Verify warnings in result
|
|
assert result["warnings"] == warnings
|
|
|
|
# Verify warnings stored in database
|
|
import json
|
|
job = job_manager.get_job(job_id)
|
|
stored_warnings = json.loads(job["warnings"])
|
|
assert stored_warnings == warnings
|