1919from unittest import mock
2020
2121import pytest
22+ import responses
2223from click .testing import CliRunner
2324
2425from lean .commands import lean
2526from lean .constants import DEFAULT_ENGINE_IMAGE
2627from lean .container import container
2728from lean .models .docker import DockerImage
2829from lean .models .json_module import JsonModule
29- from tests .test_helpers import create_fake_lean_cli_directory , reset_state_installed_modules
30+ from tests .test_helpers import create_fake_lean_cli_directory , reset_state_installed_modules , \
31+ setup_mock_api_client_and_responses
3032from tests .conftest import initialize_container
3133from click .testing import Result
3234
@@ -428,10 +430,8 @@ def test_live_sets_dependent_configurations_from_modules_json_based_on_environme
428430 "tt-order-routing-port" : "abc" ,
429431 "tt-log-fix-messages" : "no"
430432 },
431- "TDAmeritrade" : {
432- "tdameritrade-account-number" : "123" ,
433- "tdameritrade-api-key" : "abc" ,
434- "tdameritrade-access-token" : "abc" ,
433+ "CharlesSchwab" : {
434+ "charles-schwab-account-number" : "123"
435435 },
436436 "Bybit" : {
437437 "bybit-api-key" : "abc" ,
@@ -441,10 +441,6 @@ def test_live_sets_dependent_configurations_from_modules_json_based_on_environme
441441 }
442442}
443443
444- brokerage_required_options_not_persistently_save_in_lean_config = {
445- "TDAmeritrade" : ["tdameritrade-access-token" ]
446- }
447-
448444data_feed_required_options = {
449445 "Interactive Brokers" : brokerage_required_options ["Interactive Brokers" ],
450446 "Tradier" : brokerage_required_options ["Tradier" ],
@@ -456,7 +452,7 @@ def test_live_sets_dependent_configurations_from_modules_json_based_on_environme
456452 "Samco" : brokerage_required_options ["Samco" ],
457453 "Terminal Link" : terminal_link_required_options ,
458454 "Kraken" : brokerage_required_options ["Kraken" ],
459- "TDAmeritrade " : brokerage_required_options ["TDAmeritrade " ],
455+ "CharlesSchwab " : brokerage_required_options ["CharlesSchwab " ],
460456 "Bybit" : brokerage_required_options ["Bybit" ],
461457}
462458
@@ -589,13 +585,16 @@ def test_live_non_interactive_aborts_when_missing_data_feed_options(data_feed: s
589585 container .lean_runner .run_lean .assert_not_called ()
590586
591587
588+ @responses .activate
592589@pytest .mark .parametrize ("brokerage,data_feed" ,
593590 itertools .product (brokerage_required_options .keys (), data_feed_required_options .keys ()))
594591def test_live_non_interactive_do_not_store_non_persistent_properties_in_lean_config (brokerage : str , data_feed : str ) -> None :
595592 if ((brokerage == "Interactive Brokers" or data_feed == "Interactive Brokers" ) and sys .platform == "darwin" ):
596593 pytest .skip ("MacOS does not support IB tests" )
597594
598595 create_fake_lean_cli_directory ()
596+ container .api_client = setup_mock_api_client_and_responses ()
597+
599598 lean_runner = container .lean_runner
600599
601600 options = []
@@ -630,18 +629,17 @@ def test_live_non_interactive_do_not_store_non_persistent_properties_in_lean_con
630629 {})
631630
632631 config = container .lean_config_manager .get_lean_config ()
633- if brokerage in brokerage_required_options_not_persistently_save_in_lean_config :
634- for key in brokerage_required_options_not_persistently_save_in_lean_config [brokerage ]:
635- assert key not in config
636632
637633
634+ @responses .activate
638635@pytest .mark .parametrize ("brokerage,data_feed" ,
639636 itertools .product (brokerage_required_options .keys (), data_feed_required_options .keys ()))
640637def test_live_non_interactive_calls_run_lean_when_all_options_given (brokerage : str , data_feed : str ) -> None :
641638 if ((brokerage == "Interactive Brokers" or data_feed == "Interactive Brokers" ) and sys .platform == "darwin" ):
642639 pytest .skip ("MacOS does not support IB tests" )
643640
644641 create_fake_lean_cli_directory ()
642+ container .api_client = setup_mock_api_client_and_responses ()
645643 lean_runner = container .lean_runner
646644
647645 options = []
@@ -675,13 +673,15 @@ def test_live_non_interactive_calls_run_lean_when_all_options_given(brokerage: s
675673 {},
676674 {})
677675
676+ @responses .activate
678677@pytest .mark .parametrize ("brokerage,data_feed1,data_feed2" ,[(brokerage , * data_feeds ) for brokerage , data_feeds in
679678 itertools .product (brokerage_required_options .keys (), itertools .combinations (data_feed_required_options .keys (), 2 ))])
680679def test_live_non_interactive_calls_run_lean_when_all_options_given_with_multiple_data_feeds (brokerage : str , data_feed1 : str , data_feed2 : str ) -> None :
681680 if ((brokerage == "Interactive Brokers" or data_feed1 == "Interactive Brokers" or data_feed2 == "Interactive Brokers" ) and sys .platform == "darwin" ):
682681 pytest .skip ("MacOS does not support IB tests" )
683682
684683 create_fake_lean_cli_directory ()
684+ container .api_client = setup_mock_api_client_and_responses ()
685685 lean_runner = container .lean_runner
686686
687687 options = []
@@ -833,12 +833,14 @@ def test_live_non_interactive_falls_back_to_lean_config_for_data_feed_settings(d
833833 {})
834834
835835
836+ @responses .activate
836837@pytest .mark .parametrize ("data_feed1,data_feed2" , itertools .combinations (data_feed_required_options .keys (), 2 ))
837838def test_live_non_interactive_falls_back_to_lean_config_for_multiple_data_feed_settings (data_feed1 : str , data_feed2 : str ) -> None :
838839 if ((data_feed1 == "Interactive Brokers" or data_feed2 == "Interactive Brokers" ) and sys .platform == "darwin" ):
839840 pytest .skip ("MacOS does not support IB tests" )
840841
841842 create_fake_lean_cli_directory ()
843+ mock_api_client = setup_mock_api_client_and_responses ()
842844
843845 required_options = list (data_feed_required_options [data_feed1 ].items ()) + list (data_feed_required_options [data_feed2 ].items ())
844846 if len (required_options ) > 8 :
@@ -848,7 +850,7 @@ def test_live_non_interactive_falls_back_to_lean_config_for_multiple_data_feed_s
848850 for current_options in itertools .combinations (required_options , length ):
849851 lean_runner = mock .Mock ()
850852 # refresh so we assert we are called once
851- initialize_container (None , lean_runner )
853+ initialize_container (None , lean_runner , api_client_to_use = mock_api_client )
852854
853855 options = []
854856
@@ -983,6 +985,7 @@ def test_live_passes_custom_python_venv_to_lean_runner_when_given_as_option(pyth
983985 assert "python-venv" not in args [0 ]
984986
985987
988+ @responses .activate
986989@pytest .mark .parametrize ("brokerage,cash" , [("Paper Trading" , "" ),
987990 ("Paper Trading" , "USD:100" ),
988991 ("Paper Trading" , "USD:100,EUR:200" ),
@@ -1009,14 +1012,15 @@ def test_live_passes_custom_python_venv_to_lean_runner_when_given_as_option(pyth
10091012 ("Tradier" , "USD:100" ),
10101013 ("Zerodha" , "" ),
10111014 ("Zerodha" , "USD:100" ),
1012- ("TDAmeritrade " , "" ),
1013- ("TDAmeritrade " , "USD:100" )])
1015+ ("CharlesSchwab " , "" ),
1016+ ("CharlesSchwab " , "USD:100" )])
10141017def test_live_passes_live_cash_balance_to_lean_runner_when_given_as_option (brokerage : str , cash : str ) -> None :
10151018 if (brokerage == "Interactive Brokers" and sys .platform == "darwin" ):
10161019 pytest .skip ("MacOS does not support IB tests" )
10171020
10181021 create_fake_lean_cli_directory ()
1019- lean_runner = container .lean_runner
1022+ container .api_client = setup_mock_api_client_and_responses ()
1023+ lean_runner = container .lean_runner
10201024
10211025 options = []
10221026 required_options = brokerage_required_options [brokerage ].items ()
@@ -1051,6 +1055,7 @@ def test_live_passes_live_cash_balance_to_lean_runner_when_given_as_option(broke
10511055 assert args [0 ]["live-cash-balance" ] == cash_list
10521056
10531057
1058+ @responses .activate
10541059@pytest .mark .parametrize ("brokerage,holdings" , [("Paper Trading" , "" ),
10551060 ("Paper Trading" , "A:A 2T:1:145.1" ),
10561061 ("Paper Trading" , "A:A 2T:1:145.1,AA:AA 2T:2:20.35" ),
@@ -1076,14 +1081,15 @@ def test_live_passes_live_cash_balance_to_lean_runner_when_given_as_option(broke
10761081 ("Tradier" , "A:A 2T:1:145.1" ),
10771082 ("Zerodha" , "" ),
10781083 ("Zerodha" , "A:A 2T:1:145.1" ),
1079- ("TDAmeritrade " , "" ),
1080- ("TDAmeritrade " , "A:A 2T:1:145.1" )])
1084+ ("CharlesSchwab " , "" ),
1085+ ("CharlesSchwab " , "A:A 2T:1:145.1" )])
10811086def test_live_passes_live_holdings_to_lean_runner_when_given_as_option (brokerage : str , holdings : str ) -> None :
10821087 if (brokerage == "Interactive Brokers" and sys .platform == "darwin" ):
10831088 pytest .skip ("MacOS does not support IB tests" )
10841089
10851090 create_fake_lean_cli_directory ()
1086- lean_runner = container .lean_runner
1091+ container .api_client = setup_mock_api_client_and_responses ()
1092+ lean_runner = container .lean_runner
10871093
10881094 options = []
10891095 required_options = brokerage_required_options [brokerage ].items ()
0 commit comments