62 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
| import pytest
 | |
| from unittest import mock
 | |
| from src.jixia.engines.openbb_stock_data import get_stock_data
 | |
| from types import SimpleNamespace
 | |
| 
 | |
| class TestOpenBBIntegration:
 | |
|     """OpenBB集成测试套件"""
 | |
| 
 | |
|     def test_stock_data_retrieval(self):
 | |
|         """测试股票数据成功获取"""
 | |
|         # 创建一个模拟的'openbb'模块
 | |
|         mock_openbb_module = mock.MagicMock()
 | |
|         # 在该模块上创建一个模拟的'obb'属性
 | |
|         mock_obb_object = mock.MagicMock()
 | |
|         mock_openbb_module.obb = mock_obb_object
 | |
| 
 | |
|         # 配置模拟的obb对象的返回值
 | |
|         mock_data = [
 | |
|             SimpleNamespace(date='2023-01-01', open=100, high=110, low=90, close=105, volume=10000),
 | |
|             SimpleNamespace(date='2023-01-02', open=105, high=115, low=102, close=112, volume=12000)
 | |
|         ]
 | |
|         mock_obb_object.equity.price.historical.return_value = SimpleNamespace(results=mock_data)
 | |
| 
 | |
|         # 使用patch.dict来模拟openbb模块的导入
 | |
|         with mock.patch.dict('sys.modules', {'openbb': mock_openbb_module}):
 | |
|             data = get_stock_data('AAPL')
 | |
| 
 | |
|         # 断言
 | |
|         assert data is not None
 | |
|         assert len(data) == 2
 | |
|         assert data[0].close == 105
 | |
|         mock_obb_object.equity.price.historical.assert_called_once()
 | |
| 
 | |
|     def test_stock_data_handles_api_error(self):
 | |
|         """测试当OpenBB API未返回有效数据时的情况"""
 | |
|         mock_openbb_module = mock.MagicMock()
 | |
|         mock_obb_object = mock.MagicMock()
 | |
|         mock_openbb_module.obb = mock_obb_object
 | |
|         
 | |
|         # 配置模拟的obb对象以返回没有结果的情况
 | |
|         mock_obb_object.equity.price.historical.return_value = SimpleNamespace(results=None)
 | |
| 
 | |
|         with mock.patch.dict('sys.modules', {'openbb': mock_openbb_module}):
 | |
|             data = get_stock_data('FAIL')
 | |
| 
 | |
|         # 断言
 | |
|         assert data is None
 | |
|         mock_obb_object.equity.price.historical.assert_called_once_with(
 | |
|             symbol='FAIL', 
 | |
|             provider='yfinance',
 | |
|             start_date=mock.ANY,
 | |
|             end_date=mock.ANY
 | |
|         )
 | |
| 
 | |
|     def test_stock_data_handles_import_error(self):
 | |
|         """测试openbb库不可用时的降级行为"""
 | |
|         # 模拟sys.modules中没有openbb
 | |
|         with mock.patch.dict('sys.modules', {'openbb': None}):
 | |
|             data = get_stock_data('NOBB')
 | |
| 
 | |
|         # 断言
 | |
|         assert data is None |