@@ -800,9 +800,9 @@ def test_download_pair_history_with_pair_candles(mocker, default_conf, tmp_path,
800800 existing_data = DataFrame (
801801 {
802802 "date" : [dt_utc (2018 , 1 , 10 , 10 , 0 ), dt_utc (2018 , 1 , 10 , 10 , 5 )],
803- "open" : [1.0 , 1.1 ],
803+ "open" : [1.0 , 1.15 ],
804804 "high" : [1.1 , 1.2 ],
805- "low" : [0.9 , 1.0 ],
805+ "low" : [0.9 , 1.1 ],
806806 "close" : [1.05 , 1.15 ],
807807 "volume" : [100 , 150 ],
808808 }
@@ -856,9 +856,6 @@ def test_download_pair_history_with_pair_candles(mocker, default_conf, tmp_path,
856856 "volume" : [100 , 200 , 250 , 300 ],
857857 }
858858 )
859- mocker .patch (
860- "freqtrade.data.history.history_utils.clean_ohlcv_dataframe" , return_value = expected_result
861- )
862859
863860 get_historic_ohlcv_mock = MagicMock ()
864861 mocker .patch .object (exchange , "get_historic_ohlcv" , get_historic_ohlcv_mock )
@@ -887,3 +884,81 @@ def test_download_pair_history_with_pair_candles(mocker, default_conf, tmp_path,
887884 stored_data = data_handler_mock .ohlcv_store .call_args_list [0 ][1 ]["data" ]
888885 assert stored_data .equals (expected_result )
889886 assert len (stored_data ) == 4
887+
888+
889+ def test_download_pair_history_with_pair_candles_no_overlap (
890+ mocker , default_conf , tmp_path , caplog
891+ ) -> None :
892+ exchange = get_patched_exchange (mocker , default_conf )
893+
894+ # Create test data for existing cached data
895+ existing_data = DataFrame (
896+ {
897+ "date" : [dt_utc (2018 , 1 , 10 , 10 , 0 ), dt_utc (2018 , 1 , 10 , 10 , 5 )],
898+ "open" : [1.0 , 1.1 ],
899+ "high" : [1.1 , 1.2 ],
900+ "low" : [0.9 , 1.0 ],
901+ "close" : [1.05 , 1.15 ],
902+ "volume" : [100 , 150 ],
903+ }
904+ )
905+
906+ # Create pair_candles data that will be used instead of exchange download
907+ # This data should start before or at the same time as since_ms to trigger the else branch
908+ pair_candles_data = DataFrame (
909+ {
910+ "date" : [
911+ dt_utc (2018 , 1 , 10 , 10 , 10 ),
912+ dt_utc (2018 , 1 , 10 , 10 , 15 ),
913+ dt_utc (2018 , 1 , 10 , 10 , 20 ),
914+ ],
915+ "open" : [1.15 , 1.2 , 1.25 ],
916+ "high" : [1.25 , 1.3 , 1.35 ],
917+ "low" : [1.1 , 1.15 , 1.2 ],
918+ "close" : [1.2 , 1.25 , 1.3 ],
919+ "volume" : [200 , 250 , 300 ],
920+ }
921+ )
922+
923+ # Mock the data handler to return existing cached data
924+ data_handler_mock = MagicMock ()
925+ data_handler_mock .ohlcv_load .return_value = existing_data
926+ data_handler_mock .ohlcv_store = MagicMock ()
927+ mocker .patch (
928+ "freqtrade.data.history.history_utils.get_datahandler" , return_value = data_handler_mock
929+ )
930+
931+ # Mock _load_cached_data_for_updating to return existing data and since_ms
932+ since_ms = dt_ts (dt_utc (2018 , 1 , 10 , 10 , 5 )) # Time of last existing candle
933+ mocker .patch (
934+ "freqtrade.data.history.history_utils._load_cached_data_for_updating" ,
935+ return_value = (existing_data , since_ms , None ),
936+ )
937+
938+ get_historic_ohlcv_mock = MagicMock (return_value = DataFrame ())
939+ mocker .patch .object (exchange , "get_historic_ohlcv" , get_historic_ohlcv_mock )
940+
941+ # Call _download_pair_history with pre-loaded pair_candles
942+ result = _download_pair_history (
943+ datadir = tmp_path ,
944+ exchange = exchange ,
945+ pair = "TEST/BTC" ,
946+ timeframe = "5m" ,
947+ candle_type = CandleType .SPOT ,
948+ pair_candles = pair_candles_data ,
949+ )
950+
951+ # Verify the function succeeded
952+ assert result is True
953+
954+ # Verify that exchange.get_historic_ohlcv was NOT called (parallel method was used)
955+ assert get_historic_ohlcv_mock .call_count == 1
956+
957+ # Verify the log message indicating parallel method was used (line 315-316)
958+ assert not log_has_re (r"Downloaded .* Parallel Method." , caplog )
959+
960+ # Verify data was stored
961+ assert data_handler_mock .ohlcv_store .call_count == 1
962+ stored_data = data_handler_mock .ohlcv_store .call_args_list [0 ][1 ]["data" ]
963+ assert stored_data .equals (existing_data )
964+ assert len (stored_data ) == 2
0 commit comments