33from freqtrade .exceptions import StrategyError
44from freqtrade .persistence import Trade
55from freqtrade .strategy .strategy_wrapper import strategy_safe_wrapper
6+ from freqtrade .util .datetime_helpers import dt_now
67from tests .conftest import create_mock_trades , log_has_re
78
9+ from .strats .strategy_test_v3 import StrategyTestV3
10+
811
912@pytest .mark .parametrize (
1013 "error" ,
@@ -47,9 +50,14 @@ def working_method(argumentpassedin):
4750
4851
4952@pytest .mark .usefixtures ("init_persistence" )
50- def test_strategy_safe_wrapper_trade_copy (fee ):
53+ def test_strategy_safe_wrapper_trade_copy (fee , mocker ):
5154 create_mock_trades (fee )
55+ import freqtrade .strategy .strategy_wrapper as swm
56+
57+ deepcopy_mock = mocker .spy (swm , "deepcopy" )
58+
5259 trade_ = Trade .get_open_trades ()[0 ]
60+ strat = StrategyTestV3 (config = {})
5361
5462 def working_method (trade ):
5563 assert len (trade .orders ) > 0
@@ -59,11 +67,27 @@ def working_method(trade):
5967 assert id (trade_ ) != id (trade )
6068 return trade
6169
70+ strat .working_method = working_method
71+
6272 # Don't assert anything before strategy_wrapper.
6373 # This ensures that relationship loading works correctly.
64- ret = strategy_safe_wrapper (working_method , message = "DeadBeef" )(trade = trade_ )
74+ ret = strategy_safe_wrapper (strat . working_method , message = "DeadBeef" )(trade = trade_ )
6575 assert isinstance (ret , Trade )
6676 assert id (trade_ ) != id (ret )
6777 # Did not modify the original order
6878 assert len (trade_ .orders ) > 0
6979 assert len (ret .orders ) == 0
80+ assert deepcopy_mock .call_count == 1
81+ deepcopy_mock .reset_mock ()
82+
83+ # Call with non-overridden method - shouldn't deep-copy the trade
84+ ret = strategy_safe_wrapper (strat .custom_entry_price , message = "DeadBeef" )(
85+ pair = "ETH/USDT" ,
86+ trade = trade_ ,
87+ current_time = dt_now (),
88+ proposed_rate = 0.5 ,
89+ entry_tag = "" ,
90+ side = "long" ,
91+ )
92+
93+ assert deepcopy_mock .call_count == 0
0 commit comments