def test_cloud_optimize_passes_given_config_to_cloud_runner() -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") optimization = create_api_optimization() api_client = mock.Mock() api_client.projects.get_all.return_value = [project] api_client.optimizations.estimate.return_value = QCOptimizationEstimate( estimateId="x", time=10, balance=1000) api_client.organizations.get.return_value = create_api_organization() container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_optimization.return_value = optimization container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke( lean, ["cloud", "optimize", "My Project", "--name", "My Name"]) assert result.exit_code == 0 optimizer_config_manager = container.optimizer_config_manager() cloud_runner.run_optimization.assert_called_once_with( project, mock.ANY, "My Name", optimizer_config_manager.configure_strategy(cloud=True), optimizer_config_manager.configure_target(), optimizer_config_manager.configure_parameters([]), optimizer_config_manager.configure_constraints(), optimizer_config_manager.configure_node()[0].name, optimizer_config_manager.configure_node()[1])
def test_cloud_optimize_does_not_display_backtest_results_when_none_meet_constraints( ) -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") optimization = create_api_optimization() optimization.backtests["1"] = create_api_optimization_backtest( 1, True, False, True) optimization.backtests["2"] = create_api_optimization_backtest( 2, True, False, False) api_client = mock.Mock() api_client.projects.get_all.return_value = [project] api_client.optimizations.estimate.return_value = QCOptimizationEstimate( estimateId="x", time=10, balance=1000) api_client.organizations.get.return_value = create_api_organization() container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_optimization.return_value = optimization container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "optimize", "My Project"]) assert result.exit_code == 0 assert "id: 1" not in result.output assert "id: 2" not in result.output
def test_cloud_backtest_logs_statistics() -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") backtest = create_api_backtest() backtest.statistics = {"stat1": "1.0", "stat2": "-1.0", "stat3": "0.0"} backtest.runtimeStatistics = { "stat3": "1.0", "stat4": "-1.0", "stat5": "0.0" } api_client = mock.Mock() api_client.projects.get_all.return_value = [project] container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_backtest.return_value = backtest container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "backtest", "My Project"]) assert result.exit_code == 0 for i in range(1, 6): assert f"stat{i}" in result.output
def test_cloud_optimize_runs_optimization_by_project_id() -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") optimization = create_api_optimization() api_client = mock.Mock() api_client.projects.get_all.return_value = [project] api_client.optimizations.estimate.return_value = QCOptimizationEstimate( estimateId="x", time=10, balance=1000) api_client.organizations.get.return_value = create_api_organization() container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_optimization.return_value = optimization container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "optimize", "1"]) assert result.exit_code == 0 cloud_runner.run_optimization.assert_called_once() args, kwargs = cloud_runner.run_optimization.call_args assert args[0] == project
def test_cloud_optimize_pushes_nothing_when_project_does_not_exist_locally( ) -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") optimization = create_api_optimization() api_client = mock.Mock() api_client.projects.get_all.return_value = [project] api_client.optimizations.estimate.return_value = QCOptimizationEstimate( estimateId="x", time=10, balance=1000) api_client.organizations.get.return_value = create_api_organization() container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_optimization.return_value = optimization container.cloud_runner.override(providers.Object(cloud_runner)) push_manager = mock.Mock() container.push_manager.override(providers.Object(push_manager)) result = CliRunner().invoke(lean, ["cloud", "optimize", "My Project", "--push"]) assert result.exit_code == 0 push_manager.push_projects.assert_not_called()
def test_cloud_optimize_displays_optimal_backtest_results( optimizer_config_manager_mock: mock.Mock, target: str, extremum: OptimizationExtremum) -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") optimization = create_api_optimization() optimization.backtests["1"] = create_api_optimization_backtest( 1, True, True, True) optimization.backtests["2"] = create_api_optimization_backtest( 2, True, True, False) api_client = mock.Mock() api_client.projects.get_all.return_value = [project] api_client.optimizations.estimate.return_value = QCOptimizationEstimate( estimateId="x", time=10, balance=1000) container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_optimization.return_value = optimization container.cloud_runner.override(providers.Object(cloud_runner)) optimizer_config_manager_mock.configure_target.return_value = OptimizationTarget( target=f"TotalPerformance.PortfolioStatistics.{target}", extremum=extremum, ) result = CliRunner().invoke(lean, ["cloud", "optimize", "My Project"]) assert result.exit_code == 0 if extremum == OptimizationExtremum.Maximum: assert "id: 1" in result.output else: assert "id: 2" in result.output
def test_cloud_pull_pulls_project_by_name() -> None: create_fake_lean_cli_directory() cloud_projects = [create_api_project(1, "Project 1"), create_api_project(2, "Project 2"), create_api_project(3, "Project 3"), create_api_project(4, "Boot Camp/Project 4"), create_api_project(5, "Boot Camp/Project 5")] api_client = mock.Mock() api_client.projects.get_all.return_value = cloud_projects container.api_client.override(providers.Object(api_client)) pull_manager = mock.Mock() container.pull_manager.override(providers.Object(pull_manager)) result = CliRunner().invoke(lean, ["cloud", "pull", "--project", "Project 1"]) assert result.exit_code == 0 pull_manager.pull_projects.assert_called_once_with([cloud_projects[0]])
def test_cloud_pull_aborts_when_project_input_matches_no_cloud_projects() -> None: create_fake_lean_cli_directory() cloud_projects = [create_api_project(1, "Project 1"), create_api_project(2, "Project 2"), create_api_project(3, "Project 3"), create_api_project(4, "Boot Camp/Project 4"), create_api_project(5, "Boot Camp/Project 5")] api_client = mock.Mock() api_client.projects.get_all.return_value = cloud_projects container.api_client.override(providers.Object(api_client)) pull_manager = mock.Mock() container.pull_manager.override(providers.Object(pull_manager)) result = CliRunner().invoke(lean, ["cloud", "pull", "--project", "Project 4"]) assert result.exit_code != 0 pull_manager.pull_projects.assert_not_called()
def test_cloud_backtest_aborts_when_input_matches_no_cloud_project() -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") backtest = create_api_backtest() api_client = mock.Mock() api_client.projects.get_all.return_value = [project] container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_backtest.return_value = backtest container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "backtest", "Fake Project"]) assert result.exit_code != 0 cloud_runner.run_backtest.assert_not_called()
def test_cloud_backtest_runs_project_by_name() -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") backtest = create_api_backtest() api_client = mock.Mock() api_client.projects.get_all.return_value = [project] container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_backtest.return_value = backtest container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "backtest", "My Project"]) assert result.exit_code == 0 cloud_runner.run_backtest.assert_called_once_with(project, mock.ANY)
def test_cloud_backtest_opens_browser_when_open_option_given(open) -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") backtest = create_api_backtest() api_client = mock.Mock() api_client.projects.get_all.return_value = [project] container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_backtest.return_value = backtest container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "backtest", "My Project", "--open"]) assert result.exit_code == 0 open.assert_called_once_with(backtest.get_url())
def test_cloud_optimize_aborts_when_input_matches_no_cloud_project() -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") optimization = create_api_optimization() api_client = mock.Mock() api_client.projects.get_all.return_value = [project] api_client.optimizations.estimate.return_value = QCOptimizationEstimate( estimateId="x", time=10, balance=1000) container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_optimization.return_value = optimization container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "optimize", "Fake Project"]) assert result.exit_code != 0 cloud_runner.run_optimization.assert_not_called()
def test_cloud_backtest_aborts_when_backtest_fails() -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") def run_backtest(*args, **kwargs): raise RuntimeError("Oops") api_client = mock.Mock() api_client.projects.get_all.return_value = [project] container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_backtest.side_effect = run_backtest container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "backtest", "My Project"]) assert result.exit_code != 0 cloud_runner.run_backtest.assert_called_once()
def test_cloud_backtest_does_not_open_browser_when_init_error_happens( open) -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") backtest = create_api_backtest() backtest.error = "During the algorithm initialization, the following exception has occurred:\nOops" api_client = mock.Mock() api_client.projects.get_all.return_value = [project] container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_backtest.return_value = backtest container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "backtest", "My Project", "--open"]) assert result.exit_code == 0 open.assert_not_called()
def test_cloud_backtest_uses_given_name() -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") backtest = create_api_backtest() api_client = mock.Mock() api_client.projects.get_all.return_value = [project] container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_backtest.return_value = backtest container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke( lean, ["cloud", "backtest", "My Project", "--name", "My Name"]) assert result.exit_code == 0 cloud_runner.run_backtest.assert_called_once() args, kwargs = cloud_runner.run_backtest.call_args assert args[1] == "My Name"
def test_cloud_optimize_aborts_when_optimization_fails() -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") def run_optimization(*args, **kwargs): raise RuntimeError("Oops") api_client = mock.Mock() api_client.projects.get_all.return_value = [project] api_client.optimizations.estimate.return_value = QCOptimizationEstimate( estimateId="x", time=10, balance=1000) container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_optimization.side_effect = run_optimization container.cloud_runner.override(providers.Object(cloud_runner)) result = CliRunner().invoke(lean, ["cloud", "optimize", "My Project"]) assert result.exit_code != 0 cloud_runner.run_optimization.assert_called_once()
def test_cloud_backtest_pushes_nothing_when_project_does_not_exist_locally( ) -> None: create_fake_lean_cli_directory() project = create_api_project(1, "My Project") backtest = create_api_backtest() api_client = mock.Mock() api_client.projects.get_all.return_value = [project] container.api_client.override(providers.Object(api_client)) cloud_runner = mock.Mock() cloud_runner.run_backtest.return_value = backtest container.cloud_runner.override(providers.Object(cloud_runner)) push_manager = mock.Mock() container.push_manager.override(providers.Object(push_manager)) result = CliRunner().invoke(lean, ["cloud", "backtest", "My Project", "--push"]) assert result.exit_code == 0 push_manager.push_projects.assert_not_called()