""" amazingData 服务单元测试 """ import pytest from unittest.mock import Mock, patch, MagicMock from datetime import datetime, timedelta from app.services.amazing_data_service import AmazingDataService, amazing_data_service from app.services.data_sync_service import DataSyncService class TestAmazingDataService: """测试 amazingData 服务""" def test_singleton_pattern(self): """测试单例模式""" service1 = AmazingDataService() service2 = AmazingDataService() assert service1 is service2 def test_get_instance(self): """测试获取实例""" service = amazing_data_service assert service is not None assert isinstance(service, AmazingDataService) @patch('app.services.amazing_data_service.AmazingDataAdapter') def test_connect_success(self, mock_adapter_class): """测试连接成功""" mock_adapter = MagicMock() mock_adapter.connect.return_value = True mock_adapter_class.return_value = mock_adapter service = AmazingDataService() # 重置初始化标志以便重新测试 service._initialized = False service.__init__() result = service.connect() assert result is True mock_adapter.connect.assert_called_once() @patch('app.services.amazing_data_service.AmazingDataAdapter') def test_connect_failure(self, mock_adapter_class): """测试连接失败""" mock_adapter = MagicMock() mock_adapter.connect.return_value = False mock_adapter_class.return_value = mock_adapter service = AmazingDataService() service._initialized = False service.__init__() result = service.connect() assert result is False def test_disconnect(self): """测试断开连接""" service = amazing_data_service # 注意:实际断开连接需要真实环境 # 这里只测试方法存在 assert hasattr(service, 'disconnect') def test_ensure_connected(self): """测试确保连接""" service = amazing_data_service assert hasattr(service, 'ensure_connected') class TestAmazingDataKlineService: """测试 K 线数据服务""" @patch.object(amazing_data_service, 'ensure_connected') @patch.object(amazing_data_service, '_adapter') def test_get_kline_data(self, mock_adapter, mock_ensure): """测试获取 K 线数据""" import pandas as pd # Mock 连接 mock_ensure.return_value = True # Mock 返回数据 mock_df = pd.DataFrame([ { 'time': '2024-01-01 10:00:00', 'open': 3800.0, 'high': 3810.0, 'low': 3795.0, 'close': 3805.0, 'volume': 1000, 'amount': 3800000.0, 'open_interest': 5000 } ]) mock_adapter.get_kline_data.return_value = mock_df # 测试(需要实际连接环境,这里仅测试接口) assert hasattr(amazing_data_service, 'get_kline_data') @patch.object(amazing_data_service, 'ensure_connected') def test_get_kline_data_not_connected(self, mock_ensure): """测试未连接时获取 K 线数据""" mock_ensure.return_value = False with pytest.raises(Exception) as exc_info: amazing_data_service.get_kline_data( symbol='IF2406', period='1m', start_date='2024-01-01', end_date='2024-01-02' ) assert '未连接到数据源' in str(exc_info.value) class TestAmazingDataRealtimeService: """测试实时行情服务""" @patch.object(amazing_data_service, 'ensure_connected') def test_get_realtime_quotes(self, mock_ensure): """测试获取实时行情""" mock_ensure.return_value = True # 测试方法存在 assert hasattr(amazing_data_service, 'get_realtime_quotes') @patch.object(amazing_data_service, 'ensure_connected') def test_get_realtime_quotes_not_connected(self, mock_ensure): """测试未连接时获取实时行情""" mock_ensure.return_value = False with pytest.raises(Exception) as exc_info: amazing_data_service.get_realtime_quotes(['IF2406', 'IC2406']) assert '未连接到数据源' in str(exc_info.value) class TestAmazingDataSecurityCodes: """测试证券代码服务""" @patch.object(amazing_data_service, 'ensure_connected') def test_get_security_codes(self, mock_ensure): """测试获取证券代码""" mock_ensure.return_value = True assert hasattr(amazing_data_service, 'get_security_codes') class TestDataSyncService: """测试数据同步服务""" def test_sync_kline_data_method_exists(self): """测试同步方法存在""" assert hasattr(DataSyncService, 'sync_kline_data') def test_sync_all_symbols_method_exists(self): """测试批量同步方法存在""" assert hasattr(DataSyncService, 'sync_all_symbols') def test_default_symbols(self): """测试默认品种列表""" symbols = DataSyncService.DEFAULT_SYMBOLS assert isinstance(symbols, list) assert len(symbols) > 0 def test_default_periods(self): """测试默认周期列表""" periods = DataSyncService.DEFAULT_PERIODS assert isinstance(periods, list) assert '1m' in periods assert '1d' in periods class TestAmazingDataIntegration: """集成测试""" def test_service_initialization(self): """测试服务初始化""" service = amazing_data_service assert service is not None assert service._config is not None assert service._config.host == '140.206.44.234' assert service._config.port == 8600 def test_connection_config(self): """测试连接配置""" service = amazing_data_service config = service._config assert config.username == '11200008169' assert config.password == '11200008169@2026' assert config.use_local_cache is True if __name__ == '__main__': pytest.main([__file__, '-v'])