diff --git a/dashboard/test_results.json b/dashboard/test_results.json index fff7db3..125d386 100644 --- a/dashboard/test_results.json +++ b/dashboard/test_results.json @@ -1 +1 @@ -{"created": 1777489426.7588453, "duration": 56.28722310066223, "exitcode": 0, "root": "/home/runner/work/QuantLab/QuantLab/dashboard", "environment": {}, "summary": {"passed": 431, "skipped": 3, "total": 434, "collected": 434}, "collectors": [{"nodeid": "", "outcome": "passed", "result": [{"nodeid": "tests", "type": "Package"}]}, {"nodeid": "tests/fixtures", "outcome": "passed", "result": []}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading", "outcome": "passed", "result": [{"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_two_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_ticker_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_strategy_radio", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_sma_sliders", "type": "Function", "lineno": 38}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_momentum_mode", "type": "Function", "lineno": 46}]}, {"nodeid": "tests/test_algo_trading.py", "outcome": "passed", "result": [{"nodeid": "tests/test_algo_trading.py::TestAlgoTrading", "type": "Class"}]}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection", "outcome": "passed", "result": [{"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_ticker_input", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_period_selectbox", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_method_radio", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_threshold_slider", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_isolation_forest_mode", "type": "Function", "lineno": 39}]}, {"nodeid": "tests/test_anomaly_detection.py", "outcome": "passed", "result": [{"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection", "type": "Class"}]}, {"nodeid": "tests/test_app.py::TestLandingPage", "outcome": "passed", "result": [{"nodeid": "tests/test_app.py::TestLandingPage::test_loads_without_error", "type": "Function", "lineno": 7}, {"nodeid": "tests/test_app.py::TestLandingPage::test_shows_title", "type": "Function", "lineno": 12}]}, {"nodeid": "tests/test_app.py::TestScannerPage", "outcome": "passed", "result": [{"nodeid": "tests/test_app.py::TestScannerPage::test_loads_without_error", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_app.py::TestScannerPage::test_shows_title", "type": "Function", "lineno": 40}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_three_tabs", "type": "Function", "lineno": 45}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_scan_button", "type": "Function", "lineno": 49}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_preset_buttons", "type": "Function", "lineno": 54}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_equal_weight_button", "type": "Function", "lineno": 61}]}, {"nodeid": "tests/test_app.py", "outcome": "passed", "result": [{"nodeid": "tests/test_app.py::TestLandingPage", "type": "Class"}, {"nodeid": "tests/test_app.py::TestScannerPage", "type": "Class"}]}, {"nodeid": "tests/test_benchmark_datasets.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_datasets.py::test_presets_has_small_and_large_keys", "type": "Function", "lineno": 9}, {"nodeid": "tests/test_benchmark_datasets.py::test_preset_entries_have_required_fields", "type": "Function", "lineno": 13}, {"nodeid": "tests/test_benchmark_datasets.py::test_get_available_presets_filters_missing_files", "type": "Function", "lineno": 21}]}, {"nodeid": "tests/test_benchmark_engines.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_engines.py::test_ops_constant_has_seven_entries", "type": "Function", "lineno": 41}, {"nodeid": "tests/test_benchmark_engines.py::test_default_column_config_resolves", "type": "Function", "lineno": 48}, {"nodeid": "tests/test_benchmark_engines.py::test_read_parity", "type": "Function", "lineno": 55}, {"nodeid": "tests/test_benchmark_engines.py::test_count_parity", "type": "Function", "lineno": 61}, {"nodeid": "tests/test_benchmark_engines.py::test_filter_parity", "type": "Function", "lineno": 67}, {"nodeid": "tests/test_benchmark_engines.py::test_groupby_parity", "type": "Function", "lineno": 77}, {"nodeid": "tests/test_benchmark_engines.py::test_sort_parity", "type": "Function", "lineno": 86}, {"nodeid": "tests/test_benchmark_engines.py::test_regex_parity", "type": "Function", "lineno": 95}, {"nodeid": "tests/test_benchmark_engines.py::test_write_parity", "type": "Function", "lineno": 105}]}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_top_level_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_currency_selectbox", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_notional_input", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_fixed_rate_input", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_position_radio", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_rate_selectbox", "type": "Function", "lineno": 43}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_period_selectbox", "type": "Function", "lineno": 48}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_metrics", "type": "Function", "lineno": 53}]}, {"nodeid": "tests/test_benchmark_rates.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates", "type": "Class"}]}, {"nodeid": "tests/test_benchmark_report.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_report.py::test_build_overview_chart_returns_figure", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_dataframe_result", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_scalar_result", "type": "Function", "lineno": 58}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_write_result", "type": "Function", "lineno": 64}]}, {"nodeid": "tests/test_benchmark_runner.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_returns_seven_results", "type": "Function", "lineno": 7}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_correctness_flags_set", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_bad_column_captures_error", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_benchmark_runner.py::test_result_preview_shapes", "type": "Function", "lineno": 49}]}, {"nodeid": "tests/test_bigo_algorithms.py", "outcome": "passed", "result": [{"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-0-0]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-1-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-2-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-5-5]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-10-55]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-20-6765]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-25-75025]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-0-0]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-1-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-2-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-5-5]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-10-55]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-20-6765]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-25-75025]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-0-0]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-1-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-2-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-5-5]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-10-55]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-20-6765]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-25-75025]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-0-0]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-1-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-2-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-5-5]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-10-55]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-20-6765]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-25-75025]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr0-5-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr1-8-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr2-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr3-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr4-6-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr5-9-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr6-15-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr0-5-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr1-8-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr2-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr3-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr4-6-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr5-9-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr6-15-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr0-5-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr1-8-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr2-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr3-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr4-6-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr5-9-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr6-15-False]", "type": "Function", "lineno": 47}]}, {"nodeid": "tests/test_bigo_problems.py", "outcome": "passed", "result": [{"nodeid": "tests/test_bigo_problems.py::test_registry_has_seed_problems", "type": "Function", "lineno": 5}, {"nodeid": "tests/test_bigo_problems.py::test_input_factory_returns_tuple", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_bigo_problems.py::test_variant_big_o_labels_non_empty", "type": "Function", "lineno": 39}]}, {"nodeid": "tests/test_bigo_report.py", "outcome": "passed", "result": [{"nodeid": "tests/test_bigo_report.py::test_build_complexity_chart_returns_figure", "type": "Function", "lineno": 23}, {"nodeid": "tests/test_bigo_report.py::test_build_variant_card_shape", "type": "Function", "lineno": 33}]}, {"nodeid": "tests/test_bigo_runner.py", "outcome": "passed", "result": [{"nodeid": "tests/test_bigo_runner.py::test_run_problem_returns_expected_structure", "type": "Function", "lineno": 10}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_skips_past_budget", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_correctness_check", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_captures_exception", "type": "Function", "lineno": 57}]}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker", "outcome": "passed", "result": [{"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_income_number_input", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_data_editor", "type": "Function", "lineno": 36}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_metrics", "type": "Function", "lineno": 42}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_shows_budget_status_message", "type": "Function", "lineno": 46}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_switch_to_plan_mode", "type": "Function", "lineno": 56}]}, {"nodeid": "tests/test_budget_tracker.py", "outcome": "passed", "result": [{"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker", "type": "Class"}]}, {"nodeid": "tests/test_churros.py::TestChurros", "outcome": "passed", "result": [{"nodeid": "tests/test_churros.py::TestChurros::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_churros.py::TestChurros::test_shows_title", "type": "Function", "lineno": 17}, {"nodeid": "tests/test_churros.py::TestChurros::test_has_password_form", "type": "Function", "lineno": 21}, {"nodeid": "tests/test_churros.py::TestChurros::test_has_form_submit", "type": "Function", "lineno": 32}]}, {"nodeid": "tests/test_churros.py", "outcome": "passed", "result": [{"nodeid": "tests/test_churros.py::TestChurros", "type": "Class"}]}, {"nodeid": "tests/test_clustering.py::TestClustering", "outcome": "passed", "result": [{"nodeid": "tests/test_clustering.py::TestClustering::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_clustering.py::TestClustering::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_two_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_data_source_radio", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_algorithm_radio", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_clusters_slider", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_clustering.py::TestClustering::test_custom_data_mode", "type": "Function", "lineno": 39}]}, {"nodeid": "tests/test_clustering.py", "outcome": "passed", "result": [{"nodeid": "tests/test_clustering.py::TestClustering", "type": "Class"}]}, {"nodeid": "tests/test_contagion_constants.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_constants.py::test_periods_cover_expected_date_ranges", "type": "Function", "lineno": 6}, {"nodeid": "tests/test_contagion_constants.py::test_every_ticker_has_a_role", "type": "Function", "lineno": 14}, {"nodeid": "tests/test_contagion_constants.py::test_destination_cities_include_all_five", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_contagion_constants.py::test_epicenter_origin_is_strait_of_hormuz", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_contagion_constants.py::test_every_destination_city_has_a_ticker_in_roles", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_contagion_constants.py::test_correlation_window_is_positive_int", "type": "Function", "lineno": 39}]}, {"nodeid": "tests/test_contagion_correlations.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_of_identical_series_is_one", "type": "Function", "lineno": 8}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_of_opposite_series_is_negative_one", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_output_bounded", "type": "Function", "lineno": 22}, {"nodeid": "tests/test_contagion_correlations.py::test_middle_east_index_averages_epicenter_tickers", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_window_larger_than_series_is_all_nan", "type": "Function", "lineno": 46}, {"nodeid": "tests/test_contagion_correlations.py::test_middle_east_index_empty_when_no_epicenter_rows", "type": "Function", "lineno": 53}]}, {"nodeid": "tests/test_contagion_data_quality.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_data_quality.py::test_both_periods_present", "type": "Function", "lineno": 40}, {"nodeid": "tests/test_contagion_data_quality.py::test_all_asset_roles_present", "type": "Function", "lineno": 46}, {"nodeid": "tests/test_contagion_data_quality.py::test_core_tickers_present_in_both_periods", "type": "Function", "lineno": 52}, {"nodeid": "tests/test_contagion_data_quality.py::test_minimum_row_counts_per_ticker[2020_us_iran-30-3]", "type": "Function", "lineno": 59}, {"nodeid": "tests/test_contagion_data_quality.py::test_minimum_row_counts_per_ticker[2024_hormuz-200-12]", "type": "Function", "lineno": 59}, {"nodeid": "tests/test_contagion_data_quality.py::test_no_na_in_close_column", "type": "Function", "lineno": 79}, {"nodeid": "tests/test_contagion_data_quality.py::test_close_values_are_positive", "type": "Function", "lineno": 83}]}, {"nodeid": "tests/test_contagion_globe.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_red_at_plus_one", "type": "Function", "lineno": 6}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_green_at_minus_one", "type": "Function", "lineno": 12}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_gray_at_zero", "type": "Function", "lineno": 18}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_clips_out_of_range", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_contagion_globe.py::test_build_arc_layer_returns_one_arc_per_destination", "type": "Function", "lineno": 29}]}, {"nodeid": "tests/test_contagion_loader.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_loader.py::test_load_events_returns_all_rows_when_no_period", "type": "Function", "lineno": 23}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_filters_by_period", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_raises_when_file_missing", "type": "Function", "lineno": 38}]}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator", "outcome": "passed", "result": [{"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_default_mode_shows_payment_input", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_metrics", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_switch_to_target_mode", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_credit_card_calculator.py", "outcome": "passed", "result": [{"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator", "type": "Class"}]}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio", "outcome": "passed", "result": [{"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_data_editor", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_metrics", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_metric_labels", "type": "Function", "lineno": 37}]}, {"nodeid": "tests/test_crypto_portfolio.py", "outcome": "passed", "result": [{"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio", "type": "Class"}]}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard", "outcome": "passed", "result": [{"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_base_currency_selectbox", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_base_currency_options", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_target_multiselect", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_amount_number_input", "type": "Function", "lineno": 36}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_expected_tabs_with_targets", "type": "Function", "lineno": 41}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_shows_metrics_for_targets", "type": "Function", "lineno": 46}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_error_on_fetch_failure", "type": "Function", "lineno": 51}]}, {"nodeid": "tests/test_currency_dashboard.py", "outcome": "passed", "result": [{"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard", "type": "Class"}]}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker", "outcome": "passed", "result": [{"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_ticker_text_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_sector_multiselect", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_company_multiselect", "type": "Function", "lineno": 35}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_fallback_to_sample_scores", "type": "Function", "lineno": 41}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_warning_for_sample_data", "type": "Function", "lineno": 49}]}, {"nodeid": "tests/test_esg_tracker.py", "outcome": "passed", "result": [{"nodeid": "tests/test_esg_tracker.py::TestESGTracker", "type": "Class"}]}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting", "outcome": "passed", "result": [{"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_ticker_text_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_download_buttons", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_download_button_labels", "type": "Function", "lineno": 42}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_metrics", "type": "Function", "lineno": 49}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_metric_labels", "type": "Function", "lineno": 53}]}, {"nodeid": "tests/test_financial_reporting.py", "outcome": "passed", "result": [{"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting", "type": "Class"}]}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage", "outcome": "passed", "result": [{"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_loads_without_error", "type": "Function", "lineno": 10}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_shows_title", "type": "Function", "lineno": 14}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_period_radio", "type": "Function", "lineno": 19}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_timeline_slider", "type": "Function", "lineno": 27}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_play_button", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_side_panel_renders_four_metrics", "type": "Function", "lineno": 38}]}, {"nodeid": "tests/test_global_contagion.py", "outcome": "passed", "result": [{"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage", "type": "Class"}]}, {"nodeid": "tests/test_globe_arc.py", "outcome": "passed", "result": [{"nodeid": "tests/test_globe_arc.py::test_returns_one_row_per_destination", "type": "Function", "lineno": 13}, {"nodeid": "tests/test_globe_arc.py::test_row_keys_present", "type": "Function", "lineno": 18}, {"nodeid": "tests/test_globe_arc.py::test_missing_destination_uses_default", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_globe_arc.py::test_extra_meta_forwarded", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_globe_arc.py::test_source_matches_input", "type": "Function", "lineno": 40}]}, {"nodeid": "tests/test_globe_color.py", "outcome": "passed", "result": [{"nodeid": "tests/test_globe_color.py::test_diverging_color_at_zero_is_zero_anchor", "type": "Function", "lineno": 4}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_pos_one_reaches_pos_anchor", "type": "Function", "lineno": 10}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_neg_one_reaches_neg_anchor", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_alpha_scales_with_magnitude", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_clamps_outside_range", "type": "Function", "lineno": 26}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_at_zero_is_low_anchor", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_at_one_is_high_anchor", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_clamps", "type": "Function", "lineno": 45}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_min_at_zero", "type": "Function", "lineno": 50}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_max_at_one", "type": "Function", "lineno": 54}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_uses_abs", "type": "Function", "lineno": 58}]}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner", "outcome": "passed", "result": [{"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_sliders", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_metrics", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_switch_to_goal_mode", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_investment_planner.py", "outcome": "passed", "result": [{"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner", "type": "Class"}]}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_default_mode_has_term_selectbox", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_metrics", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_switch_to_budget_mode", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_loan_amortization.py", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization", "type": "Class"}]}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_selectbox_for_terms", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_metrics", "type": "Function", "lineno": 43}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_switch_to_rate_sensitivity_mode", "type": "Function", "lineno": 47}]}, {"nodeid": "tests/test_loan_comparison.py", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_comparison.py::TestLoanComparison", "type": "Class"}]}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_two_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_model_radio", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_test_size_slider", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_five_number_inputs", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_random_forest_mode", "type": "Function", "lineno": 41}]}, {"nodeid": "tests/test_loan_default.py", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_default.py::TestLoanDefault", "type": "Class"}]}, {"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage", "outcome": "passed", "result": [{"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage::test_loads_without_error", "type": "Function", "lineno": 14}, {"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage::test_shows_title", "type": "Function", "lineno": 18}]}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers", "outcome": "passed", "result": [{"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_load_ppd_returns_dataframe", "type": "Function", "lineno": 43}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_aggregate_by_district_year", "type": "Function", "lineno": 50}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_aggregate_empty_district", "type": "Function", "lineno": 56}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_get_all_districts_summary", "type": "Function", "lineno": 61}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_query_overpass_returns_list", "type": "Function", "lineno": 67}]}, {"nodeid": "tests/test_london_house_prices.py", "outcome": "passed", "result": [{"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage", "type": "Class"}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers", "type": "Class"}]}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights", "outcome": "passed", "result": [{"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_loads_without_error", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_shows_title", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_two_tabs", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_ticker_input", "type": "Function", "lineno": 36}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_period_selectbox", "type": "Function", "lineno": 42}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_headline_text_area", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_reset_button", "type": "Function", "lineno": 52}]}, {"nodeid": "tests/test_market_insights.py", "outcome": "passed", "result": [{"nodeid": "tests/test_market_insights.py::TestMarketInsights", "type": "Class"}]}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance", "outcome": "passed", "result": [{"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_income_number_input", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_data_editors", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_expected_tabs", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_net_worth_metric", "type": "Function", "lineno": 38}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_savings_rate_metric", "type": "Function", "lineno": 43}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_no_external_api_calls", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_personal_finance.py", "outcome": "passed", "result": [{"nodeid": "tests/test_personal_finance.py::TestPersonalFinance", "type": "Class"}]}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_loads_without_error", "type": "Function", "lineno": 14}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_shows_title", "type": "Function", "lineno": 18}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_has_ticker_input", "type": "Function", "lineno": 23}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_has_period_selectbox", "type": "Function", "lineno": 28}]}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_line_chart_returns_figure", "type": "Function", "lineno": 52}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_candlestick_returns_figure", "type": "Function", "lineno": 59}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_volume_bar_returns_figure", "type": "Function", "lineno": 66}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_returns_histogram_returns_figure", "type": "Function", "lineno": 73}]}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_line_chart_returns_figure", "type": "Function", "lineno": 82}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_candlestick_returns_figure", "type": "Function", "lineno": 89}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_volume_bar_returns_figure", "type": "Function", "lineno": 96}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_returns_histogram_returns_figure", "type": "Function", "lineno": 102}]}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_line_chart_returns_chart", "type": "Function", "lineno": 110}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_candlestick_returns_chart", "type": "Function", "lineno": 117}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_volume_bar_returns_chart", "type": "Function", "lineno": 124}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_returns_histogram_returns_chart", "type": "Function", "lineno": 131}]}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_line_chart_returns_figure", "type": "Function", "lineno": 140}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_candlestick_returns_figure", "type": "Function", "lineno": 146}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_volume_bar_returns_figure", "type": "Function", "lineno": 152}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_returns_histogram_returns_figure", "type": "Function", "lineno": 158}]}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_no_outliers_in_clean_data", "type": "Function", "lineno": 166}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_detects_injected_outlier", "type": "Function", "lineno": 172}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_compute_daily_returns", "type": "Function", "lineno": 181}]}, {"nodeid": "tests/test_plotting_libraries.py", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection", "type": "Class"}]}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization", "outcome": "passed", "result": [{"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_multiselect_tickers", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_simulations_slider", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_risk_free_rate_input", "type": "Function", "lineno": 38}]}, {"nodeid": "tests/test_portfolio_optimization.py", "outcome": "passed", "result": [{"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization", "type": "Class"}]}, {"nodeid": "tests/test_rent_vs_buy.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rent_vs_buy.py::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_rent_vs_buy.py::test_has_bedroom_selectbox", "type": "Function", "lineno": 16}]}, {"nodeid": "tests/test_rentbuy_charts.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rentbuy_charts.py::test_build_cost_over_time_chart_returns_figure", "type": "Function", "lineno": 10}]}, {"nodeid": "tests/test_rentbuy_finance.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[125000-0]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[250000-2500]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[400000-10000]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[500000-15000]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[925000-36250]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[1000000-43750]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[1500000-93750]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[2000000-153750]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[300000-0]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[400000-5000]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[500000-10000]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_ftb_above_cap_uses_standard", "type": "Function", "lineno": 52}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_standard_case", "type": "Function", "lineno": 61}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_zero_interest", "type": "Function", "lineno": 67}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_scales_with_principal", "type": "Function", "lineno": 73}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_at_start_equals_principal", "type": "Function", "lineno": 80}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_partial_term", "type": "Function", "lineno": 84}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_at_end_is_zero", "type": "Function", "lineno": 90}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_zero_interest", "type": "Function", "lineno": 95}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_60", "type": "Function", "lineno": 121}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_75", "type": "Function", "lineno": 125}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_95", "type": "Function", "lineno": 129}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_above_top_bracket", "type": "Function", "lineno": 133}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_bracket_boundary_rounds_up", "type": "Function", "lineno": 138}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_buying_returns_expected_keys", "type": "Function", "lineno": 186}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_buying_upfront_includes_all_components", "type": "Function", "lineno": 198}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_flat_includes_service_charge_and_ground_rent", "type": "Function", "lineno": 208}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_house_ignores_service_charge_even_if_set", "type": "Function", "lineno": 216}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_auto_tier_rate_uses_boe_lookup", "type": "Function", "lineno": 223}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_equity_at_sale_positive", "type": "Function", "lineno": 229}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_includes_remortgage_fees_with_frictions", "type": "Function", "lineno": 235}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_no_remortgage_fees_without_frictions", "type": "Function", "lineno": 243}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_no_remortgage_when_plan_shorter_than_fix", "type": "Function", "lineno": 250}, {"nodeid": "tests/test_rentbuy_finance.py::test_cash_rich_buyer_gets_investment_income", "type": "Function", "lineno": 258}, {"nodeid": "tests/test_rentbuy_finance.py::test_isa_toggle_increases_investment_income", "type": "Function", "lineno": 265}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_renting_returns_expected_keys", "type": "Function", "lineno": 277}, {"nodeid": "tests/test_rentbuy_finance.py::test_zero_rent_growth_total_is_simple_product", "type": "Function", "lineno": 289}, {"nodeid": "tests/test_rentbuy_finance.py::test_rent_growth_compounds", "type": "Function", "lineno": 295}, {"nodeid": "tests/test_rentbuy_finance.py::test_multiple_moves_with_long_term_frictions", "type": "Function", "lineno": 301}, {"nodeid": "tests/test_rentbuy_finance.py::test_single_move_without_long_term_frictions", "type": "Function", "lineno": 312}, {"nodeid": "tests/test_rentbuy_finance.py::test_rent_opportunity_cost_greater_for_cash_rich", "type": "Function", "lineno": 322}, {"nodeid": "tests/test_rentbuy_finance.py::test_breakeven_rent_positive", "type": "Function", "lineno": 329}, {"nodeid": "tests/test_rentbuy_finance.py::test_breakeven_rent_decreases_with_longer_stay", "type": "Function", "lineno": 335}, {"nodeid": "tests/test_rentbuy_finance.py::test_scenario_accepts_bedrooms_field", "type": "Function", "lineno": 342}]}, {"nodeid": "tests/test_rentbuy_inputs.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rentbuy_inputs.py::test_load_district_to_borough_schema", "type": "Function", "lineno": 18}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_borough_rents_schema", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_borough_rents_by_bedroom_schema", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_council_tax_schema", "type": "Function", "lineno": 40}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_boe_rates_schema", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_known_borough", "type": "Function", "lineno": 53}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_missing_borough_returns_fallback", "type": "Function", "lineno": 60}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_with_bedroom_known_borough", "type": "Function", "lineno": 69}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_with_bedroom_studio_smaller_than_2bed", "type": "Function", "lineno": 81}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_falls_back_to_single_median_when_borough_missing", "type": "Function", "lineno": 94}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_council_tax_known_borough", "type": "Function", "lineno": 108}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_council_tax_missing_borough_returns_fallback", "type": "Function", "lineno": 114}, {"nodeid": "tests/test_rentbuy_inputs.py::test_lookup_boe_rate", "type": "Function", "lineno": 120}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_with_postcode_and_property_type", "type": "Function", "lineno": 126}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_falls_back_to_london_median", "type": "Function", "lineno": 135}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_with_bedrooms_filters", "type": "Function", "lineno": 145}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_falls_back_when_borough_missing", "type": "Function", "lineno": 165}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_without_bedrooms_uses_legacy_chain", "type": "Function", "lineno": 182}]}, {"nodeid": "tests/test_rentbuy_scenario.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_returns_complete_result", "type": "Function", "lineno": 10}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_verdict_consistent_with_delta", "type": "Function", "lineno": 22}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_feasibility_flag", "type": "Function", "lineno": 31}]}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator", "outcome": "passed", "result": [{"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_top_level_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_monte_carlo_checkbox", "type": "Function", "lineno": 38}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_metrics", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_switch_to_target_mode", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_retirement_calculator.py", "outcome": "passed", "result": [{"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator", "type": "Class"}]}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis", "outcome": "passed", "result": [{"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_loads_without_error", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_shows_title", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_analyzer_radio", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_headline_text_area", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_reset_button", "type": "Function", "lineno": 42}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_textblob_mode", "type": "Function", "lineno": 50}]}, {"nodeid": "tests/test_sentiment_analysis.py", "outcome": "passed", "result": [{"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis", "type": "Class"}]}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_top_level_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_ticker_text_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_sma_checkbox", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_ema_checkbox", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_bollinger_checkbox", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_rsi_checkbox", "type": "Function", "lineno": 49}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_macd_checkbox", "type": "Function", "lineno": 54}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_sma_checked_by_default", "type": "Function", "lineno": 59}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_rsi_checked_by_default", "type": "Function", "lineno": 64}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_macd_checked_by_default", "type": "Function", "lineno": 69}]}, {"nodeid": "tests/test_stock_analysis.py", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis", "type": "Class"}]}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_two_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_ticker_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_model_radio", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_test_size_slider", "type": "Function", "lineno": 38}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_random_forest_mode", "type": "Function", "lineno": 43}]}, {"nodeid": "tests/test_stock_prediction.py", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_prediction.py::TestStockPrediction", "type": "Class"}]}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_shows_title", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_expected_tabs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_ticker_text_input", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_period_radio", "type": "Function", "lineno": 40}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_weight_sliders", "type": "Function", "lineno": 45}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_scan_button", "type": "Function", "lineno": 49}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_preset_buttons", "type": "Function", "lineno": 54}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_equal_weight_button", "type": "Function", "lineno": 61}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_run_checks_button", "type": "Function", "lineno": 66}]}, {"nodeid": "tests/test_stock_risk_scanner.py", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner", "type": "Class"}]}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_top_level_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_ticker_text_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_ticker_default_value", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_period_selectbox", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_metrics", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_error_on_empty_data", "type": "Function", "lineno": 43}]}, {"nodeid": "tests/test_stock_tracker.py", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_tracker.py::TestStockTracker", "type": "Class"}]}, {"nodeid": "tests/test_time_series.py::TestTimeSeries", "outcome": "passed", "result": [{"nodeid": "tests/test_time_series.py::TestTimeSeries::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_shows_title", "type": "Function", "lineno": 17}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_ticker_input", "type": "Function", "lineno": 22}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_period_selectbox", "type": "Function", "lineno": 27}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_loads_data_successfully", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_tabs", "type": "Function", "lineno": 36}]}, {"nodeid": "tests/test_time_series.py", "outcome": "passed", "result": [{"nodeid": "tests/test_time_series.py::TestTimeSeries", "type": "Class"}]}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR", "outcome": "passed", "result": [{"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_ticker_input", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_period_selectbox", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_confidence_slider", "type": "Function", "lineno": 29}]}, {"nodeid": "tests/test_var_cvar.py", "outcome": "passed", "result": [{"nodeid": "tests/test_var_cvar.py::TestVaRCVaR", "type": "Class"}]}, {"nodeid": "tests", "outcome": "passed", "result": [{"nodeid": "tests/fixtures", "type": "Dir"}, {"nodeid": "tests/test_algo_trading.py", "type": "Module"}, {"nodeid": "tests/test_anomaly_detection.py", "type": "Module"}, {"nodeid": "tests/test_app.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_datasets.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_engines.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_rates.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_report.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_runner.py", "type": "Module"}, {"nodeid": "tests/test_bigo_algorithms.py", "type": "Module"}, {"nodeid": "tests/test_bigo_problems.py", "type": "Module"}, {"nodeid": "tests/test_bigo_report.py", "type": "Module"}, {"nodeid": "tests/test_bigo_runner.py", "type": "Module"}, {"nodeid": "tests/test_budget_tracker.py", "type": "Module"}, {"nodeid": "tests/test_churros.py", "type": "Module"}, {"nodeid": "tests/test_clustering.py", "type": "Module"}, {"nodeid": "tests/test_contagion_constants.py", "type": "Module"}, {"nodeid": "tests/test_contagion_correlations.py", "type": "Module"}, {"nodeid": "tests/test_contagion_data_quality.py", "type": "Module"}, {"nodeid": "tests/test_contagion_globe.py", "type": "Module"}, {"nodeid": "tests/test_contagion_loader.py", "type": "Module"}, {"nodeid": "tests/test_credit_card_calculator.py", "type": "Module"}, {"nodeid": "tests/test_crypto_portfolio.py", "type": "Module"}, {"nodeid": "tests/test_currency_dashboard.py", "type": "Module"}, {"nodeid": "tests/test_esg_tracker.py", "type": "Module"}, {"nodeid": "tests/test_financial_reporting.py", "type": "Module"}, {"nodeid": "tests/test_global_contagion.py", "type": "Module"}, {"nodeid": "tests/test_globe_arc.py", "type": "Module"}, {"nodeid": "tests/test_globe_color.py", "type": "Module"}, {"nodeid": "tests/test_investment_planner.py", "type": "Module"}, {"nodeid": "tests/test_loan_amortization.py", "type": "Module"}, {"nodeid": "tests/test_loan_comparison.py", "type": "Module"}, {"nodeid": "tests/test_loan_default.py", "type": "Module"}, {"nodeid": "tests/test_london_house_prices.py", "type": "Module"}, {"nodeid": "tests/test_market_insights.py", "type": "Module"}, {"nodeid": "tests/test_personal_finance.py", "type": "Module"}, {"nodeid": "tests/test_plotting_libraries.py", "type": "Module"}, {"nodeid": "tests/test_portfolio_optimization.py", "type": "Module"}, {"nodeid": "tests/test_rent_vs_buy.py", "type": "Module"}, {"nodeid": "tests/test_rentbuy_charts.py", "type": "Module"}, {"nodeid": "tests/test_rentbuy_finance.py", "type": "Module"}, {"nodeid": "tests/test_rentbuy_inputs.py", "type": "Module"}, {"nodeid": "tests/test_rentbuy_scenario.py", "type": "Module"}, {"nodeid": "tests/test_retirement_calculator.py", "type": "Module"}, {"nodeid": "tests/test_sentiment_analysis.py", "type": "Module"}, {"nodeid": "tests/test_stock_analysis.py", "type": "Module"}, {"nodeid": "tests/test_stock_prediction.py", "type": "Module"}, {"nodeid": "tests/test_stock_risk_scanner.py", "type": "Module"}, {"nodeid": "tests/test_stock_tracker.py", "type": "Module"}, {"nodeid": "tests/test_time_series.py", "type": "Module"}, {"nodeid": "tests/test_var_cvar.py", "type": "Module"}]}], "tests": [{"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.4289383220000076, "outcome": "passed"}, "call": {"duration": 0.3333888469999948, "outcome": "passed", "stderr": "2026-04-29 19:02:51.891 WARNING streamlit.runtime.scriptrunner_utils.script_run_context: Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.102 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.172 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003210700000124689, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.007296957999997744, "outcome": "passed"}, "call": {"duration": 0.04810475099999678, "outcome": "passed", "stderr": "2026-04-29 19:02:52.233 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.262 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.268 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00030841699999939465, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_two_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.0067945170000029975, "outcome": "passed"}, "call": {"duration": 0.04992369900000426, "outcome": "passed", "stderr": "2026-04-29 19:02:52.288 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.319 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.325 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.000292436999998813, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_ticker_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.0067261599999994814, "outcome": "passed"}, "call": {"duration": 0.04857840500000066, "outcome": "passed", "stderr": "2026-04-29 19:02:52.346 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.376 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.382 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002913550000016585, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.0072718500000092945, "outcome": "passed"}, "call": {"duration": 0.04699207400000205, "outcome": "passed", "stderr": "2026-04-29 19:02:52.403 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.432 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.438 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028736699999853954, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_strategy_radio", "lineno": 33, "outcome": "passed", "keywords": ["test_has_strategy_radio", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.006738713999993706, "outcome": "passed"}, "call": {"duration": 0.047498129000004496, "outcome": "passed", "stderr": "2026-04-29 19:02:52.458 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.487 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.493 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00029825800000082836, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_sma_sliders", "lineno": 38, "outcome": "passed", "keywords": ["test_has_sma_sliders", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.006816157999992356, "outcome": "passed"}, "call": {"duration": 0.047087617000002524, "outcome": "passed", "stderr": "2026-04-29 19:02:52.513 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.543 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.548 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002701260000037564, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_momentum_mode", "lineno": 46, "outcome": "passed", "keywords": ["test_momentum_mode", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.006681446000001756, "outcome": "passed"}, "call": {"duration": 0.0940677629999982, "outcome": "passed", "stderr": "2026-04-29 19:02:52.568 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.597 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.603 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.643 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.649 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00029830799999785995, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.08992972300001156, "outcome": "passed"}, "call": {"duration": 0.039593902999996544, "outcome": "passed", "stderr": "2026-04-29 19:02:52.753 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.778 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.781 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002808549999997467, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.007325249999993844, "outcome": "passed"}, "call": {"duration": 0.037320659000002365, "outcome": "passed", "stderr": "2026-04-29 19:02:52.801 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.823 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.826 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002917449999984001, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_ticker_input", "lineno": 20, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.007043723999998974, "outcome": "passed"}, "call": {"duration": 0.037802291999994964, "outcome": "passed", "stderr": "2026-04-29 19:02:52.846 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.868 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.871 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002951929999994718, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_period_selectbox", "lineno": 25, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.007222757999997498, "outcome": "passed"}, "call": {"duration": 0.03717287300000294, "outcome": "passed", "stderr": "2026-04-29 19:02:52.892 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.914 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.917 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00029031300000781357, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_method_radio", "lineno": 29, "outcome": "passed", "keywords": ["test_has_method_radio", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.007314969999995924, "outcome": "passed"}, "call": {"duration": 0.038688257999993425, "outcome": "passed", "stderr": "2026-04-29 19:02:52.938 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:52.962 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:52.965 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026402400000336, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_threshold_slider", "lineno": 34, "outcome": "passed", "keywords": ["test_has_threshold_slider", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.0066750140000095826, "outcome": "passed"}, "call": {"duration": 0.03676267699999869, "outcome": "passed", "stderr": "2026-04-29 19:02:52.984 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:53.005 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:53.008 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003031170000014072, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_isolation_forest_mode", "lineno": 39, "outcome": "passed", "keywords": ["test_isolation_forest_mode", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.0069305220000046575, "outcome": "passed"}, "call": {"duration": 1.3366095560000133, "outcome": "passed", "stderr": "2026-04-29 19:02:53.028 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:53.050 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:53.053 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:54.349 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:54.353 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003021849999953474, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestLandingPage::test_loads_without_error", "lineno": 7, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLandingPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.007236133999995786, "outcome": "passed"}, "call": {"duration": 0.017245533999997065, "outcome": "passed", "stderr": "2026-04-29 19:02:54.373 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:54.389 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.00026358300000595136, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestLandingPage::test_shows_title", "lineno": 12, "outcome": "passed", "keywords": ["test_shows_title", "TestLandingPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.0068707009999968705, "outcome": "passed"}, "call": {"duration": 0.015184478999998419, "outcome": "passed", "stderr": "2026-04-29 19:02:54.398 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:54.412 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.0002616499999987809, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_loads_without_error", "lineno": 31, "outcome": "passed", "keywords": ["test_loads_without_error", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.00667196899999567, "outcome": "passed"}, "call": {"duration": 0.35586123000000214, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:02:54.421 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:54.484 The widget with key \"weight_slider_0\" was created with a default value but also had its value set via the Session State API.\nStack (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/threading.py\", line 1002, in _bootstrap\n self._bootstrap_inner()\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/threading.py\", line 1045, in _bootstrap_inner\n self.run()\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/threading.py\", line 982, in run\n self._target(*self._args, **self._kwargs)\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/script_runner.py\", line 379, in _run_script_thread\n self._run_script(request.rerun_data)\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/script_runner.py\", line 705, in _run_script\n ) = exec_func_with_error_handling(code_to_exec, ctx)\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/exec_code.py\", line 129, in exec_func_with_error_handling\n result = func()\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/script_runner.py\", line 689, in code_to_exec\n exec(code, module.__dict__) # noqa: S102\n File \"/home/runner/work/QuantLab/QuantLab/dashboard/pages/1_Stock_Risk_Scanner.py\", line 159, in \n w = st.slider(\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/metrics_util.py\", line 698, in wrapped_func\n result = non_optional_func(*args, **kwargs)\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/elements/widgets/slider.py\", line 721, in slider\n return self._slider(\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/elements/widgets/slider.py\", line 762, in _slider\n check_widget_policies(\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/elements/lib/policies.py\", line 180, in check_widget_policies\n check_session_state_rules(\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/elements/lib/policies.py\", line 91, in check_session_state_rules\n _LOGGER.warning(\n2026-04-29 19:02:54.551 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024413699999570326, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_shows_title", "lineno": 40, "outcome": "passed", "keywords": ["test_shows_title", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.006374301000008131, "outcome": "passed"}, "call": {"duration": 0.09759076199999583, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:02:54.784 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:54.843 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028636500000800424, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_three_tabs", "lineno": 45, "outcome": "passed", "keywords": ["test_has_three_tabs", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.006478626999992798, "outcome": "passed"}, "call": {"duration": 0.09781722500000001, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:02:54.889 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:54.947 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026591699999301, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_scan_button", "lineno": 49, "outcome": "passed", "keywords": ["test_has_scan_button", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.006685192999995593, "outcome": "passed"}, "call": {"duration": 0.09860554300000501, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:02:54.994 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:55.053 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026236100001142404, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_preset_buttons", "lineno": 54, "outcome": "passed", "keywords": ["test_has_preset_buttons", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.006751417000003812, "outcome": "passed"}, "call": {"duration": 0.09544237000000066, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:02:55.101 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:55.157 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002564389999974992, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_equal_weight_button", "lineno": 61, "outcome": "passed", "keywords": ["test_has_equal_weight_button", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.006577011000004518, "outcome": "passed"}, "call": {"duration": 0.09921375099999352, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:02:55.204 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:55.263 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00030915900001105, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_datasets.py::test_presets_has_small_and_large_keys", "lineno": 9, "outcome": "passed", "keywords": ["test_presets_has_small_and_large_keys", "test_benchmark_datasets.py", "tests", "dashboard", ""], "setup": {"duration": 0.0067394739999997455, "outcome": "passed"}, "call": {"duration": 0.00014853800000480533, "outcome": "passed"}, "teardown": {"duration": 0.0001916289999996934, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_datasets.py::test_preset_entries_have_required_fields", "lineno": 13, "outcome": "passed", "keywords": ["test_preset_entries_have_required_fields", "test_benchmark_datasets.py", "tests", "dashboard", ""], "setup": {"duration": 0.006335488999994254, "outcome": "passed"}, "call": {"duration": 0.00015523999999800253, "outcome": "passed"}, "teardown": {"duration": 0.00023859600000264436, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_datasets.py::test_get_available_presets_filters_missing_files", "lineno": 21, "outcome": "passed", "keywords": ["test_get_available_presets_filters_missing_files", "test_benchmark_datasets.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061969500000031985, "outcome": "passed"}, "call": {"duration": 0.00022194500000694006, "outcome": "passed"}, "teardown": {"duration": 0.00021453099999746428, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_ops_constant_has_seven_entries", "lineno": 41, "outcome": "passed", "keywords": ["test_ops_constant_has_seven_entries", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.006322515000007911, "outcome": "passed"}, "call": {"duration": 0.00018286199998840402, "outcome": "passed"}, "teardown": {"duration": 0.0002004749999997557, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_default_column_config_resolves", "lineno": 48, "outcome": "passed", "keywords": ["test_default_column_config_resolves", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.023140103999992334, "outcome": "passed"}, "call": {"duration": 0.00145313799998803, "outcome": "passed"}, "teardown": {"duration": 0.000276497000001541, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_read_parity", "lineno": 55, "outcome": "passed", "keywords": ["test_read_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.006972380999997085, "outcome": "passed"}, "call": {"duration": 0.022481639999995195, "outcome": "passed"}, "teardown": {"duration": 0.000290903999996317, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_count_parity", "lineno": 61, "outcome": "passed", "keywords": ["test_count_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.00886201400000175, "outcome": "passed"}, "call": {"duration": 0.001209602000002974, "outcome": "passed"}, "teardown": {"duration": 0.0002542160000018612, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_filter_parity", "lineno": 67, "outcome": "passed", "keywords": ["test_filter_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.010860360999998875, "outcome": "passed"}, "call": {"duration": 0.013506380000009699, "outcome": "passed"}, "teardown": {"duration": 0.00029589300000054664, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_groupby_parity", "lineno": 77, "outcome": "passed", "keywords": ["test_groupby_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.00859477900000627, "outcome": "passed"}, "call": {"duration": 0.00856281600000841, "outcome": "passed"}, "teardown": {"duration": 0.00029939999998873645, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_sort_parity", "lineno": 86, "outcome": "passed", "keywords": ["test_sort_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.008888283999993973, "outcome": "passed"}, "call": {"duration": 0.012319605000001843, "outcome": "passed"}, "teardown": {"duration": 0.0003278629999954319, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_regex_parity", "lineno": 95, "outcome": "passed", "keywords": ["test_regex_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.008787495000007084, "outcome": "passed"}, "call": {"duration": 0.00783734800000957, "outcome": "passed"}, "teardown": {"duration": 0.00027545500000769607, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_write_parity", "lineno": 105, "outcome": "passed", "keywords": ["test_write_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.011560445000000641, "outcome": "passed"}, "call": {"duration": 0.016177992000010022, "outcome": "passed"}, "teardown": {"duration": 0.0003069450000054985, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.006525905000003718, "outcome": "passed"}, "call": {"duration": 0.9673887990000054, "outcome": "passed", "stderr": "2026-04-29 19:02:55.518 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:56.065 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.069 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.453 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.459 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.471 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003022549999940338, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.007004710000003911, "outcome": "passed"}, "call": {"duration": 0.0775201340000109, "outcome": "passed", "stderr": "2026-04-29 19:02:56.494 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:56.523 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.526 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.540 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.546 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.558 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002370329999905607, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_top_level_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_top_level_tabs", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.006127230000004147, "outcome": "passed"}, "call": {"duration": 0.07788939399999606, "outcome": "passed", "stderr": "2026-04-29 19:02:56.578 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:56.607 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.610 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.625 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.631 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.643 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002535840000064127, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_currency_selectbox", "lineno": 24, "outcome": "passed", "keywords": ["test_has_currency_selectbox", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.006392355999992105, "outcome": "passed"}, "call": {"duration": 0.077953033, "outcome": "passed", "stderr": "2026-04-29 19:02:56.663 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:56.692 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.695 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.709 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.716 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.727 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002642939999901728, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_notional_input", "lineno": 29, "outcome": "passed", "keywords": ["test_has_notional_input", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.0065796160000104464, "outcome": "passed"}, "call": {"duration": 0.07813894100000596, "outcome": "passed", "stderr": "2026-04-29 19:02:56.749 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:56.777 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.781 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.795 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.802 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.813 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00023972799999683048, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_fixed_rate_input", "lineno": 34, "outcome": "passed", "keywords": ["test_has_fixed_rate_input", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.006054052999999726, "outcome": "passed"}, "call": {"duration": 0.07680512599999645, "outcome": "passed", "stderr": "2026-04-29 19:02:56.834 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:56.862 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.865 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.880 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.886 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:56.897 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024256300000047304, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_position_radio", "lineno": 39, "outcome": "passed", "keywords": ["test_has_position_radio", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.006254026999997109, "outcome": "passed"}, "call": {"duration": 0.19905439800000124, "outcome": "passed", "stderr": "2026-04-29 19:02:56.918 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:57.067 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.070 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.085 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.092 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.103 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002742730000022675, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_rate_selectbox", "lineno": 43, "outcome": "passed", "keywords": ["test_has_rate_selectbox", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.0063024270000084925, "outcome": "passed"}, "call": {"duration": 0.07890801399999248, "outcome": "passed", "stderr": "2026-04-29 19:02:57.124 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:57.153 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.156 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.171 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.177 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.189 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.000285834999999679, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_period_selectbox", "lineno": 48, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.006733062999998651, "outcome": "passed"}, "call": {"duration": 0.07798369699999341, "outcome": "passed", "stderr": "2026-04-29 19:02:57.210 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:57.239 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.242 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.257 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.263 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.274 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002387870000006842, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_metrics", "lineno": 53, "outcome": "passed", "keywords": ["test_has_metrics", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.006063861000001225, "outcome": "passed"}, "call": {"duration": 0.08163149800000724, "outcome": "passed", "stderr": "2026-04-29 19:02:57.295 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:02:57.324 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.327 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.343 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.349 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:02:57.362 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002609179999950584, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_report.py::test_build_overview_chart_returns_figure", "lineno": 39, "outcome": "passed", "keywords": ["test_build_overview_chart_returns_figure", "test_benchmark_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.007340699000010886, "outcome": "passed"}, "call": {"duration": 0.005982779000007099, "outcome": "passed"}, "teardown": {"duration": 0.00022645299999624058, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_dataframe_result", "lineno": 47, "outcome": "passed", "keywords": ["test_build_op_card_dataframe_result", "test_benchmark_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.00709336600000654, "outcome": "passed"}, "call": {"duration": 0.00015903700000308163, "outcome": "passed"}, "teardown": {"duration": 0.0001987610000071527, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_scalar_result", "lineno": 58, "outcome": "passed", "keywords": ["test_build_op_card_scalar_result", "test_benchmark_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.007053461999987576, "outcome": "passed"}, "call": {"duration": 0.00016306499999529933, "outcome": "passed"}, "teardown": {"duration": 0.00020167700000683908, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_write_result", "lineno": 64, "outcome": "passed", "keywords": ["test_build_op_card_write_result", "test_benchmark_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.006728264000003037, "outcome": "passed"}, "call": {"duration": 0.00014960000000030504, "outcome": "passed"}, "teardown": {"duration": 0.00018991500000709038, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_returns_seven_results", "lineno": 7, "outcome": "passed", "keywords": ["test_run_benchmark_returns_seven_results", "test_benchmark_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.00694765400000108, "outcome": "passed"}, "call": {"duration": 4.713144280999998, "outcome": "passed"}, "teardown": {"duration": 0.0002446470000023737, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_correctness_flags_set", "lineno": 24, "outcome": "passed", "keywords": ["test_run_benchmark_correctness_flags_set", "test_benchmark_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006376815999999508, "outcome": "passed"}, "call": {"duration": 4.7604524089999956, "outcome": "passed"}, "teardown": {"duration": 0.00025364399999716625, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_bad_column_captures_error", "lineno": 30, "outcome": "passed", "keywords": ["test_run_benchmark_bad_column_captures_error", "test_benchmark_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006488256000011461, "outcome": "passed"}, "call": {"duration": 1.5082426029999993, "outcome": "passed"}, "teardown": {"duration": 0.0002615599999984397, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_runner.py::test_result_preview_shapes", "lineno": 49, "outcome": "passed", "keywords": ["test_result_preview_shapes", "test_benchmark_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0065817210000034265, "outcome": "passed"}, "call": {"duration": 1.5338895610000094, "outcome": "passed"}, "teardown": {"duration": 0.00028885000000400396, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-0-0]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-0-0]", "parametrize", "pytestmark", "fib_naive-0-0", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006871673999995664, "outcome": "passed"}, "call": {"duration": 0.00014668400000061865, "outcome": "passed"}, "teardown": {"duration": 0.00023427800000774823, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-1-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-1-1]", "parametrize", "pytestmark", "fib_naive-1-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.00633746500000143, "outcome": "passed"}, "call": {"duration": 0.00015184400000123333, "outcome": "passed"}, "teardown": {"duration": 0.00020728799999858438, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-2-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-2-1]", "parametrize", "pytestmark", "fib_naive-2-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061649619999997185, "outcome": "passed"}, "call": {"duration": 0.0001327880000019377, "outcome": "passed"}, "teardown": {"duration": 0.00020417199999656077, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-5-5]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-5-5]", "parametrize", "pytestmark", "fib_naive-5-5", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005984472999998047, "outcome": "passed"}, "call": {"duration": 0.00013055400000894224, "outcome": "passed"}, "teardown": {"duration": 0.00019395300000724092, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-10-55]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-10-55]", "parametrize", "pytestmark", "fib_naive-10-55", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005994603000004872, "outcome": "passed"}, "call": {"duration": 0.00013427099999319125, "outcome": "passed"}, "teardown": {"duration": 0.00019209000001296772, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-20-6765]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-20-6765]", "parametrize", "pytestmark", "fib_naive-20-6765", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006125728000000663, "outcome": "passed"}, "call": {"duration": 0.0011278300000014951, "outcome": "passed"}, "teardown": {"duration": 0.00019874200000913333, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-25-75025]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-25-75025]", "parametrize", "pytestmark", "fib_naive-25-75025", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005913210000002778, "outcome": "passed"}, "call": {"duration": 0.011090695000007145, "outcome": "passed"}, "teardown": {"duration": 0.00022459000000196738, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-0-0]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-0-0]", "parametrize", "pytestmark", "fib_iterative-0-0", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006426509999997165, "outcome": "passed"}, "call": {"duration": 0.00016059000000723245, "outcome": "passed"}, "teardown": {"duration": 0.0001987619999965773, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-1-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-1-1]", "parametrize", "pytestmark", "fib_iterative-1-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006048212999999691, "outcome": "passed"}, "call": {"duration": 0.0001298929999933307, "outcome": "passed"}, "teardown": {"duration": 0.0002014569999886362, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-2-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-2-1]", "parametrize", "pytestmark", "fib_iterative-2-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005939038999997592, "outcome": "passed"}, "call": {"duration": 0.00012773900000695448, "outcome": "passed"}, "teardown": {"duration": 0.00019337099999461316, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-5-5]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-5-5]", "parametrize", "pytestmark", "fib_iterative-5-5", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.007292771999999559, "outcome": "passed"}, "call": {"duration": 0.00012852999999779513, "outcome": "passed"}, "teardown": {"duration": 0.00019149800000661799, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-10-55]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-10-55]", "parametrize", "pytestmark", "fib_iterative-10-55", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006054515000002425, "outcome": "passed"}, "call": {"duration": 0.00012706800001183183, "outcome": "passed"}, "teardown": {"duration": 0.00019201900001064587, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-20-6765]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-20-6765]", "parametrize", "pytestmark", "fib_iterative-20-6765", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005947715000004905, "outcome": "passed"}, "call": {"duration": 0.000158476000009955, "outcome": "passed"}, "teardown": {"duration": 0.00019851199999720848, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-25-75025]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-25-75025]", "parametrize", "pytestmark", "fib_iterative-25-75025", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005985706000004143, "outcome": "passed"}, "call": {"duration": 0.0001283399999891799, "outcome": "passed"}, "teardown": {"duration": 0.000223437000002491, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-0-0]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-0-0]", "parametrize", "pytestmark", "fib_memoized-0-0", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006154452000004085, "outcome": "passed"}, "call": {"duration": 0.00015316699999345929, "outcome": "passed"}, "teardown": {"duration": 0.0002310520000037286, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-1-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-1-1]", "parametrize", "pytestmark", "fib_memoized-1-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006014239000009525, "outcome": "passed"}, "call": {"duration": 0.00014507100000571427, "outcome": "passed"}, "teardown": {"duration": 0.000196567000003256, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-2-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-2-1]", "parametrize", "pytestmark", "fib_memoized-2-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005985324999997488, "outcome": "passed"}, "call": {"duration": 0.000141284000008568, "outcome": "passed"}, "teardown": {"duration": 0.0001961770000065144, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-5-5]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-5-5]", "parametrize", "pytestmark", "fib_memoized-5-5", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005987209000011262, "outcome": "passed"}, "call": {"duration": 0.00016374699998777942, "outcome": "passed"}, "teardown": {"duration": 0.0001935419999909982, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-10-55]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-10-55]", "parametrize", "pytestmark", "fib_memoized-10-55", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005895035999998299, "outcome": "passed"}, "call": {"duration": 0.00013950100000670318, "outcome": "passed"}, "teardown": {"duration": 0.0002182980000071666, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-20-6765]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-20-6765]", "parametrize", "pytestmark", "fib_memoized-20-6765", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006004180999994446, "outcome": "passed"}, "call": {"duration": 0.0001423359999961349, "outcome": "passed"}, "teardown": {"duration": 0.00019503400000076, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-25-75025]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-25-75025]", "parametrize", "pytestmark", "fib_memoized-25-75025", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.0070738109999979315, "outcome": "passed"}, "call": {"duration": 0.00014128399999435715, "outcome": "passed"}, "teardown": {"duration": 0.00019141799999999876, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-0-0]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-0-0]", "parametrize", "pytestmark", "fib_matrix-0-0", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005879647000000432, "outcome": "passed"}, "call": {"duration": 0.00012282900000570862, "outcome": "passed"}, "teardown": {"duration": 0.00021480200000212335, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-1-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-1-1]", "parametrize", "pytestmark", "fib_matrix-1-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005902059000007398, "outcome": "passed"}, "call": {"duration": 0.00012383199999987937, "outcome": "passed"}, "teardown": {"duration": 0.00019283100000677678, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-2-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-2-1]", "parametrize", "pytestmark", "fib_matrix-2-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006139579000006279, "outcome": "passed"}, "call": {"duration": 0.00014572199999918212, "outcome": "passed"}, "teardown": {"duration": 0.00021672599999078557, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-5-5]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-5-5]", "parametrize", "pytestmark", "fib_matrix-5-5", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006156246000003307, "outcome": "passed"}, "call": {"duration": 0.0001367160000000922, "outcome": "passed"}, "teardown": {"duration": 0.00020327999999381063, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-10-55]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-10-55]", "parametrize", "pytestmark", "fib_matrix-10-55", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005863176999994835, "outcome": "passed"}, "call": {"duration": 0.00013296900000625556, "outcome": "passed"}, "teardown": {"duration": 0.00019860199999754968, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-20-6765]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-20-6765]", "parametrize", "pytestmark", "fib_matrix-20-6765", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.00596927499999822, "outcome": "passed"}, "call": {"duration": 0.0001423359999961349, "outcome": "passed"}, "teardown": {"duration": 0.00023190400000316913, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-25-75025]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-25-75025]", "parametrize", "pytestmark", "fib_matrix-25-75025", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006006114000001617, "outcome": "passed"}, "call": {"duration": 0.00014481099999841263, "outcome": "passed"}, "teardown": {"duration": 0.00020312000000899388, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr0-5-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr0-5-True]", "parametrize", "pytestmark", "pair_brute-arr0-5-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006067880000003356, "outcome": "passed"}, "call": {"duration": 0.00014453999999375355, "outcome": "passed"}, "teardown": {"duration": 0.00021145499999875028, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr1-8-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr1-8-False]", "parametrize", "pytestmark", "pair_brute-arr1-8-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006041781000007518, "outcome": "passed"}, "call": {"duration": 0.0001405830000038577, "outcome": "passed"}, "teardown": {"duration": 0.00021569300000123803, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr2-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr2-5-False]", "parametrize", "pytestmark", "pair_brute-arr2-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.007235574000006295, "outcome": "passed"}, "call": {"duration": 0.0001330179999996517, "outcome": "passed"}, "teardown": {"duration": 0.00020948299999190567, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr3-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr3-5-False]", "parametrize", "pytestmark", "pair_brute-arr3-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005975767999998993, "outcome": "passed"}, "call": {"duration": 0.0001578859999966653, "outcome": "passed"}, "teardown": {"duration": 0.0002043920000005528, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr4-6-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr4-6-True]", "parametrize", "pytestmark", "pair_brute-arr4-6-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.00592367000000138, "outcome": "passed"}, "call": {"duration": 0.00013202700000647383, "outcome": "passed"}, "teardown": {"duration": 0.0002101440000075172, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr5-9-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr5-9-True]", "parametrize", "pytestmark", "pair_brute-arr5-9-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005986067000009143, "outcome": "passed"}, "call": {"duration": 0.0001359940000043025, "outcome": "passed"}, "teardown": {"duration": 0.00023995899999817993, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr6-15-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr6-15-False]", "parametrize", "pytestmark", "pair_brute-arr6-15-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006054575999996814, "outcome": "passed"}, "call": {"duration": 0.0001304139999973586, "outcome": "passed"}, "teardown": {"duration": 0.00020447300001080748, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr0-5-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr0-5-True]", "parametrize", "pytestmark", "pair_sorted-arr0-5-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.00616987100001154, "outcome": "passed"}, "call": {"duration": 0.00013309899999569552, "outcome": "passed"}, "teardown": {"duration": 0.00020238899999469595, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr1-8-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr1-8-False]", "parametrize", "pytestmark", "pair_sorted-arr1-8-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.00599225899999567, "outcome": "passed"}, "call": {"duration": 0.00013404099999547725, "outcome": "passed"}, "teardown": {"duration": 0.00020608600000571187, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr2-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr2-5-False]", "parametrize", "pytestmark", "pair_sorted-arr2-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005899755000001505, "outcome": "passed"}, "call": {"duration": 0.00012858000000903758, "outcome": "passed"}, "teardown": {"duration": 0.00020476299999927505, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr3-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr3-5-False]", "parametrize", "pytestmark", "pair_sorted-arr3-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005937887000001751, "outcome": "passed"}, "call": {"duration": 0.00012649599999292604, "outcome": "passed"}, "teardown": {"duration": 0.00023246499999629577, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr4-6-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr4-6-True]", "parametrize", "pytestmark", "pair_sorted-arr4-6-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006007357000001434, "outcome": "passed"}, "call": {"duration": 0.00012957300000948635, "outcome": "passed"}, "teardown": {"duration": 0.00020456200000751323, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr5-9-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr5-9-True]", "parametrize", "pytestmark", "pair_sorted-arr5-9-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005908841999996639, "outcome": "passed"}, "call": {"duration": 0.0001344310000064297, "outcome": "passed"}, "teardown": {"duration": 0.00021251699999425, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr6-15-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr6-15-False]", "parametrize", "pytestmark", "pair_sorted-arr6-15-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.007091935000005378, "outcome": "passed"}, "call": {"duration": 0.00015274599999770544, "outcome": "passed"}, "teardown": {"duration": 0.00020109599999784677, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr0-5-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr0-5-True]", "parametrize", "pytestmark", "pair_hash-arr0-5-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059718600000024935, "outcome": "passed"}, "call": {"duration": 0.0001271280000025854, "outcome": "passed"}, "teardown": {"duration": 0.00022532100000205446, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr1-8-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr1-8-False]", "parametrize", "pytestmark", "pair_hash-arr1-8-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005978662999993389, "outcome": "passed"}, "call": {"duration": 0.00013083499999311243, "outcome": "passed"}, "teardown": {"duration": 0.0002040420000071208, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr2-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr2-5-False]", "parametrize", "pytestmark", "pair_hash-arr2-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005809886999998071, "outcome": "passed"}, "call": {"duration": 0.0001291009999988546, "outcome": "passed"}, "teardown": {"duration": 0.0002053639999957113, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr3-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr3-5-False]", "parametrize", "pytestmark", "pair_hash-arr3-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005913450999997849, "outcome": "passed"}, "call": {"duration": 0.00012487399999372428, "outcome": "passed"}, "teardown": {"duration": 0.00020306000000402946, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr4-6-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr4-6-True]", "parametrize", "pytestmark", "pair_hash-arr4-6-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059673020000019505, "outcome": "passed"}, "call": {"duration": 0.0001267069999926207, "outcome": "passed"}, "teardown": {"duration": 0.0002019670000095175, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr5-9-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr5-9-True]", "parametrize", "pytestmark", "pair_hash-arr5-9-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005909263000006604, "outcome": "passed"}, "call": {"duration": 0.00012785900000267247, "outcome": "passed"}, "teardown": {"duration": 0.0002019979999943189, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr6-15-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr6-15-False]", "parametrize", "pytestmark", "pair_hash-arr6-15-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006105130000008785, "outcome": "passed"}, "call": {"duration": 0.0001529960000112851, "outcome": "passed"}, "teardown": {"duration": 0.00020468300000686668, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_problems.py::test_registry_has_seed_problems", "lineno": 5, "outcome": "passed", "keywords": ["test_registry_has_seed_problems", "test_bigo_problems.py", "tests", "dashboard", ""], "setup": {"duration": 0.005744786000008162, "outcome": "passed"}, "call": {"duration": 0.00013869999999371885, "outcome": "passed"}, "teardown": {"duration": 0.00020701799999756076, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_problems.py::test_input_factory_returns_tuple", "lineno": 24, "outcome": "passed", "keywords": ["test_input_factory_returns_tuple", "test_bigo_problems.py", "tests", "dashboard", ""], "setup": {"duration": 0.005666269000002444, "outcome": "passed"}, "call": {"duration": 0.0002582830000079639, "outcome": "passed"}, "teardown": {"duration": 0.0001866689999872051, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_problems.py::test_variant_big_o_labels_non_empty", "lineno": 39, "outcome": "passed", "keywords": ["test_variant_big_o_labels_non_empty", "test_bigo_problems.py", "tests", "dashboard", ""], "setup": {"duration": 0.007028657000006433, "outcome": "passed"}, "call": {"duration": 0.0001696070000036798, "outcome": "passed"}, "teardown": {"duration": 0.0002006849999958149, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_report.py::test_build_complexity_chart_returns_figure", "lineno": 23, "outcome": "passed", "keywords": ["test_build_complexity_chart_returns_figure", "test_bigo_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.005724697000005108, "outcome": "passed"}, "call": {"duration": 0.007823623999996698, "outcome": "passed"}, "teardown": {"duration": 0.00019541599999683967, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_report.py::test_build_variant_card_shape", "lineno": 33, "outcome": "passed", "keywords": ["test_build_variant_card_shape", "test_bigo_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.0058318279999980405, "outcome": "passed"}, "call": {"duration": 0.0001838339999977734, "outcome": "passed"}, "teardown": {"duration": 0.00022533099999577644, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_returns_expected_structure", "lineno": 10, "outcome": "passed", "keywords": ["test_run_problem_returns_expected_structure", "test_bigo_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005780151000010392, "outcome": "passed"}, "call": {"duration": 3.4996288670000126, "outcome": "passed"}, "teardown": {"duration": 0.0002979570000007925, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_skips_past_budget", "lineno": 24, "outcome": "passed", "keywords": ["test_run_problem_skips_past_budget", "test_bigo_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.00685891000000538, "outcome": "passed"}, "call": {"duration": 0.050425122999996574, "outcome": "passed"}, "teardown": {"duration": 0.0003337950000030787, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_correctness_check", "lineno": 47, "outcome": "passed", "keywords": ["test_run_problem_correctness_check", "test_bigo_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006922258000003012, "outcome": "passed"}, "call": {"duration": 3.4092881370000043, "outcome": "passed"}, "teardown": {"duration": 0.0003123350000038272, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_captures_exception", "lineno": 57, "outcome": "passed", "keywords": ["test_run_problem_captures_exception", "test_bigo_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0066511509999998, "outcome": "passed"}, "call": {"duration": 0.0001871300000004794, "outcome": "passed"}, "teardown": {"duration": 0.00020698699999854853, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005808184000002825, "outcome": "passed"}, "call": {"duration": 0.06200527100000386, "outcome": "passed", "stderr": "2026-04-29 19:03:17.348 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:17.363 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.391 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.395 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.397 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024415699999735807, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006052160999999501, "outcome": "passed"}, "call": {"duration": 0.047485120999994024, "outcome": "passed", "stderr": "2026-04-29 19:03:17.417 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:17.428 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.446 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.450 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.452 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00023314599999935126, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006328597999996077, "outcome": "passed"}, "call": {"duration": 0.04868721900000139, "outcome": "passed", "stderr": "2026-04-29 19:03:17.471 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:17.483 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.501 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.506 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.507 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00023900800000831168, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006209353999992118, "outcome": "passed"}, "call": {"duration": 0.056931429000002254, "outcome": "passed", "stderr": "2026-04-29 19:03:17.527 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:17.538 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.556 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.561 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.563 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003277130000043371, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_income_number_input", "lineno": 30, "outcome": "passed", "keywords": ["test_has_income_number_input", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.009813335000004031, "outcome": "passed"}, "call": {"duration": 0.05133703599999251, "outcome": "passed", "stderr": "2026-04-29 19:03:17.595 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:17.607 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.626 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.630 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.632 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00023513899999727528, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_data_editor", "lineno": 36, "outcome": "passed", "keywords": ["test_has_data_editor", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006397707000004971, "outcome": "passed"}, "call": {"duration": 0.05315401699999711, "outcome": "passed", "stderr": "2026-04-29 19:03:17.654 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:17.666 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.685 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.690 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.693 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002915150000006861, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_metrics", "lineno": 42, "outcome": "passed", "keywords": ["test_has_metrics", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006647955000005368, "outcome": "passed"}, "call": {"duration": 0.05600457699999595, "outcome": "passed", "stderr": "2026-04-29 19:03:17.714 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:17.727 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.747 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.752 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.755 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025993599999196704, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_shows_budget_status_message", "lineno": 46, "outcome": "passed", "keywords": ["test_shows_budget_status_message", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006761697000001732, "outcome": "passed"}, "call": {"duration": 0.054209138000004486, "outcome": "passed", "stderr": "2026-04-29 19:03:17.778 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:17.791 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.810 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.815 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.818 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002881689999867376, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_switch_to_plan_mode", "lineno": 56, "outcome": "passed", "keywords": ["test_switch_to_plan_mode", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.0066774399999900425, "outcome": "passed"}, "call": {"duration": 0.1051762430000025, "outcome": "passed", "stderr": "2026-04-29 19:03:17.840 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:17.852 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.872 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.876 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.879 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.905 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.925 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.930 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:17.932 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026921399999935147, "outcome": "passed"}}, {"nodeid": "tests/test_churros.py::TestChurros::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestChurros", "test_churros.py", "tests", "dashboard", ""], "setup": {"duration": 0.007732602999993787, "outcome": "passed"}, "call": {"duration": 0.01732708000000116, "outcome": "passed", "stderr": "2026-04-29 19:03:17.954 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00030814699999837103, "outcome": "passed"}}, {"nodeid": "tests/test_churros.py::TestChurros::test_shows_title", "lineno": 17, "outcome": "passed", "keywords": ["test_shows_title", "TestChurros", "test_churros.py", "tests", "dashboard", ""], "setup": {"duration": 0.006944029000010232, "outcome": "passed"}, "call": {"duration": 0.01530015900000592, "outcome": "passed", "stderr": "2026-04-29 19:03:17.979 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00027508399999476296, "outcome": "passed"}}, {"nodeid": "tests/test_churros.py::TestChurros::test_has_password_form", "lineno": 21, "outcome": "passed", "keywords": ["test_has_password_form", "TestChurros", "test_churros.py", "tests", "dashboard", ""], "setup": {"duration": 0.006882273000002215, "outcome": "passed"}, "call": {"duration": 0.01457026399999961, "outcome": "passed", "stderr": "2026-04-29 19:03:18.002 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00032906599999193986, "outcome": "passed"}}, {"nodeid": "tests/test_churros.py::TestChurros::test_has_form_submit", "lineno": 32, "outcome": "passed", "keywords": ["test_has_form_submit", "TestChurros", "test_churros.py", "tests", "dashboard", ""], "setup": {"duration": 0.009676659999996673, "outcome": "passed"}, "call": {"duration": 0.017135906999996564, "outcome": "passed", "stderr": "2026-04-29 19:03:18.027 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00040799199999241864, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.00959021900000323, "outcome": "passed"}, "call": {"duration": 0.2708415169999938, "outcome": "passed", "stderr": "2026-04-29 19:03:18.055 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:18.300 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.310 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.314 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002929580000028409, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.0072636169999924505, "outcome": "passed"}, "call": {"duration": 0.07502474500000744, "outcome": "passed", "stderr": "2026-04-29 19:03:18.334 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:18.383 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.392 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.397 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00031904699999074637, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_two_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.006686727000001724, "outcome": "passed"}, "call": {"duration": 0.07446419999999421, "outcome": "passed", "stderr": "2026-04-29 19:03:18.417 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:18.465 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.474 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.480 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003686390000012807, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_data_source_radio", "lineno": 24, "outcome": "passed", "keywords": ["test_has_data_source_radio", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.007482034999995335, "outcome": "passed"}, "call": {"duration": 0.07335749199999952, "outcome": "passed", "stderr": "2026-04-29 19:03:18.500 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:18.547 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.557 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.561 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028136699999947723, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_algorithm_radio", "lineno": 29, "outcome": "passed", "keywords": ["test_has_algorithm_radio", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.006597932000005358, "outcome": "passed"}, "call": {"duration": 0.07252570999999364, "outcome": "passed", "stderr": "2026-04-29 19:03:18.581 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:18.627 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.637 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.641 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003126050000048508, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_clusters_slider", "lineno": 34, "outcome": "passed", "keywords": ["test_has_clusters_slider", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.006651460999989922, "outcome": "passed"}, "call": {"duration": 0.0741392080000054, "outcome": "passed", "stderr": "2026-04-29 19:03:18.661 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:18.709 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.719 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.723 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00032743200000595607, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_custom_data_mode", "lineno": 39, "outcome": "passed", "keywords": ["test_custom_data_mode", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.006713066000003209, "outcome": "passed"}, "call": {"duration": 0.20880897699998968, "outcome": "passed", "stderr": "2026-04-29 19:03:18.743 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:18.790 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.799 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.804 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.827 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.927 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.936 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:18.940 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003171229999878733, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_periods_cover_expected_date_ranges", "lineno": 6, "outcome": "passed", "keywords": ["test_periods_cover_expected_date_ranges", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.0067534719999997606, "outcome": "passed"}, "call": {"duration": 0.00015597200000172506, "outcome": "passed"}, "teardown": {"duration": 0.00020308999999940625, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_every_ticker_has_a_role", "lineno": 14, "outcome": "passed", "keywords": ["test_every_ticker_has_a_role", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.00613249100000246, "outcome": "passed"}, "call": {"duration": 0.00014640400000587306, "outcome": "passed"}, "teardown": {"duration": 0.00023464799998862418, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_destination_cities_include_all_five", "lineno": 20, "outcome": "passed", "keywords": ["test_destination_cities_include_all_five", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.005854951999992863, "outcome": "passed"}, "call": {"duration": 0.0001356429999930242, "outcome": "passed"}, "teardown": {"duration": 0.000185756999997011, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_epicenter_origin_is_strait_of_hormuz", "lineno": 25, "outcome": "passed", "keywords": ["test_epicenter_origin_is_strait_of_hormuz", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061691150000058315, "outcome": "passed"}, "call": {"duration": 0.0001329889999936995, "outcome": "passed"}, "teardown": {"duration": 0.0001869700000014518, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_every_destination_city_has_a_ticker_in_roles", "lineno": 31, "outcome": "passed", "keywords": ["test_every_destination_city_has_a_ticker_in_roles", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.006096534000008091, "outcome": "passed"}, "call": {"duration": 0.000160080000000562, "outcome": "passed"}, "teardown": {"duration": 0.00019732900000235531, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_correlation_window_is_positive_int", "lineno": 39, "outcome": "passed", "keywords": ["test_correlation_window_is_positive_int", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.005841467000010425, "outcome": "passed"}, "call": {"duration": 0.0001314959999945131, "outcome": "passed"}, "teardown": {"duration": 0.0001865489999914871, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_of_identical_series_is_one", "lineno": 8, "outcome": "passed", "keywords": ["test_rolling_corr_of_identical_series_is_one", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.006490309999989563, "outcome": "passed"}, "call": {"duration": 0.0009910029999957715, "outcome": "passed"}, "teardown": {"duration": 0.00022730500000989196, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_of_opposite_series_is_negative_one", "lineno": 15, "outcome": "passed", "keywords": ["test_rolling_corr_of_opposite_series_is_negative_one", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.007105310999989456, "outcome": "passed"}, "call": {"duration": 0.0007520969999887939, "outcome": "passed"}, "teardown": {"duration": 0.00022987999999202202, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_output_bounded", "lineno": 22, "outcome": "passed", "keywords": ["test_rolling_corr_output_bounded", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.1437771060000017, "outcome": "passed"}, "call": {"duration": 0.0010620959999982915, "outcome": "passed"}, "teardown": {"duration": 0.0002022479999936877, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_middle_east_index_averages_epicenter_tickers", "lineno": 31, "outcome": "passed", "keywords": ["test_middle_east_index_averages_epicenter_tickers", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.005983301999989976, "outcome": "passed"}, "call": {"duration": 0.007594625999999494, "outcome": "passed"}, "teardown": {"duration": 0.00027331100000083097, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_window_larger_than_series_is_all_nan", "lineno": 46, "outcome": "passed", "keywords": ["test_rolling_corr_window_larger_than_series_is_all_nan", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.006411031999988381, "outcome": "passed"}, "call": {"duration": 0.0007655419999963442, "outcome": "passed"}, "teardown": {"duration": 0.000193371000008824, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_middle_east_index_empty_when_no_epicenter_rows", "lineno": 53, "outcome": "passed", "keywords": ["test_middle_east_index_empty_when_no_epicenter_rows", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.006932417000001578, "outcome": "passed"}, "call": {"duration": 0.007024639999997362, "outcome": "passed"}, "teardown": {"duration": 0.0002441359999920678, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_both_periods_present", "lineno": 40, "outcome": "passed", "keywords": ["test_both_periods_present", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.009801574000007918, "outcome": "passed"}, "call": {"duration": 0.00044346999999334, "outcome": "passed"}, "teardown": {"duration": 0.0002045020000025488, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_all_asset_roles_present", "lineno": 46, "outcome": "passed", "keywords": ["test_all_asset_roles_present", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.005888274000000138, "outcome": "passed"}, "call": {"duration": 0.00034223000000110915, "outcome": "passed"}, "teardown": {"duration": 0.00019292099999290713, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_core_tickers_present_in_both_periods", "lineno": 52, "outcome": "passed", "keywords": ["test_core_tickers_present_in_both_periods", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.00631337900000517, "outcome": "passed"}, "call": {"duration": 0.0021899460000014415, "outcome": "passed"}, "teardown": {"duration": 0.00020971200000019508, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_minimum_row_counts_per_ticker[2020_us_iran-30-3]", "lineno": 59, "outcome": "passed", "keywords": ["test_minimum_row_counts_per_ticker[2020_us_iran-30-3]", "parametrize", "pytestmark", "2020_us_iran-30-3", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.006451328000011358, "outcome": "passed"}, "call": {"duration": 0.0030835879999955296, "outcome": "passed"}, "teardown": {"duration": 0.000303197999997451, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_minimum_row_counts_per_ticker[2024_hormuz-200-12]", "lineno": 59, "outcome": "passed", "keywords": ["test_minimum_row_counts_per_ticker[2024_hormuz-200-12]", "parametrize", "pytestmark", "2024_hormuz-200-12", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.007000513999997793, "outcome": "passed"}, "call": {"duration": 0.003322905000004539, "outcome": "passed"}, "teardown": {"duration": 0.00023488899999790647, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_no_na_in_close_column", "lineno": 79, "outcome": "passed", "keywords": ["test_no_na_in_close_column", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.007350569999999834, "outcome": "passed"}, "call": {"duration": 0.00032343499999853975, "outcome": "passed"}, "teardown": {"duration": 0.00018902300000434025, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_close_values_are_positive", "lineno": 83, "outcome": "passed", "keywords": ["test_close_values_are_positive", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.005803575000001615, "outcome": "passed"}, "call": {"duration": 0.0013879659999957994, "outcome": "passed"}, "teardown": {"duration": 0.0002101629999913257, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_red_at_plus_one", "lineno": 6, "outcome": "passed", "keywords": ["test_correlation_to_color_red_at_plus_one", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.006143354999991857, "outcome": "passed"}, "call": {"duration": 0.00014773599998818554, "outcome": "passed"}, "teardown": {"duration": 0.0001969690000009905, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_green_at_minus_one", "lineno": 12, "outcome": "passed", "keywords": ["test_correlation_to_color_green_at_minus_one", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.005754443999990144, "outcome": "passed"}, "call": {"duration": 0.0001423559999977897, "outcome": "passed"}, "teardown": {"duration": 0.00021103400000299644, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_gray_at_zero", "lineno": 18, "outcome": "passed", "keywords": ["test_correlation_to_color_gray_at_zero", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.005981629000004318, "outcome": "passed"}, "call": {"duration": 0.00015023100000632894, "outcome": "passed"}, "teardown": {"duration": 0.0002161040000032699, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_clips_out_of_range", "lineno": 24, "outcome": "passed", "keywords": ["test_correlation_to_color_clips_out_of_range", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.005762057999987746, "outcome": "passed"}, "call": {"duration": 0.0001506720000037376, "outcome": "passed"}, "teardown": {"duration": 0.00019202900000436784, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_build_arc_layer_returns_one_arc_per_destination", "lineno": 29, "outcome": "passed", "keywords": ["test_build_arc_layer_returns_one_arc_per_destination", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.005813553999999499, "outcome": "passed"}, "call": {"duration": 0.00018139899999880527, "outcome": "passed"}, "teardown": {"duration": 0.00020130599999390597, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_returns_all_rows_when_no_period", "lineno": 23, "outcome": "passed", "keywords": ["test_load_events_returns_all_rows_when_no_period", "test_contagion_loader.py", "tests", "dashboard", ""], "setup": {"duration": 0.00638390099999242, "outcome": "passed"}, "call": {"duration": 0.003888614000004509, "outcome": "passed"}, "teardown": {"duration": 0.0002212740000118174, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_filters_by_period", "lineno": 30, "outcome": "passed", "keywords": ["test_load_events_filters_by_period", "test_contagion_loader.py", "tests", "dashboard", ""], "setup": {"duration": 0.006395722999997133, "outcome": "passed"}, "call": {"duration": 0.0043461890000031644, "outcome": "passed"}, "teardown": {"duration": 0.00022554200000968194, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_raises_when_file_missing", "lineno": 38, "outcome": "passed", "keywords": ["test_load_events_raises_when_file_missing", "test_contagion_loader.py", "tests", "dashboard", ""], "setup": {"duration": 0.006251954000006776, "outcome": "passed"}, "call": {"duration": 0.00021247799999457584, "outcome": "passed"}, "teardown": {"duration": 0.00023326599999506925, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005942566000001648, "outcome": "passed"}, "call": {"duration": 0.07694250200000852, "outcome": "passed", "stderr": "2026-04-29 19:03:19.328 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:19.361 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.390 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.393 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002575120000045672, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.0063664979999913385, "outcome": "passed"}, "call": {"duration": 0.07444768500000976, "outcome": "passed", "stderr": "2026-04-29 19:03:19.413 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:19.443 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.472 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.474 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024995699999408316, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.00656306599999823, "outcome": "passed"}, "call": {"duration": 0.07491727900000456, "outcome": "passed", "stderr": "2026-04-29 19:03:19.494 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:19.525 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.554 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.557 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002898230000027979, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.006592871999998806, "outcome": "passed"}, "call": {"duration": 0.07503972199999964, "outcome": "passed", "stderr": "2026-04-29 19:03:19.577 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:19.608 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.637 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.640 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025499699999897985, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.00636072799998999, "outcome": "passed"}, "call": {"duration": 0.07485957500000495, "outcome": "passed", "stderr": "2026-04-29 19:03:19.659 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:19.690 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.719 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.722 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002607779999976856, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_default_mode_shows_payment_input", "lineno": 37, "outcome": "passed", "keywords": ["test_default_mode_shows_payment_input", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.0065358350000082055, "outcome": "passed"}, "call": {"duration": 0.07518437199999539, "outcome": "passed", "stderr": "2026-04-29 19:03:19.741 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:19.773 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.802 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.805 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002814169999965088, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_metrics", "lineno": 44, "outcome": "passed", "keywords": ["test_has_metrics", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.006388480000012464, "outcome": "passed"}, "call": {"duration": 0.07379886100000022, "outcome": "passed", "stderr": "2026-04-29 19:03:19.824 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:19.855 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.883 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.886 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028032499999142146, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_switch_to_target_mode", "lineno": 48, "outcome": "passed", "keywords": ["test_switch_to_target_mode", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.006274325999996222, "outcome": "passed"}, "call": {"duration": 0.15641192500000045, "outcome": "passed", "stderr": "2026-04-29 19:03:19.905 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:19.936 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.966 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:19.969 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.014 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.044 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.047 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028338999999277803, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.007318007999998599, "outcome": "passed"}, "call": {"duration": 0.10761788400000682, "outcome": "passed", "stderr": "2026-04-29 19:03:20.070 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.105 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.158 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00029228700000771823, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.007191101000003641, "outcome": "passed"}, "call": {"duration": 0.0519963490000066, "outcome": "passed", "stderr": "2026-04-29 19:03:20.185 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.218 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.220 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025469700000257944, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.006513674000004244, "outcome": "passed"}, "call": {"duration": 0.046812678999998525, "outcome": "passed", "stderr": "2026-04-29 19:03:20.245 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.275 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.276 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002583930000099599, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_data_editor", "lineno": 24, "outcome": "skipped", "keywords": ["test_has_data_editor", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.00697437600000228, "outcome": "passed"}, "call": {"duration": 0.045337233000012134, "outcome": "skipped", "stderr": "2026-04-29 19:03:20.299 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.328 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.329 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n", "longrepr": "('/home/runner/work/QuantLab/QuantLab/dashboard/tests/test_crypto_portfolio.py', 31, \"Skipped: data_editor not exposed in this Streamlit version's AppTest\")"}, "teardown": {"duration": 0.00025361400000178946, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_metrics", "lineno": 32, "outcome": "passed", "keywords": ["test_has_metrics", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.006300293999998985, "outcome": "passed"}, "call": {"duration": 0.048686552999996024, "outcome": "passed", "stderr": "2026-04-29 19:03:20.352 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.383 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.385 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003071849999969345, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_metric_labels", "lineno": 37, "outcome": "passed", "keywords": ["test_metric_labels", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.006742230999989829, "outcome": "passed"}, "call": {"duration": 0.048954926000007504, "outcome": "passed", "stderr": "2026-04-29 19:03:20.408 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.439 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.441 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026194000000145934, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006750355999997737, "outcome": "passed"}, "call": {"duration": 0.060063669000001596, "outcome": "passed", "stderr": "2026-04-29 19:03:20.465 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.508 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.512 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002632329999983085, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006734026000003723, "outcome": "passed"}, "call": {"duration": 0.06130636299999992, "outcome": "passed", "stderr": "2026-04-29 19:03:20.533 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.576 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.580 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.000291023999992035, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_base_currency_selectbox", "lineno": 20, "outcome": "passed", "keywords": ["test_has_base_currency_selectbox", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006934861000004844, "outcome": "passed"}, "call": {"duration": 0.06040297500000236, "outcome": "passed", "stderr": "2026-04-29 19:03:20.602 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.646 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.650 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00027810999999644537, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_base_currency_options", "lineno": 25, "outcome": "passed", "keywords": ["test_base_currency_options", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006518312000011406, "outcome": "passed"}, "call": {"duration": 0.05989021400000638, "outcome": "passed", "stderr": "2026-04-29 19:03:20.670 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.713 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.717 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00031137300000239065, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_target_multiselect", "lineno": 31, "outcome": "passed", "keywords": ["test_has_target_multiselect", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.007462759000006258, "outcome": "passed"}, "call": {"duration": 0.05889456200000609, "outcome": "passed", "stderr": "2026-04-29 19:03:20.738 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.781 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.784 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003076649999940173, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_amount_number_input", "lineno": 36, "outcome": "passed", "keywords": ["test_has_amount_number_input", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006923321000002147, "outcome": "passed"}, "call": {"duration": 0.05889282000001117, "outcome": "passed", "stderr": "2026-04-29 19:03:20.805 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.848 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.851 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002906339999952934, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_expected_tabs_with_targets", "lineno": 41, "outcome": "passed", "keywords": ["test_has_expected_tabs_with_targets", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006869609000005994, "outcome": "passed"}, "call": {"duration": 0.058596675000003984, "outcome": "passed", "stderr": "2026-04-29 19:03:20.872 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.914 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.917 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00027182799999536655, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_shows_metrics_for_targets", "lineno": 46, "outcome": "passed", "keywords": ["test_shows_metrics_for_targets", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006688480999997637, "outcome": "passed"}, "call": {"duration": 0.20758320499999172, "outcome": "passed", "stderr": "2026-04-29 19:03:20.938 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:20.980 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:20.984 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026541700000848323, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_error_on_fetch_failure", "lineno": 51, "outcome": "passed", "keywords": ["test_error_on_fetch_failure", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006496892999990678, "outcome": "passed"}, "call": {"duration": 0.01100037600001258, "outcome": "passed", "stderr": "2026-04-29 19:03:21.153 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002510489999991705, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006337755000004108, "outcome": "passed"}, "call": {"duration": 0.0827338350000133, "outcome": "passed", "stderr": "2026-04-29 19:03:21.171 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:21.193 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.204 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.241 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025273200000697216, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006559338999991837, "outcome": "passed"}, "call": {"duration": 0.07764876099999185, "outcome": "passed", "stderr": "2026-04-29 19:03:21.261 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:21.280 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.291 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.325 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00027179799999998977, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006767068000002041, "outcome": "passed"}, "call": {"duration": 0.07733848399999488, "outcome": "passed", "stderr": "2026-04-29 19:03:21.347 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:21.366 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.377 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.411 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003171019999967939, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_ticker_text_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.00685451100000023, "outcome": "passed"}, "call": {"duration": 0.08056238099999291, "outcome": "passed", "stderr": "2026-04-29 19:03:21.432 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:21.453 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.464 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.499 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002726999999964619, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_sector_multiselect", "lineno": 29, "outcome": "passed", "keywords": ["test_has_sector_multiselect", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.007912680000004002, "outcome": "passed"}, "call": {"duration": 0.08006937999999764, "outcome": "passed", "stderr": "2026-04-29 19:03:21.521 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:21.540 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.552 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.588 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002710870000015575, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_company_multiselect", "lineno": 35, "outcome": "passed", "keywords": ["test_has_company_multiselect", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.009256484000005116, "outcome": "passed"}, "call": {"duration": 0.07731958899999825, "outcome": "passed", "stderr": "2026-04-29 19:03:21.612 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:21.630 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.641 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.675 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028226800000652474, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_fallback_to_sample_scores", "lineno": 41, "outcome": "passed", "keywords": ["test_fallback_to_sample_scores", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006572302999998669, "outcome": "passed"}, "call": {"duration": 0.07648692700000481, "outcome": "passed", "stderr": "2026-04-29 19:03:21.697 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:21.715 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.726 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.759 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002690940000036335, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_warning_for_sample_data", "lineno": 49, "outcome": "passed", "keywords": ["test_warning_for_sample_data", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006766846999994414, "outcome": "passed"}, "call": {"duration": 0.07650834000000373, "outcome": "passed", "stderr": "2026-04-29 19:03:21.781 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:21.800 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.810 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.843 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003081659999963904, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.006500508999991439, "outcome": "passed"}, "call": {"duration": 0.10621518300000332, "outcome": "passed", "stderr": "2026-04-29 19:03:21.865 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:21.886 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.916 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:21.944 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002688029999973196, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.006672170000001643, "outcome": "passed"}, "call": {"duration": 0.11380252499999699, "outcome": "passed", "stderr": "2026-04-29 19:03:21.979 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:22.001 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.034 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.062 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002744429999950171, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.0070809750000080385, "outcome": "passed"}, "call": {"duration": 0.10918153100000438, "outcome": "passed", "stderr": "2026-04-29 19:03:22.100 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:22.123 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.154 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.180 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003104709999917077, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_ticker_text_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.006718676999994955, "outcome": "passed"}, "call": {"duration": 0.10491724399999214, "outcome": "passed", "stderr": "2026-04-29 19:03:22.217 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:22.239 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.269 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.294 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025669000000050346, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.006948176000008743, "outcome": "passed"}, "call": {"duration": 0.10030019900000298, "outcome": "passed", "stderr": "2026-04-29 19:03:22.330 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:22.351 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.381 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.406 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025548800000763094, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_download_buttons", "lineno": 34, "outcome": "passed", "keywords": ["test_has_download_buttons", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.006273694999990198, "outcome": "passed"}, "call": {"duration": 0.09706580900000006, "outcome": "passed", "stderr": "2026-04-29 19:03:22.437 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:22.457 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.487 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.510 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025669999999422544, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_download_button_labels", "lineno": 42, "outcome": "passed", "keywords": ["test_download_button_labels", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.006301806999999826, "outcome": "passed"}, "call": {"duration": 0.09941684700000053, "outcome": "passed", "stderr": "2026-04-29 19:03:22.542 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:22.562 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.591 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.615 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026327200001219353, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_metrics", "lineno": 49, "outcome": "passed", "keywords": ["test_has_metrics", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.0065299740000028805, "outcome": "passed"}, "call": {"duration": 0.09816866399999924, "outcome": "passed", "stderr": "2026-04-29 19:03:22.649 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:22.669 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.698 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.722 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002770190000092043, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_metric_labels", "lineno": 53, "outcome": "passed", "keywords": ["test_metric_labels", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.006203483999996706, "outcome": "passed"}, "call": {"duration": 0.10005795600000056, "outcome": "passed", "stderr": "2026-04-29 19:03:22.754 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:22.773 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.802 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:22.827 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00030868700000041827, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_loads_without_error", "lineno": 10, "outcome": "passed", "keywords": ["test_loads_without_error", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.0066087209999921015, "outcome": "passed"}, "call": {"duration": 0.09656514699999263, "outcome": "passed", "stderr": "2026-04-29 19:03:22.861 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:22.930 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002597149999985504, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_shows_title", "lineno": 14, "outcome": "passed", "keywords": ["test_shows_title", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.006536366000005955, "outcome": "passed"}, "call": {"duration": 0.08701185399999645, "outcome": "passed", "stderr": "2026-04-29 19:03:22.965 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.026 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002748140000079502, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_period_radio", "lineno": 19, "outcome": "passed", "keywords": ["test_has_period_radio", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.006623009000009006, "outcome": "passed"}, "call": {"duration": 0.24295116000000405, "outcome": "passed", "stderr": "2026-04-29 19:03:23.060 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.274 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00027140800000324816, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_timeline_slider", "lineno": 27, "outcome": "passed", "keywords": ["test_has_timeline_slider", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.006738144000010493, "outcome": "passed"}, "call": {"duration": 0.0873666780000093, "outcome": "passed", "stderr": "2026-04-29 19:03:23.311 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.370 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028406100000211154, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_play_button", "lineno": 31, "outcome": "passed", "keywords": ["test_has_play_button", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.007176543999989349, "outcome": "passed"}, "call": {"duration": 0.08927903400000048, "outcome": "passed", "stderr": "2026-04-29 19:03:23.406 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.468 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003125350000061644, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_side_panel_renders_four_metrics", "lineno": 38, "outcome": "passed", "keywords": ["test_side_panel_renders_four_metrics", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.006689382999994109, "outcome": "passed"}, "call": {"duration": 0.09008751700000062, "outcome": "passed", "stderr": "2026-04-29 19:03:23.503 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.564 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002739030000071807, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_returns_one_row_per_destination", "lineno": 13, "outcome": "passed", "keywords": ["test_returns_one_row_per_destination", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.0063783200000102624, "outcome": "passed"}, "call": {"duration": 0.0001841339999941738, "outcome": "passed"}, "teardown": {"duration": 0.00024938699999665914, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_row_keys_present", "lineno": 18, "outcome": "passed", "keywords": ["test_row_keys_present", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.005912438999999381, "outcome": "passed"}, "call": {"duration": 0.0001784539999931667, "outcome": "passed"}, "teardown": {"duration": 0.00020356100000640254, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_missing_destination_uses_default", "lineno": 28, "outcome": "passed", "keywords": ["test_missing_destination_uses_default", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.006869809999997756, "outcome": "passed"}, "call": {"duration": 0.00021223700001371526, "outcome": "passed"}, "teardown": {"duration": 0.00023654299999975592, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_extra_meta_forwarded", "lineno": 34, "outcome": "passed", "keywords": ["test_extra_meta_forwarded", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.006355657999989717, "outcome": "passed"}, "call": {"duration": 0.00018591799999967407, "outcome": "passed"}, "teardown": {"duration": 0.00022293699998954253, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_source_matches_input", "lineno": 40, "outcome": "passed", "keywords": ["test_source_matches_input", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.0062343609999970795, "outcome": "passed"}, "call": {"duration": 0.00016919700000528337, "outcome": "passed"}, "teardown": {"duration": 0.0002036509999925329, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_at_zero_is_zero_anchor", "lineno": 4, "outcome": "passed", "keywords": ["test_diverging_color_at_zero_is_zero_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.00581506700000034, "outcome": "passed"}, "call": {"duration": 0.00014108300000259533, "outcome": "passed"}, "teardown": {"duration": 0.0002210130000008803, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_pos_one_reaches_pos_anchor", "lineno": 10, "outcome": "passed", "keywords": ["test_diverging_color_pos_one_reaches_pos_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.00687237400001095, "outcome": "passed"}, "call": {"duration": 0.00017732199999898057, "outcome": "passed"}, "teardown": {"duration": 0.00023004000000526048, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_neg_one_reaches_neg_anchor", "lineno": 15, "outcome": "passed", "keywords": ["test_diverging_color_neg_one_reaches_neg_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.006234941999991861, "outcome": "passed"}, "call": {"duration": 0.00015996899999493053, "outcome": "passed"}, "teardown": {"duration": 0.0002291990000031774, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_alpha_scales_with_magnitude", "lineno": 20, "outcome": "passed", "keywords": ["test_diverging_color_alpha_scales_with_magnitude", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.0060988179999981185, "outcome": "passed"}, "call": {"duration": 0.00016072100000030787, "outcome": "passed"}, "teardown": {"duration": 0.00024280499999917993, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_clamps_outside_range", "lineno": 26, "outcome": "passed", "keywords": ["test_diverging_color_clamps_outside_range", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.0074018250000023045, "outcome": "passed"}, "call": {"duration": 0.00014948000000458705, "outcome": "passed"}, "teardown": {"duration": 0.00019578599999192647, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_at_zero_is_low_anchor", "lineno": 33, "outcome": "passed", "keywords": ["test_sequential_color_at_zero_is_low_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.006364855999990482, "outcome": "passed"}, "call": {"duration": 0.00031153300000141826, "outcome": "passed"}, "teardown": {"duration": 0.00022647400000153084, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_at_one_is_high_anchor", "lineno": 39, "outcome": "passed", "keywords": ["test_sequential_color_at_one_is_high_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.006026472000002059, "outcome": "passed"}, "call": {"duration": 0.00015445900000088386, "outcome": "passed"}, "teardown": {"duration": 0.0001997839999887674, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_clamps", "lineno": 45, "outcome": "passed", "keywords": ["test_sequential_color_clamps", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005996335999995495, "outcome": "passed"}, "call": {"duration": 0.00017674000000056367, "outcome": "passed"}, "teardown": {"duration": 0.00021335899999996855, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_min_at_zero", "lineno": 50, "outcome": "passed", "keywords": ["test_value_to_width_min_at_zero", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005900697000001287, "outcome": "passed"}, "call": {"duration": 0.00013915999998914685, "outcome": "passed"}, "teardown": {"duration": 0.00019375299999069284, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_max_at_one", "lineno": 54, "outcome": "passed", "keywords": ["test_value_to_width_max_at_one", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005889866999993387, "outcome": "passed"}, "call": {"duration": 0.00014707500000099571, "outcome": "passed"}, "teardown": {"duration": 0.00023014100000295912, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_uses_abs", "lineno": 58, "outcome": "passed", "keywords": ["test_value_to_width_uses_abs", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.00692414099999894, "outcome": "passed"}, "call": {"duration": 0.0001982900000001564, "outcome": "passed"}, "teardown": {"duration": 0.0002783500000020922, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006436669999999367, "outcome": "passed"}, "call": {"duration": 0.04281790999999657, "outcome": "passed", "stderr": "2026-04-29 19:03:23.717 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.738 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.744 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.747 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002599860000032095, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.007518023000002927, "outcome": "passed"}, "call": {"duration": 0.04230880700001194, "outcome": "passed", "stderr": "2026-04-29 19:03:23.768 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.787 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.793 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.796 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00030663299999389437, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006809046999990187, "outcome": "passed"}, "call": {"duration": 0.04005514199999993, "outcome": "passed", "stderr": "2026-04-29 19:03:23.818 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.837 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.843 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.846 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00033390400000143927, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.007285496999998031, "outcome": "passed"}, "call": {"duration": 0.04017688999999791, "outcome": "passed", "stderr": "2026-04-29 19:03:23.867 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.886 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.892 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.895 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00027899200000547353, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.007766738000000828, "outcome": "passed"}, "call": {"duration": 0.0399487730000061, "outcome": "passed", "stderr": "2026-04-29 19:03:23.916 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.934 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.940 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.943 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003091779999948585, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_sliders", "lineno": 37, "outcome": "passed", "keywords": ["test_has_sliders", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006899454999995669, "outcome": "passed"}, "call": {"duration": 0.04214674300000354, "outcome": "passed", "stderr": "2026-04-29 19:03:23.964 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:23.984 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.990 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:23.993 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00030276600000433973, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_metrics", "lineno": 44, "outcome": "passed", "keywords": ["test_has_metrics", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0070766070000019, "outcome": "passed"}, "call": {"duration": 0.04165206999999782, "outcome": "passed", "stderr": "2026-04-29 19:03:24.014 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.033 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.039 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.042 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002861450000040122, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_switch_to_goal_mode", "lineno": 48, "outcome": "passed", "keywords": ["test_switch_to_goal_mode", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.007050658000011367, "outcome": "passed"}, "call": {"duration": 0.08255077900000174, "outcome": "passed", "stderr": "2026-04-29 19:03:24.063 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.083 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.089 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.092 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.125 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.131 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.133 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00029996099999607395, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.007723246000011841, "outcome": "passed"}, "call": {"duration": 0.04394605999999612, "outcome": "passed", "stderr": "2026-04-29 19:03:24.155 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.175 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.181 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.186 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003079769999914106, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.007607600000000048, "outcome": "passed"}, "call": {"duration": 0.04467016399999579, "outcome": "passed", "stderr": "2026-04-29 19:03:24.207 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.229 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.235 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.239 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002779089999904727, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.0067683900000048425, "outcome": "passed"}, "call": {"duration": 0.043764460000005556, "outcome": "passed", "stderr": "2026-04-29 19:03:24.260 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.280 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.286 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.290 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00031630200000165587, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.0070465009999907124, "outcome": "passed"}, "call": {"duration": 0.04391555400000868, "outcome": "passed", "stderr": "2026-04-29 19:03:24.312 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.333 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.339 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.343 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003017340000042168, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.008587323000000424, "outcome": "passed"}, "call": {"duration": 0.042650798000011036, "outcome": "passed", "stderr": "2026-04-29 19:03:24.365 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.385 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.390 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.395 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00029405000000792825, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_default_mode_has_term_selectbox", "lineno": 37, "outcome": "passed", "keywords": ["test_default_mode_has_term_selectbox", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.006648445999999808, "outcome": "passed"}, "call": {"duration": 0.044746046000000206, "outcome": "passed", "stderr": "2026-04-29 19:03:24.415 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.437 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.443 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.447 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002916659999954163, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_metrics", "lineno": 44, "outcome": "passed", "keywords": ["test_has_metrics", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.006709780000008436, "outcome": "passed"}, "call": {"duration": 0.043910996999997565, "outcome": "passed", "stderr": "2026-04-29 19:03:24.468 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.488 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.494 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.498 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003104009999930213, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_switch_to_budget_mode", "lineno": 48, "outcome": "passed", "keywords": ["test_switch_to_budget_mode", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.007052602000001684, "outcome": "passed"}, "call": {"duration": 0.0811449400000015, "outcome": "passed", "stderr": "2026-04-29 19:03:24.520 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.539 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.544 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.548 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.580 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.585 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.590 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024757300000999294, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.005947945000002619, "outcome": "passed"}, "call": {"duration": 0.04397639700000866, "outcome": "passed", "stderr": "2026-04-29 19:03:24.608 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.626 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.631 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.638 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.638 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.0002455999999995129, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.005874609000002806, "outcome": "passed"}, "call": {"duration": 0.04597197900000083, "outcome": "passed", "stderr": "2026-04-29 19:03:24.658 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.677 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.682 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.689 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.689 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.00031707300000505256, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.007405332000004705, "outcome": "passed"}, "call": {"duration": 0.052066448999994464, "outcome": "passed", "stderr": "2026-04-29 19:03:24.713 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.736 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.742 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.749 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.750 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.00031309599999929105, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.007225895999994236, "outcome": "passed"}, "call": {"duration": 0.05008026400000176, "outcome": "passed", "stderr": "2026-04-29 19:03:24.773 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.795 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.800 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.808 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.809 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.00027535499999942203, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.006947895999999787, "outcome": "passed"}, "call": {"duration": 0.04803833400001167, "outcome": "passed", "stderr": "2026-04-29 19:03:24.831 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.852 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.857 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.864 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.865 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.000278030000004037, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_selectbox_for_terms", "lineno": 37, "outcome": "passed", "keywords": ["test_has_selectbox_for_terms", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.0068477989999991, "outcome": "passed"}, "call": {"duration": 0.0490567800000008, "outcome": "passed", "stderr": "2026-04-29 19:03:24.887 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.908 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.913 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.920 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.921 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.0002782100000047194, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_metrics", "lineno": 43, "outcome": "passed", "keywords": ["test_has_metrics", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.006650610000008328, "outcome": "passed"}, "call": {"duration": 0.04900324899999475, "outcome": "passed", "stderr": "2026-04-29 19:03:24.944 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:24.965 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.970 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.977 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:24.978 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.0003305779999891456, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_switch_to_rate_sensitivity_mode", "lineno": 47, "outcome": "passed", "keywords": ["test_switch_to_rate_sensitivity_mode", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.007145755999999892, "outcome": "passed"}, "call": {"duration": 0.09296981800000026, "outcome": "passed", "stderr": "2026-04-29 19:03:25.001 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:25.023 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.028 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.035 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.035 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n2026-04-29 19:03:25.070 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.075 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.082 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002601969999886933, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.006340729999990913, "outcome": "passed"}, "call": {"duration": 0.066458990000001, "outcome": "passed", "stderr": "2026-04-29 19:03:25.101 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:25.141 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.148 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0004374580000074957, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.009658145999992485, "outcome": "passed"}, "call": {"duration": 0.22648644599999557, "outcome": "passed", "stderr": "2026-04-29 19:03:25.180 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:25.386 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.391 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003006419999849186, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_two_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.00684200799997825, "outcome": "passed"}, "call": {"duration": 0.043427261000005046, "outcome": "passed", "stderr": "2026-04-29 19:03:25.414 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:25.437 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.442 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003154099999846949, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_model_radio", "lineno": 24, "outcome": "passed", "keywords": ["test_has_model_radio", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.006984213999999156, "outcome": "passed"}, "call": {"duration": 0.04169693200000779, "outcome": "passed", "stderr": "2026-04-29 19:03:25.466 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:25.488 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.492 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002447280000126284, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_test_size_slider", "lineno": 29, "outcome": "passed", "keywords": ["test_has_test_size_slider", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.006663354000011168, "outcome": "passed"}, "call": {"duration": 0.0424876129999916, "outcome": "passed", "stderr": "2026-04-29 19:03:25.515 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:25.537 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.541 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00031282500000884284, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_five_number_inputs", "lineno": 34, "outcome": "passed", "keywords": ["test_has_five_number_inputs", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.008446208999998817, "outcome": "passed"}, "call": {"duration": 0.05287047199999506, "outcome": "passed", "stderr": "2026-04-29 19:03:25.567 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:25.598 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.604 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002918259999944439, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_random_forest_mode", "lineno": 41, "outcome": "passed", "keywords": ["test_random_forest_mode", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.007459812999996984, "outcome": "passed"}, "call": {"duration": 0.29446827800001074, "outcome": "passed", "stderr": "2026-04-29 19:03:25.628 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:25.652 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.656 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.884 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:25.888 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003106719999834695, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage::test_loads_without_error", "lineno": 14, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLondonHousePricesPage", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.007034849000007171, "outcome": "passed"}, "call": {"duration": 0.8499236019999898, "outcome": "passed", "stderr": "2026-04-29 19:03:25.931 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:26.434 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:26.521 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:26.667 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028806899999267443, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage::test_shows_title", "lineno": 18, "outcome": "passed", "keywords": ["test_shows_title", "TestLondonHousePricesPage", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.007110439999991058, "outcome": "passed"}, "call": {"duration": 0.6338839370000073, "outcome": "passed", "stderr": "2026-04-29 19:03:26.790 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:27.187 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.270 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.408 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003372200000058001, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_load_ppd_returns_dataframe", "lineno": 43, "outcome": "passed", "keywords": ["test_load_ppd_returns_dataframe", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.009365879000000632, "outcome": "passed"}, "call": {"duration": 0.0010507249999989199, "outcome": "passed"}, "teardown": {"duration": 0.0002475430000004053, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_aggregate_by_district_year", "lineno": 50, "outcome": "passed", "keywords": ["test_aggregate_by_district_year", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.008482897000021694, "outcome": "passed"}, "call": {"duration": 0.006836867999993501, "outcome": "passed"}, "teardown": {"duration": 0.0003053510000086135, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_aggregate_empty_district", "lineno": 56, "outcome": "passed", "keywords": ["test_aggregate_empty_district", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.008692548999988503, "outcome": "passed"}, "call": {"duration": 0.0014808500000071945, "outcome": "passed"}, "teardown": {"duration": 0.0002905929999883483, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_get_all_districts_summary", "lineno": 61, "outcome": "passed", "keywords": ["test_get_all_districts_summary", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.008269838000018126, "outcome": "passed"}, "call": {"duration": 0.00594142400001374, "outcome": "passed"}, "teardown": {"duration": 0.00026517599999920094, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_query_overpass_returns_list", "lineno": 67, "outcome": "passed", "keywords": ["test_query_overpass_returns_list", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.006986707999999453, "outcome": "passed"}, "call": {"duration": 0.0009660869999947863, "outcome": "passed"}, "teardown": {"duration": 0.00020138600001473606, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_loads_without_error", "lineno": 20, "outcome": "passed", "keywords": ["test_loads_without_error", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059781260000022485, "outcome": "passed"}, "call": {"duration": 0.06774891300000263, "outcome": "passed", "stderr": "2026-04-29 19:03:27.493 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:27.541 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.546 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.549 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025902499999119755, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_shows_title", "lineno": 25, "outcome": "passed", "keywords": ["test_shows_title", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.007006245000013678, "outcome": "passed"}, "call": {"duration": 0.05744010600000138, "outcome": "passed", "stderr": "2026-04-29 19:03:27.569 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:27.606 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.611 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.614 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002565500000173415, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_two_tabs", "lineno": 31, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.0066773590000082095, "outcome": "passed"}, "call": {"duration": 0.05639689399998815, "outcome": "passed", "stderr": "2026-04-29 19:03:27.634 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:27.671 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.675 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.678 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002528830000017024, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_ticker_input", "lineno": 36, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.006722134000000324, "outcome": "passed"}, "call": {"duration": 0.0552990520000094, "outcome": "passed", "stderr": "2026-04-29 19:03:27.698 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:27.734 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.739 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.742 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024225300001035066, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_period_selectbox", "lineno": 42, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.006427493000018103, "outcome": "passed"}, "call": {"duration": 0.05656659099997796, "outcome": "passed", "stderr": "2026-04-29 19:03:27.760 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:27.797 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.802 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.805 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026293199999827266, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_headline_text_area", "lineno": 47, "outcome": "passed", "keywords": ["test_has_headline_text_area", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.006705190999980459, "outcome": "passed"}, "call": {"duration": 0.05565560799999503, "outcome": "passed", "stderr": "2026-04-29 19:03:27.825 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:27.861 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.866 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.869 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025994599999989987, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_reset_button", "lineno": 52, "outcome": "passed", "keywords": ["test_has_reset_button", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.006638997999999674, "outcome": "passed"}, "call": {"duration": 0.054906195000000935, "outcome": "passed", "stderr": "2026-04-29 19:03:27.888 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:27.924 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.928 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:27.931 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028848900001321454, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0065591890000007425, "outcome": "passed"}, "call": {"duration": 0.23486341599999605, "outcome": "passed", "stderr": "2026-04-29 19:03:27.950 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:27.994 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.012 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00023420799999485098, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006198424000018576, "outcome": "passed"}, "call": {"duration": 0.07509422199998994, "outcome": "passed", "stderr": "2026-04-29 19:03:28.192 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:28.236 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.255 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002455790000226443, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_income_number_input", "lineno": 20, "outcome": "passed", "keywords": ["test_has_income_number_input", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006512401999998474, "outcome": "passed"}, "call": {"duration": 0.07577143899999328, "outcome": "passed", "stderr": "2026-04-29 19:03:28.274 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:28.319 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.338 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002445970000053421, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_data_editors", "lineno": 25, "outcome": "skipped", "keywords": ["test_has_data_editors", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006613030000011122, "outcome": "passed"}, "call": {"duration": 0.07596769600002062, "outcome": "skipped", "stderr": "2026-04-29 19:03:28.358 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:28.403 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.421 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n", "longrepr": "('/home/runner/work/QuantLab/QuantLab/dashboard/tests/test_personal_finance.py', 32, \"Skipped: data_editor not exposed in this Streamlit version's AppTest\")"}, "teardown": {"duration": 0.0002566200000160279, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_expected_tabs", "lineno": 33, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006509735999998156, "outcome": "passed"}, "call": {"duration": 0.07639650799998776, "outcome": "passed", "stderr": "2026-04-29 19:03:28.441 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:28.487 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.505 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00035956299998929353, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_net_worth_metric", "lineno": 38, "outcome": "passed", "keywords": ["test_has_net_worth_metric", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006517551000001731, "outcome": "passed"}, "call": {"duration": 0.07899149200000011, "outcome": "passed", "stderr": "2026-04-29 19:03:28.525 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:28.572 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.590 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024572899999952824, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_savings_rate_metric", "lineno": 43, "outcome": "passed", "keywords": ["test_has_savings_rate_metric", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006910265000016125, "outcome": "passed"}, "call": {"duration": 0.07798526999999922, "outcome": "passed", "stderr": "2026-04-29 19:03:28.612 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:28.658 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.676 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024415600000793347, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_no_external_api_calls", "lineno": 48, "outcome": "passed", "keywords": ["test_no_external_api_calls", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006370575999994799, "outcome": "passed"}, "call": {"duration": 0.07699405099998557, "outcome": "passed", "stderr": "2026-04-29 19:03:28.697 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:28.743 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.761 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025147099998434896, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_loads_without_error", "lineno": 14, "outcome": "passed", "keywords": ["test_loads_without_error", "TestPlottingLibrariesPage", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.0065674340000043685, "outcome": "passed"}, "call": {"duration": 4.62076540999999, "outcome": "passed", "stderr": "2026-04-29 19:03:28.782 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:28.795 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.804 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.808 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.817 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:28.821 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:32.502 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:32.547 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:32.553 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:32.558 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:33.188 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:33.270 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:33.328 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:33.379 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.00029718600001160667, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_shows_title", "lineno": 18, "outcome": "passed", "keywords": ["test_shows_title", "TestPlottingLibrariesPage", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006732802999977139, "outcome": "passed"}, "call": {"duration": 1.9049255770000002, "outcome": "passed", "stderr": "2026-04-29 19:03:33.410 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:33.420 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:33.430 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:33.435 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:33.444 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:33.449 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:35.003 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:35.043 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:35.048 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:35.052 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:35.106 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:35.186 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:35.242 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:35.293 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.0002848830000061753, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_has_ticker_input", "lineno": 23, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestPlottingLibrariesPage", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006626565000004803, "outcome": "passed"}, "call": {"duration": 2.059523743999989, "outcome": "passed", "stderr": "2026-04-29 19:03:35.322 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:35.331 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:35.339 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:35.343 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:35.351 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:35.355 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:37.074 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:37.116 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:37.121 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:37.126 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:37.177 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:37.255 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:37.312 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:37.361 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.0002573520000055396, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_has_period_selectbox", "lineno": 28, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestPlottingLibrariesPage", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064066329999832305, "outcome": "passed"}, "call": {"duration": 1.7349189699999954, "outcome": "passed", "stderr": "2026-04-29 19:03:37.389 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:37.398 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:37.406 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:37.410 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:37.419 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:37.425 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:38.827 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:38.866 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:38.870 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:38.875 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'` or specify an integer width.\n2026-04-29 19:03:38.923 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:39.000 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:39.054 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-04-29 19:03:39.103 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.0002642139999977644, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_line_chart_returns_figure", "lineno": 52, "outcome": "passed", "keywords": ["test_line_chart_returns_figure", "TestPlotlyCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006939294999995127, "outcome": "passed"}, "call": {"duration": 0.00470632900001533, "outcome": "passed"}, "teardown": {"duration": 0.0002450790000239067, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_candlestick_returns_figure", "lineno": 59, "outcome": "passed", "keywords": ["test_candlestick_returns_figure", "TestPlotlyCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.007687554000000318, "outcome": "passed"}, "call": {"duration": 0.0036020050000047377, "outcome": "passed"}, "teardown": {"duration": 0.00024435699998548444, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_volume_bar_returns_figure", "lineno": 66, "outcome": "passed", "keywords": ["test_volume_bar_returns_figure", "TestPlotlyCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006454157000007399, "outcome": "passed"}, "call": {"duration": 0.0035864959999969415, "outcome": "passed"}, "teardown": {"duration": 0.00021354899999437293, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_returns_histogram_returns_figure", "lineno": 73, "outcome": "passed", "keywords": ["test_returns_histogram_returns_figure", "TestPlotlyCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006507939000016449, "outcome": "passed"}, "call": {"duration": 0.003106537999997272, "outcome": "passed"}, "teardown": {"duration": 0.00022911800002134441, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_line_chart_returns_figure", "lineno": 82, "outcome": "passed", "keywords": ["test_line_chart_returns_figure", "TestMatplotlibCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006617002000012917, "outcome": "passed"}, "call": {"duration": 0.046768917000008514, "outcome": "passed"}, "teardown": {"duration": 0.0002520509999897058, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_candlestick_returns_figure", "lineno": 89, "outcome": "passed", "keywords": ["test_candlestick_returns_figure", "TestMatplotlibCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006789263999991135, "outcome": "passed"}, "call": {"duration": 0.04876336500001344, "outcome": "passed"}, "teardown": {"duration": 0.0003029369999865139, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_volume_bar_returns_figure", "lineno": 96, "outcome": "passed", "keywords": ["test_volume_bar_returns_figure", "TestMatplotlibCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.007006500999978016, "outcome": "passed"}, "call": {"duration": 0.05350854900001423, "outcome": "passed"}, "teardown": {"duration": 0.0002756149999925128, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_returns_histogram_returns_figure", "lineno": 102, "outcome": "passed", "keywords": ["test_returns_histogram_returns_figure", "TestMatplotlibCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.0071203239999988455, "outcome": "passed"}, "call": {"duration": 0.31437387799999783, "outcome": "passed"}, "teardown": {"duration": 0.0002673699999888868, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_line_chart_returns_chart", "lineno": 110, "outcome": "passed", "keywords": ["test_line_chart_returns_chart", "TestAltairCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006946457999987388, "outcome": "passed"}, "call": {"duration": 0.011589388999993844, "outcome": "passed"}, "teardown": {"duration": 0.0002705760000196733, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_candlestick_returns_chart", "lineno": 117, "outcome": "passed", "keywords": ["test_candlestick_returns_chart", "TestAltairCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006571016000009422, "outcome": "passed"}, "call": {"duration": 0.032362150000011525, "outcome": "passed"}, "teardown": {"duration": 0.0003143980000004376, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_volume_bar_returns_chart", "lineno": 124, "outcome": "passed", "keywords": ["test_volume_bar_returns_chart", "TestAltairCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006636979999996129, "outcome": "passed"}, "call": {"duration": 0.0021225280000010116, "outcome": "passed"}, "teardown": {"duration": 0.00022696400000654648, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_returns_histogram_returns_chart", "lineno": 131, "outcome": "passed", "keywords": ["test_returns_histogram_returns_chart", "TestAltairCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006714955000006739, "outcome": "passed"}, "call": {"duration": 0.0019275040000081844, "outcome": "passed"}, "teardown": {"duration": 0.00020558399998549248, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_line_chart_returns_figure", "lineno": 140, "outcome": "passed", "keywords": ["test_line_chart_returns_figure", "TestBokehCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006919066999984125, "outcome": "passed"}, "call": {"duration": 0.023490792000018246, "outcome": "passed"}, "teardown": {"duration": 0.0002880490000052305, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_candlestick_returns_figure", "lineno": 146, "outcome": "passed", "keywords": ["test_candlestick_returns_figure", "TestBokehCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006857451999991326, "outcome": "passed"}, "call": {"duration": 0.027165273000008483, "outcome": "passed"}, "teardown": {"duration": 0.00029724600000236023, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_volume_bar_returns_figure", "lineno": 152, "outcome": "passed", "keywords": ["test_volume_bar_returns_figure", "TestBokehCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.007681954000020141, "outcome": "passed"}, "call": {"duration": 0.020973475000005237, "outcome": "passed"}, "teardown": {"duration": 0.0002942700000119203, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_returns_histogram_returns_figure", "lineno": 158, "outcome": "passed", "keywords": ["test_returns_histogram_returns_figure", "TestBokehCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.007292345999985628, "outcome": "passed"}, "call": {"duration": 0.01742984000000547, "outcome": "passed"}, "teardown": {"duration": 0.0002953019999836215, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_no_outliers_in_clean_data", "lineno": 166, "outcome": "passed", "keywords": ["test_no_outliers_in_clean_data", "TestOutlierDetection", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.010028962000006914, "outcome": "passed"}, "call": {"duration": 0.0016093389999980445, "outcome": "passed"}, "teardown": {"duration": 0.00025301299999114235, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_detects_injected_outlier", "lineno": 172, "outcome": "passed", "keywords": ["test_detects_injected_outlier", "TestOutlierDetection", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.007343219999995654, "outcome": "passed"}, "call": {"duration": 0.0019875860000126977, "outcome": "passed"}, "teardown": {"duration": 0.0002834900000152629, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_compute_daily_returns", "lineno": 181, "outcome": "passed", "keywords": ["test_compute_daily_returns", "TestOutlierDetection", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.0072604249999983494, "outcome": "passed"}, "call": {"duration": 0.0007381200000224908, "outcome": "passed"}, "teardown": {"duration": 0.00026342300000692376, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005928363999998965, "outcome": "passed"}, "call": {"duration": 0.14954150399998412, "outcome": "passed", "stderr": "2026-04-29 19:03:39.902 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:40.022 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.026 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.035 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00027999399998179797, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.006668016999981319, "outcome": "passed"}, "call": {"duration": 0.05086153600001353, "outcome": "passed", "stderr": "2026-04-29 19:03:40.059 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:40.083 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.087 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.095 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002967749999811531, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_multiselect_tickers", "lineno": 20, "outcome": "passed", "keywords": ["test_has_multiselect_tickers", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.006726105999973697, "outcome": "passed"}, "call": {"duration": 0.0507122049999964, "outcome": "passed", "stderr": "2026-04-29 19:03:40.118 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:40.142 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.146 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.154 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002676299999961884, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.007337570000004234, "outcome": "passed"}, "call": {"duration": 0.05018068199998993, "outcome": "passed", "stderr": "2026-04-29 19:03:40.177 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:40.200 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.205 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.213 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002678710000054707, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_simulations_slider", "lineno": 33, "outcome": "passed", "keywords": ["test_has_simulations_slider", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.007115473999988353, "outcome": "passed"}, "call": {"duration": 0.05085913499999606, "outcome": "passed", "stderr": "2026-04-29 19:03:40.235 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:40.259 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.263 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.272 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002617800000166426, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_risk_free_rate_input", "lineno": 38, "outcome": "passed", "keywords": ["test_has_risk_free_rate_input", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064564319999931286, "outcome": "passed"}, "call": {"duration": 0.04931502799999521, "outcome": "passed", "stderr": "2026-04-29 19:03:40.293 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:40.316 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.320 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:40.328 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002655769999933, "outcome": "passed"}}, {"nodeid": "tests/test_rent_vs_buy.py::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "test_rent_vs_buy.py", "tests", "dashboard", ""], "setup": {"duration": 0.0067166489999976875, "outcome": "passed"}, "call": {"duration": 0.18448674800001186, "outcome": "passed", "stderr": "2026-04-29 19:03:40.350 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:40.531 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024396699998874283, "outcome": "passed"}}, {"nodeid": "tests/test_rent_vs_buy.py::test_has_bedroom_selectbox", "lineno": 16, "outcome": "passed", "keywords": ["test_has_bedroom_selectbox", "test_rent_vs_buy.py", "tests", "dashboard", ""], "setup": {"duration": 0.006554465000021992, "outcome": "passed"}, "call": {"duration": 0.07448487999999998, "outcome": "passed", "stderr": "2026-04-29 19:03:40.542 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:40.612 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.000298528000001852, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_charts.py::test_build_cost_over_time_chart_returns_figure", "lineno": 10, "outcome": "passed", "keywords": ["test_build_cost_over_time_chart_returns_figure", "test_rentbuy_charts.py", "tests", "dashboard", ""], "setup": {"duration": 0.0068861160000039945, "outcome": "passed"}, "call": {"duration": 0.010841190000007828, "outcome": "passed"}, "teardown": {"duration": 0.0002180380000140758, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[125000-0]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[125000-0]", "parametrize", "pytestmark", "125000-0", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.007059460000022, "outcome": "passed"}, "call": {"duration": 0.00020498300000326708, "outcome": "passed"}, "teardown": {"duration": 0.00023880700001654986, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[250000-2500]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[250000-2500]", "parametrize", "pytestmark", "250000-2500", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006362416000001758, "outcome": "passed"}, "call": {"duration": 0.00017198200001189434, "outcome": "passed"}, "teardown": {"duration": 0.00023021000001222092, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[400000-10000]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[400000-10000]", "parametrize", "pytestmark", "400000-10000", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006097912000001315, "outcome": "passed"}, "call": {"duration": 0.00016197299999021197, "outcome": "passed"}, "teardown": {"duration": 0.00022699400000192327, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[500000-15000]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[500000-15000]", "parametrize", "pytestmark", "500000-15000", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059422109999900385, "outcome": "passed"}, "call": {"duration": 0.00015488899998672423, "outcome": "passed"}, "teardown": {"duration": 0.00019298099999787155, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[925000-36250]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[925000-36250]", "parametrize", "pytestmark", "925000-36250", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005942240999985415, "outcome": "passed"}, "call": {"duration": 0.0001599089999899661, "outcome": "passed"}, "teardown": {"duration": 0.00020837899998582543, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[1000000-43750]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[1000000-43750]", "parametrize", "pytestmark", "1000000-43750", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006658360000017183, "outcome": "passed"}, "call": {"duration": 0.00018534599999497914, "outcome": "passed"}, "teardown": {"duration": 0.0002523719999771856, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[1500000-93750]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[1500000-93750]", "parametrize", "pytestmark", "1500000-93750", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061641149999900335, "outcome": "passed"}, "call": {"duration": 0.00016382600000497405, "outcome": "passed"}, "teardown": {"duration": 0.0002049229999840918, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[2000000-153750]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[2000000-153750]", "parametrize", "pytestmark", "2000000-153750", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059330730000226595, "outcome": "passed"}, "call": {"duration": 0.00015518999998676009, "outcome": "passed"}, "teardown": {"duration": 0.0001949650000199199, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[300000-0]", "lineno": 47, "outcome": "passed", "keywords": ["test_sdlt_first_time_buyer[300000-0]", "parametrize", "pytestmark", "300000-0", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059249679999879845, "outcome": "passed"}, "call": {"duration": 0.00014480100000469065, "outcome": "passed"}, "teardown": {"duration": 0.00019344200001114586, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[400000-5000]", "lineno": 47, "outcome": "passed", "keywords": ["test_sdlt_first_time_buyer[400000-5000]", "parametrize", "pytestmark", "400000-5000", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.008037828999988506, "outcome": "passed"}, "call": {"duration": 0.00018190000000117834, "outcome": "passed"}, "teardown": {"duration": 0.00021355900000230577, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[500000-10000]", "lineno": 47, "outcome": "passed", "keywords": ["test_sdlt_first_time_buyer[500000-10000]", "parametrize", "pytestmark", "500000-10000", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006456622999991168, "outcome": "passed"}, "call": {"duration": 0.00018057799999837698, "outcome": "passed"}, "teardown": {"duration": 0.00021442100000967912, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_ftb_above_cap_uses_standard", "lineno": 52, "outcome": "passed", "keywords": ["test_sdlt_ftb_above_cap_uses_standard", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005895742999996401, "outcome": "passed"}, "call": {"duration": 0.0001436180000098375, "outcome": "passed"}, "teardown": {"duration": 0.00018616799999904288, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_standard_case", "lineno": 61, "outcome": "passed", "keywords": ["test_mortgage_payment_standard_case", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005924536999998509, "outcome": "passed"}, "call": {"duration": 0.00016742299999350507, "outcome": "passed"}, "teardown": {"duration": 0.00019237999998722444, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_zero_interest", "lineno": 67, "outcome": "passed", "keywords": ["test_mortgage_payment_zero_interest", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006077183000002151, "outcome": "passed"}, "call": {"duration": 0.00015578200000732068, "outcome": "passed"}, "teardown": {"duration": 0.0002109339999947224, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_scales_with_principal", "lineno": 73, "outcome": "passed", "keywords": ["test_mortgage_payment_scales_with_principal", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005907737000001134, "outcome": "passed"}, "call": {"duration": 0.0001405319999889798, "outcome": "passed"}, "teardown": {"duration": 0.0002106839999953536, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_at_start_equals_principal", "lineno": 80, "outcome": "passed", "keywords": ["test_remaining_balance_at_start_equals_principal", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005973780000005036, "outcome": "passed"}, "call": {"duration": 0.00013367900001526323, "outcome": "passed"}, "teardown": {"duration": 0.0001831519999768716, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_partial_term", "lineno": 84, "outcome": "passed", "keywords": ["test_remaining_balance_partial_term", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005829248999987158, "outcome": "passed"}, "call": {"duration": 0.00014127399998642431, "outcome": "passed"}, "teardown": {"duration": 0.00018945400000802692, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_at_end_is_zero", "lineno": 90, "outcome": "passed", "keywords": ["test_remaining_balance_at_end_is_zero", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005935388000011699, "outcome": "passed"}, "call": {"duration": 0.00013443099999221886, "outcome": "passed"}, "teardown": {"duration": 0.00021405000001095686, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_zero_interest", "lineno": 95, "outcome": "passed", "keywords": ["test_remaining_balance_zero_interest", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005696472000010999, "outcome": "passed"}, "call": {"duration": 0.0001665820000198437, "outcome": "passed"}, "teardown": {"duration": 0.00018194999998399908, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_60", "lineno": 121, "outcome": "passed", "keywords": ["test_suggest_rate_ltv_60", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006011160000014115, "outcome": "passed"}, "call": {"duration": 0.0008415839999997843, "outcome": "passed"}, "teardown": {"duration": 0.00019365199997878335, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_75", "lineno": 125, "outcome": "passed", "keywords": ["test_suggest_rate_ltv_75", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.007408182000006036, "outcome": "passed"}, "call": {"duration": 0.0008943619999968178, "outcome": "passed"}, "teardown": {"duration": 0.00019332200000121702, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_95", "lineno": 129, "outcome": "passed", "keywords": ["test_suggest_rate_ltv_95", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005872631000016781, "outcome": "passed"}, "call": {"duration": 0.0008577440000010483, "outcome": "passed"}, "teardown": {"duration": 0.00019131799999172472, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_above_top_bracket", "lineno": 133, "outcome": "passed", "keywords": ["test_suggest_rate_above_top_bracket", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059183759999825725, "outcome": "passed"}, "call": {"duration": 0.0009441050000020823, "outcome": "passed"}, "teardown": {"duration": 0.0001908570000068721, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_bracket_boundary_rounds_up", "lineno": 138, "outcome": "passed", "keywords": ["test_suggest_rate_bracket_boundary_rounds_up", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005997904999986758, "outcome": "passed"}, "call": {"duration": 0.0007672039999988556, "outcome": "passed"}, "teardown": {"duration": 0.00019086700001480494, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_buying_returns_expected_keys", "lineno": 186, "outcome": "passed", "keywords": ["test_total_cost_of_buying_returns_expected_keys", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059825660000001335, "outcome": "passed"}, "call": {"duration": 0.0001652489999912632, "outcome": "passed"}, "teardown": {"duration": 0.0001994330000059108, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_buying_upfront_includes_all_components", "lineno": 198, "outcome": "passed", "keywords": ["test_total_cost_of_buying_upfront_includes_all_components", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.00595464399998491, "outcome": "passed"}, "call": {"duration": 0.00017117000001576343, "outcome": "passed"}, "teardown": {"duration": 0.00018373399998949935, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_flat_includes_service_charge_and_ground_rent", "lineno": 208, "outcome": "passed", "keywords": ["test_total_cost_flat_includes_service_charge_and_ground_rent", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006070970999985548, "outcome": "passed"}, "call": {"duration": 0.00017458599998576574, "outcome": "passed"}, "teardown": {"duration": 0.00018622799998979644, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_house_ignores_service_charge_even_if_set", "lineno": 216, "outcome": "passed", "keywords": ["test_total_cost_house_ignores_service_charge_even_if_set", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005917544999988422, "outcome": "passed"}, "call": {"duration": 0.0001814289999799712, "outcome": "passed"}, "teardown": {"duration": 0.00018586699999900702, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_auto_tier_rate_uses_boe_lookup", "lineno": 223, "outcome": "passed", "keywords": ["test_total_cost_auto_tier_rate_uses_boe_lookup", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006050283000007539, "outcome": "passed"}, "call": {"duration": 0.0008595380000144814, "outcome": "passed"}, "teardown": {"duration": 0.00018692000000442022, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_equity_at_sale_positive", "lineno": 229, "outcome": "passed", "keywords": ["test_total_cost_equity_at_sale_positive", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0058975869999926545, "outcome": "passed"}, "call": {"duration": 0.00018193100001440143, "outcome": "passed"}, "teardown": {"duration": 0.0001857170000221231, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_includes_remortgage_fees_with_frictions", "lineno": 235, "outcome": "passed", "keywords": ["test_total_cost_includes_remortgage_fees_with_frictions", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.007689798000001247, "outcome": "passed"}, "call": {"duration": 0.00016829500000881126, "outcome": "passed"}, "teardown": {"duration": 0.00019098699999631208, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_no_remortgage_fees_without_frictions", "lineno": 243, "outcome": "passed", "keywords": ["test_total_cost_no_remortgage_fees_without_frictions", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005971795999982987, "outcome": "passed"}, "call": {"duration": 0.00015945800001304633, "outcome": "passed"}, "teardown": {"duration": 0.00018608800002084536, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_no_remortgage_when_plan_shorter_than_fix", "lineno": 250, "outcome": "passed", "keywords": ["test_total_cost_no_remortgage_when_plan_shorter_than_fix", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006056775000018888, "outcome": "passed"}, "call": {"duration": 0.00015844600000036735, "outcome": "passed"}, "teardown": {"duration": 0.00018674899999382433, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_cash_rich_buyer_gets_investment_income", "lineno": 258, "outcome": "passed", "keywords": ["test_cash_rich_buyer_gets_investment_income", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005963469999983317, "outcome": "passed"}, "call": {"duration": 0.00017120000001114022, "outcome": "passed"}, "teardown": {"duration": 0.00019248899999979585, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_isa_toggle_increases_investment_income", "lineno": 265, "outcome": "passed", "keywords": ["test_isa_toggle_increases_investment_income", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006006670999994412, "outcome": "passed"}, "call": {"duration": 0.00017182199999865588, "outcome": "passed"}, "teardown": {"duration": 0.00021521200000051977, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_renting_returns_expected_keys", "lineno": 277, "outcome": "passed", "keywords": ["test_total_cost_of_renting_returns_expected_keys", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005953742000002649, "outcome": "passed"}, "call": {"duration": 0.00016735299999481867, "outcome": "passed"}, "teardown": {"duration": 0.0001893740000014077, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_zero_rent_growth_total_is_simple_product", "lineno": 289, "outcome": "passed", "keywords": ["test_zero_rent_growth_total_is_simple_product", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005720536000012544, "outcome": "passed"}, "call": {"duration": 0.00019520499998293417, "outcome": "passed"}, "teardown": {"duration": 0.00018560699999170538, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_rent_growth_compounds", "lineno": 295, "outcome": "passed", "keywords": ["test_rent_growth_compounds", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005711889999986397, "outcome": "passed"}, "call": {"duration": 0.0001661299999966559, "outcome": "passed"}, "teardown": {"duration": 0.00018270199998937642, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_multiple_moves_with_long_term_frictions", "lineno": 301, "outcome": "passed", "keywords": ["test_multiple_moves_with_long_term_frictions", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.00579662900000244, "outcome": "passed"}, "call": {"duration": 0.00019010500000149477, "outcome": "passed"}, "teardown": {"duration": 0.00018310200002247257, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_single_move_without_long_term_frictions", "lineno": 312, "outcome": "passed", "keywords": ["test_single_move_without_long_term_frictions", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005751273000015544, "outcome": "passed"}, "call": {"duration": 0.0001665120000211573, "outcome": "passed"}, "teardown": {"duration": 0.00020592499998883795, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_rent_opportunity_cost_greater_for_cash_rich", "lineno": 322, "outcome": "passed", "keywords": ["test_rent_opportunity_cost_greater_for_cash_rich", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0073089859999981854, "outcome": "passed"}, "call": {"duration": 0.000156703000016023, "outcome": "passed"}, "teardown": {"duration": 0.00020934100001568368, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_breakeven_rent_positive", "lineno": 329, "outcome": "passed", "keywords": ["test_breakeven_rent_positive", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006016339000012749, "outcome": "passed"}, "call": {"duration": 0.00017736199998807933, "outcome": "passed"}, "teardown": {"duration": 0.00018535600000291197, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_breakeven_rent_decreases_with_longer_stay", "lineno": 335, "outcome": "passed", "keywords": ["test_breakeven_rent_decreases_with_longer_stay", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.00595582600001876, "outcome": "passed"}, "call": {"duration": 0.0001957059999995181, "outcome": "passed"}, "teardown": {"duration": 0.0001870189999806371, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_scenario_accepts_bedrooms_field", "lineno": 342, "outcome": "passed", "keywords": ["test_scenario_accepts_bedrooms_field", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005689237000012781, "outcome": "passed"}, "call": {"duration": 0.00013789799999130992, "outcome": "passed"}, "teardown": {"duration": 0.00020885000000703258, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_district_to_borough_schema", "lineno": 18, "outcome": "passed", "keywords": ["test_load_district_to_borough_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056941759999915575, "outcome": "passed"}, "call": {"duration": 0.0011118480000220643, "outcome": "passed"}, "teardown": {"duration": 0.00018289299998741626, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_borough_rents_schema", "lineno": 24, "outcome": "passed", "keywords": ["test_load_borough_rents_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005671775999985584, "outcome": "passed"}, "call": {"duration": 0.0009839900000088164, "outcome": "passed"}, "teardown": {"duration": 0.00018616799999904288, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_borough_rents_by_bedroom_schema", "lineno": 30, "outcome": "passed", "keywords": ["test_load_borough_rents_by_bedroom_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.0058095729999934065, "outcome": "passed"}, "call": {"duration": 0.00098715599997945, "outcome": "passed"}, "teardown": {"duration": 0.00018784100001312254, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_council_tax_schema", "lineno": 40, "outcome": "passed", "keywords": ["test_load_council_tax_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056976529999985814, "outcome": "passed"}, "call": {"duration": 0.000960175000017216, "outcome": "passed"}, "teardown": {"duration": 0.00019410299998412484, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_boe_rates_schema", "lineno": 47, "outcome": "passed", "keywords": ["test_load_boe_rates_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005770809999972926, "outcome": "passed"}, "call": {"duration": 0.0008557999999823096, "outcome": "passed"}, "teardown": {"duration": 0.00018760000000384025, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_known_borough", "lineno": 53, "outcome": "passed", "keywords": ["test_default_monthly_rent_known_borough", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005767323000014812, "outcome": "passed"}, "call": {"duration": 0.0026546940000002905, "outcome": "passed"}, "teardown": {"duration": 0.00019234999999184765, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_missing_borough_returns_fallback", "lineno": 60, "outcome": "passed", "keywords": ["test_default_monthly_rent_missing_borough_returns_fallback", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.007379899000000023, "outcome": "passed"}, "call": {"duration": 0.00276240499999858, "outcome": "passed"}, "teardown": {"duration": 0.00018931400001065413, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_with_bedroom_known_borough", "lineno": 69, "outcome": "passed", "keywords": ["test_default_monthly_rent_with_bedroom_known_borough", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005824219999993829, "outcome": "passed"}, "call": {"duration": 0.002469537999985505, "outcome": "passed"}, "teardown": {"duration": 0.00019865199999458127, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_with_bedroom_studio_smaller_than_2bed", "lineno": 81, "outcome": "passed", "keywords": ["test_default_monthly_rent_with_bedroom_studio_smaller_than_2bed", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005784235000021454, "outcome": "passed"}, "call": {"duration": 0.0028235989999814137, "outcome": "passed"}, "teardown": {"duration": 0.00018906400001128532, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_falls_back_to_single_median_when_borough_missing", "lineno": 94, "outcome": "passed", "keywords": ["test_default_monthly_rent_falls_back_to_single_median_when_borough_missing", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.0057297529999971175, "outcome": "passed"}, "call": {"duration": 0.0026780970000004345, "outcome": "passed"}, "teardown": {"duration": 0.00018940399999678448, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_council_tax_known_borough", "lineno": 108, "outcome": "passed", "keywords": ["test_default_council_tax_known_borough", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005725694999995312, "outcome": "passed"}, "call": {"duration": 0.0016237959999898521, "outcome": "passed"}, "teardown": {"duration": 0.0001864179999984117, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_council_tax_missing_borough_returns_fallback", "lineno": 114, "outcome": "passed", "keywords": ["test_default_council_tax_missing_borough_returns_fallback", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005659252000015158, "outcome": "passed"}, "call": {"duration": 0.00145400899998549, "outcome": "passed"}, "teardown": {"duration": 0.00018931400001065413, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_lookup_boe_rate", "lineno": 120, "outcome": "passed", "keywords": ["test_lookup_boe_rate", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005753076999980067, "outcome": "passed"}, "call": {"duration": 0.001560377999993534, "outcome": "passed"}, "teardown": {"duration": 0.00018820100001448736, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_with_postcode_and_property_type", "lineno": 126, "outcome": "passed", "keywords": ["test_default_home_price_with_postcode_and_property_type", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.0057169300000055046, "outcome": "passed"}, "call": {"duration": 0.05747521500001085, "outcome": "passed"}, "teardown": {"duration": 0.00023739400000977184, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_falls_back_to_london_median", "lineno": 135, "outcome": "passed", "keywords": ["test_default_home_price_falls_back_to_london_median", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.006036426999997957, "outcome": "passed"}, "call": {"duration": 0.04935821899999837, "outcome": "passed"}, "teardown": {"duration": 0.0002457900000081281, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_with_bedrooms_filters", "lineno": 145, "outcome": "passed", "keywords": ["test_default_home_price_with_bedrooms_filters", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.006008495000003222, "outcome": "passed"}, "call": {"duration": 0.08467154799998866, "outcome": "passed"}, "teardown": {"duration": 0.00027551499999844964, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_falls_back_when_borough_missing", "lineno": 165, "outcome": "passed", "keywords": ["test_default_home_price_falls_back_when_borough_missing", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.008022661000012477, "outcome": "passed"}, "call": {"duration": 0.06082405699999072, "outcome": "passed"}, "teardown": {"duration": 0.00023520999999959713, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_without_bedrooms_uses_legacy_chain", "lineno": 182, "outcome": "passed", "keywords": ["test_default_home_price_without_bedrooms_uses_legacy_chain", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005902697000010448, "outcome": "passed"}, "call": {"duration": 0.06389070000000174, "outcome": "passed"}, "teardown": {"duration": 0.00024739200000567507, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_returns_complete_result", "lineno": 10, "outcome": "passed", "keywords": ["test_run_scenario_returns_complete_result", "test_rentbuy_scenario.py", "tests", "dashboard", ""], "setup": {"duration": 0.006345353999989811, "outcome": "passed"}, "call": {"duration": 0.0003411980000009862, "outcome": "passed"}, "teardown": {"duration": 0.00018411400000672984, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_verdict_consistent_with_delta", "lineno": 22, "outcome": "passed", "keywords": ["test_run_scenario_verdict_consistent_with_delta", "test_rentbuy_scenario.py", "tests", "dashboard", ""], "setup": {"duration": 0.005999216999981627, "outcome": "passed"}, "call": {"duration": 0.0003141580000090016, "outcome": "passed"}, "teardown": {"duration": 0.0001856869999983246, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_feasibility_flag", "lineno": 31, "outcome": "passed", "keywords": ["test_run_scenario_feasibility_flag", "test_rentbuy_scenario.py", "tests", "dashboard", ""], "setup": {"duration": 0.006181829000013295, "outcome": "passed"}, "call": {"duration": 0.0006481220000011945, "outcome": "passed"}, "teardown": {"duration": 0.00021891000000096028, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.00582755700000348, "outcome": "passed"}, "call": {"duration": 0.036151895000017475, "outcome": "passed", "stderr": "2026-04-29 19:03:41.433 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.455 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002629720000015823, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.0066389440000023114, "outcome": "passed"}, "call": {"duration": 0.03408957999999984, "outcome": "passed", "stderr": "2026-04-29 19:03:41.477 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.498 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002549270000145043, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_top_level_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_top_level_tabs", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.0072655449999956545, "outcome": "passed"}, "call": {"duration": 0.03332837600001426, "outcome": "passed", "stderr": "2026-04-29 19:03:41.519 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.540 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002494370000079016, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064440790000048764, "outcome": "passed"}, "call": {"duration": 0.034644146000005094, "outcome": "passed", "stderr": "2026-04-29 19:03:41.560 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.582 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002414209999983541, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.006304147999998122, "outcome": "passed"}, "call": {"duration": 0.03499005399999078, "outcome": "passed", "stderr": "2026-04-29 19:03:41.602 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.623 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002919560000123056, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_monte_carlo_checkbox", "lineno": 38, "outcome": "passed", "keywords": ["test_has_monte_carlo_checkbox", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.006642429999999422, "outcome": "passed"}, "call": {"duration": 0.035542435999985855, "outcome": "passed", "stderr": "2026-04-29 19:03:41.644 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.666 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002885799999887695, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_metrics", "lineno": 44, "outcome": "passed", "keywords": ["test_has_metrics", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.006731316000013976, "outcome": "passed"}, "call": {"duration": 0.03548272399999064, "outcome": "passed", "stderr": "2026-04-29 19:03:41.687 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.710 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002728200000206016, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_switch_to_target_mode", "lineno": 48, "outcome": "passed", "keywords": ["test_switch_to_target_mode", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.006350483999995049, "outcome": "passed"}, "call": {"duration": 0.06770706599999698, "outcome": "passed", "stderr": "2026-04-29 19:03:41.730 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.752 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:41.786 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00029014300000085314, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_loads_without_error", "lineno": 20, "outcome": "passed", "keywords": ["test_loads_without_error", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006988597000002983, "outcome": "passed"}, "call": {"duration": 0.040117713000000776, "outcome": "passed", "stderr": "2026-04-29 19:03:41.805 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.830 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:41.832 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00033997500000282344, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_shows_title", "lineno": 25, "outcome": "passed", "keywords": ["test_shows_title", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006682796000006874, "outcome": "passed"}, "call": {"duration": 0.03156823399999098, "outcome": "passed", "stderr": "2026-04-29 19:03:41.853 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.869 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:41.870 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00022940900001344744, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_analyzer_radio", "lineno": 31, "outcome": "passed", "keywords": ["test_has_analyzer_radio", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006058117000009133, "outcome": "passed"}, "call": {"duration": 0.03013562700002126, "outcome": "passed", "stderr": "2026-04-29 19:03:41.892 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.907 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:41.908 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002421230000209107, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_headline_text_area", "lineno": 37, "outcome": "passed", "keywords": ["test_has_headline_text_area", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.0063624960000083775, "outcome": "passed"}, "call": {"duration": 0.0303747959999896, "outcome": "passed", "stderr": "2026-04-29 19:03:41.929 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.944 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:41.945 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00022655399999393921, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_reset_button", "lineno": 42, "outcome": "passed", "keywords": ["test_has_reset_button", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005951508000009653, "outcome": "passed"}, "call": {"duration": 0.03286060199999952, "outcome": "passed", "stderr": "2026-04-29 19:03:41.966 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:41.981 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:41.983 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00023605100000168022, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_textblob_mode", "lineno": 50, "outcome": "passed", "keywords": ["test_textblob_mode", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006213768999998592, "outcome": "passed"}, "call": {"duration": 0.30437158099999806, "outcome": "passed", "stderr": "2026-04-29 19:03:42.006 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:42.022 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:42.023 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:42.294 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:42.295 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002570409999975709, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006251579000007723, "outcome": "passed"}, "call": {"duration": 0.07705903400000125, "outcome": "passed", "stderr": "2026-04-29 19:03:42.317 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:42.376 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024590999998963525, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006350193999992371, "outcome": "passed"}, "call": {"duration": 0.07400375000000281, "outcome": "passed", "stderr": "2026-04-29 19:03:42.401 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:42.457 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002572909999969397, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_top_level_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_top_level_tabs", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006698534999998174, "outcome": "passed"}, "call": {"duration": 0.07501295700001265, "outcome": "passed", "stderr": "2026-04-29 19:03:42.483 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:42.539 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002344579999942198, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_ticker_text_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006295641000008345, "outcome": "passed"}, "call": {"duration": 0.07486441000000355, "outcome": "passed", "stderr": "2026-04-29 19:03:42.565 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:42.621 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002525319999904241, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006581556000014643, "outcome": "passed"}, "call": {"duration": 0.07617971900000953, "outcome": "passed", "stderr": "2026-04-29 19:03:42.648 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:42.704 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.000277127999993354, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_sma_checkbox", "lineno": 34, "outcome": "passed", "keywords": ["test_has_sma_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006424611999989338, "outcome": "passed"}, "call": {"duration": 0.07474977499998658, "outcome": "passed", "stderr": "2026-04-29 19:03:42.731 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:42.787 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002821779999919727, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_ema_checkbox", "lineno": 39, "outcome": "passed", "keywords": ["test_has_ema_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006899230000016132, "outcome": "passed"}, "call": {"duration": 0.0754383629999893, "outcome": "passed", "stderr": "2026-04-29 19:03:42.813 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:42.870 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024421700001653335, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_bollinger_checkbox", "lineno": 44, "outcome": "passed", "keywords": ["test_has_bollinger_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.00646843500001637, "outcome": "passed"}, "call": {"duration": 0.07444175000000541, "outcome": "passed", "stderr": "2026-04-29 19:03:42.896 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:42.952 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026176899999086345, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_rsi_checkbox", "lineno": 49, "outcome": "passed", "keywords": ["test_has_rsi_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.00635836899999731, "outcome": "passed"}, "call": {"duration": 0.07465699200000131, "outcome": "passed", "stderr": "2026-04-29 19:03:42.978 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.033 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025793199998247474, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_macd_checkbox", "lineno": 54, "outcome": "passed", "keywords": ["test_has_macd_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006353660000002037, "outcome": "passed"}, "call": {"duration": 0.07504453699999658, "outcome": "passed", "stderr": "2026-04-29 19:03:43.060 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.116 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00029137500001752414, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_sma_checked_by_default", "lineno": 59, "outcome": "passed", "keywords": ["test_sma_checked_by_default", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.0062750129999926685, "outcome": "passed"}, "call": {"duration": 0.07602718300000788, "outcome": "passed", "stderr": "2026-04-29 19:03:43.142 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.198 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002638329999911093, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_rsi_checked_by_default", "lineno": 64, "outcome": "passed", "keywords": ["test_rsi_checked_by_default", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006581324999984872, "outcome": "passed"}, "call": {"duration": 0.34157815400001823, "outcome": "passed", "stderr": "2026-04-29 19:03:43.225 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.281 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00023793500000124368, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_macd_checked_by_default", "lineno": 69, "outcome": "passed", "keywords": ["test_macd_checked_by_default", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006364320000017187, "outcome": "passed"}, "call": {"duration": 0.0820086470000092, "outcome": "passed", "stderr": "2026-04-29 19:03:43.574 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.633 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024341499999991356, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.006342259000007289, "outcome": "passed"}, "call": {"duration": 0.053878937000007454, "outcome": "passed", "stderr": "2026-04-29 19:03:43.663 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.699 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:43.704 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024319400000649694, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.006303045999999313, "outcome": "passed"}, "call": {"duration": 0.04662107100000412, "outcome": "passed", "stderr": "2026-04-29 19:03:43.724 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.754 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:43.759 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00023784499998669162, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_two_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.006508268999994016, "outcome": "passed"}, "call": {"duration": 0.04520679500001279, "outcome": "passed", "stderr": "2026-04-29 19:03:43.778 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.807 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:43.812 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024760299999115887, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_ticker_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.006556248000009646, "outcome": "passed"}, "call": {"duration": 0.04691247700000645, "outcome": "passed", "stderr": "2026-04-29 19:03:43.831 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.861 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:43.866 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025086899998427725, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.006404655000011417, "outcome": "passed"}, "call": {"duration": 0.047607093000010536, "outcome": "passed", "stderr": "2026-04-29 19:03:43.885 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.915 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:43.920 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003200980000030995, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_model_radio", "lineno": 33, "outcome": "passed", "keywords": ["test_has_model_radio", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.006636108000009244, "outcome": "passed"}, "call": {"duration": 0.05014513599999759, "outcome": "passed", "stderr": "2026-04-29 19:03:43.940 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:43.971 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:43.977 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025455600001578205, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_test_size_slider", "lineno": 38, "outcome": "passed", "keywords": ["test_has_test_size_slider", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.006711047999999664, "outcome": "passed"}, "call": {"duration": 0.04649953000000551, "outcome": "passed", "stderr": "2026-04-29 19:03:43.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:44.027 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:44.032 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00024400600000262784, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_random_forest_mode", "lineno": 43, "outcome": "passed", "keywords": ["test_random_forest_mode", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.006293526999996857, "outcome": "passed"}, "call": {"duration": 0.2106208719999927, "outcome": "passed", "stderr": "2026-04-29 19:03:44.052 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:44.080 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:44.085 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:44.245 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:44.250 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.000267159000003403, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064819890000080704, "outcome": "passed"}, "call": {"duration": 0.10193436399998745, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:44.270 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:44.330 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002896720000080677, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_shows_title", "lineno": 25, "outcome": "passed", "keywords": ["test_shows_title", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006387954000018681, "outcome": "passed"}, "call": {"duration": 0.09614648299998407, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:44.379 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:44.436 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00027034499998990213, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_expected_tabs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006498690999990231, "outcome": "passed"}, "call": {"duration": 0.0973143660000062, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:44.482 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:44.541 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002883090000125321, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_ticker_text_input", "lineno": 34, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.00690644400000906, "outcome": "passed"}, "call": {"duration": 0.0945193900000163, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:44.587 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:44.644 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026325199999632787, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_period_radio", "lineno": 40, "outcome": "passed", "keywords": ["test_has_period_radio", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006373507000006384, "outcome": "passed"}, "call": {"duration": 0.09984483700000624, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:44.689 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:44.746 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002713869999979579, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_weight_sliders", "lineno": 45, "outcome": "passed", "keywords": ["test_has_weight_sliders", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006528918000014983, "outcome": "passed"}, "call": {"duration": 0.09625663799999984, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:44.797 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:44.854 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00027559500000506887, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_scan_button", "lineno": 49, "outcome": "passed", "keywords": ["test_has_scan_button", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006540349000005108, "outcome": "passed"}, "call": {"duration": 0.10110395099999891, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:44.900 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:44.961 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003395450000027722, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_preset_buttons", "lineno": 54, "outcome": "passed", "keywords": ["test_has_preset_buttons", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006853634999998803, "outcome": "passed"}, "call": {"duration": 0.10300397899999325, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:45.009 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.071 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002549269999860826, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_equal_weight_button", "lineno": 61, "outcome": "passed", "keywords": ["test_has_equal_weight_button", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006692113000013933, "outcome": "passed"}, "call": {"duration": 0.09989840800000138, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:45.120 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.180 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003278629999954319, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_run_checks_button", "lineno": 66, "outcome": "skipped", "keywords": ["test_has_run_checks_button", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.007327321000019538, "outcome": "passed"}, "call": {"duration": 0.09742073499998583, "outcome": "skipped", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), use_container_wid \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), use_cont \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-04-29 19:03:45.228 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.287 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n", "longrepr": "('/home/runner/work/QuantLab/QuantLab/dashboard/tests/test_stock_risk_scanner.py', 76, 'Skipped: Page crashed before rendering Run Checks tab')"}, "teardown": {"duration": 0.0003219919999821741, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006863933999994742, "outcome": "passed"}, "call": {"duration": 0.05453613999998197, "outcome": "passed", "stderr": "2026-04-29 19:03:45.334 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.373 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028747799998996015, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.0069246869999801675, "outcome": "passed"}, "call": {"duration": 0.05465224200000307, "outcome": "passed", "stderr": "2026-04-29 19:03:45.396 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.435 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003189360000135366, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_top_level_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_top_level_tabs", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.007694868000015731, "outcome": "passed"}, "call": {"duration": 0.05262159200000838, "outcome": "passed", "stderr": "2026-04-29 19:03:45.459 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.498 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00028258799997615824, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_ticker_text_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.0076864119999981995, "outcome": "passed"}, "call": {"duration": 0.0543494509999789, "outcome": "passed", "stderr": "2026-04-29 19:03:45.521 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.561 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002998309999782123, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_ticker_default_value", "lineno": 29, "outcome": "passed", "keywords": ["test_ticker_default_value", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.007614528000004839, "outcome": "passed"}, "call": {"duration": 0.05504098399998725, "outcome": "passed", "stderr": "2026-04-29 19:03:45.584 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.625 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00033973499998296575, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_period_selectbox", "lineno": 34, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.007260303999998996, "outcome": "passed"}, "call": {"duration": 0.05337059100000374, "outcome": "passed", "stderr": "2026-04-29 19:03:45.647 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.686 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002746540000089226, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_metrics", "lineno": 39, "outcome": "passed", "keywords": ["test_has_metrics", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.007407650000004651, "outcome": "passed"}, "call": {"duration": 0.052982675999999174, "outcome": "passed", "stderr": "2026-04-29 19:03:45.709 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.747 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002906529999791019, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_error_on_empty_data", "lineno": 43, "outcome": "passed", "keywords": ["test_error_on_empty_data", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.009754968999999392, "outcome": "passed", "stderr": "2026-04-29 19:03:45.769 No runtime found, using MemoryCacheStorageManager\n"}, "call": {"duration": 0.009923263999979781, "outcome": "passed", "stderr": "2026-04-29 19:03:45.772 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00025402600002166764, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.006441975000001321, "outcome": "passed"}, "call": {"duration": 0.17743973099999266, "outcome": "passed", "stderr": "2026-04-29 19:03:45.789 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:45.948 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:45.956 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002723700000046847, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_shows_title", "lineno": 17, "outcome": "passed", "keywords": ["test_shows_title", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.0067372119999902225, "outcome": "passed"}, "call": {"duration": 0.05464238600001181, "outcome": "passed", "stderr": "2026-04-29 19:03:45.975 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.010 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:46.018 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00029903899999794703, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_ticker_input", "lineno": 22, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.0073660179999990305, "outcome": "passed"}, "call": {"duration": 0.057713673999984394, "outcome": "passed", "stderr": "2026-04-29 19:03:46.038 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.076 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:46.084 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00025663999997505016, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_period_selectbox", "lineno": 27, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.006725378999988152, "outcome": "passed"}, "call": {"duration": 0.05796032700001774, "outcome": "passed", "stderr": "2026-04-29 19:03:46.103 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.142 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:46.150 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00026140900001792033, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_loads_data_successfully", "lineno": 31, "outcome": "passed", "keywords": ["test_loads_data_successfully", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064605750000055195, "outcome": "passed"}, "call": {"duration": 0.05578783199999293, "outcome": "passed", "stderr": "2026-04-29 19:03:46.168 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.206 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:46.214 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002658669999959784, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_tabs", "lineno": 36, "outcome": "passed", "keywords": ["test_has_tabs", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064678180000043994, "outcome": "passed"}, "call": {"duration": 0.05687991000002057, "outcome": "passed", "stderr": "2026-04-29 19:03:46.231 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.269 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n2026-04-29 19:03:46.277 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002488849999906506, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064008329999865055, "outcome": "passed"}, "call": {"duration": 0.033975725000004786, "outcome": "passed", "stderr": "2026-04-29 19:03:46.295 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.320 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002765570000065054, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.006593863000006195, "outcome": "passed"}, "call": {"duration": 0.033382795000022725, "outcome": "passed", "stderr": "2026-04-29 19:03:46.337 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.360 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.00023717400000577982, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_ticker_input", "lineno": 20, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.006388018999984979, "outcome": "passed"}, "call": {"duration": 0.032302630000003774, "outcome": "passed", "stderr": "2026-04-29 19:03:46.377 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.400 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003018350000161263, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_period_selectbox", "lineno": 25, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.006329308000005085, "outcome": "passed"}, "call": {"duration": 0.29987098000000856, "outcome": "passed", "stderr": "2026-04-29 19:03:46.417 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.441 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0002334769999947639, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_confidence_slider", "lineno": 29, "outcome": "passed", "keywords": ["test_has_confidence_slider", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061846579999951246, "outcome": "passed"}, "call": {"duration": 0.033902608999994754, "outcome": "passed", "stderr": "2026-04-29 19:03:46.724 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-04-29 19:03:46.747 Please replace `use_container_width` with `width`.\n\n`use_container_width` will be removed after 2025-12-31.\n\nFor `use_container_width=True`, use `width='stretch'`. For `use_container_width=False`, use `width='content'`.\n"}, "teardown": {"duration": 0.0003469289999884495, "outcome": "passed"}}], "warnings": [{"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "*choropleth_mapbox* is deprecated! Use *choropleth_map* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/home/runner/work/QuantLab/QuantLab/dashboard/pages/42_London_House_Prices.py", "lineno": 92}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 1049}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 2551}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/_plotly_utils/basevalidators.py", "lineno": 2669}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 2578}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/_plotly_utils/basevalidators.py", "lineno": 2669}, {"message": "*choropleth_mapbox* is deprecated! Use *choropleth_map* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/home/runner/work/QuantLab/QuantLab/dashboard/pages/42_London_House_Prices.py", "lineno": 92}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 1049}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 2551}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/_plotly_utils/basevalidators.py", "lineno": 2669}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 2578}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/_plotly_utils/basevalidators.py", "lineno": 2669}]} \ No newline at end of file +{"created": 1778148022.927784, "duration": 49.975932121276855, "exitcode": 0, "root": "/home/runner/work/QuantLab/QuantLab/dashboard", "environment": {}, "summary": {"passed": 431, "skipped": 3, "total": 434, "collected": 434}, "collectors": [{"nodeid": "", "outcome": "passed", "result": [{"nodeid": "tests", "type": "Package"}]}, {"nodeid": "tests/fixtures", "outcome": "passed", "result": []}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading", "outcome": "passed", "result": [{"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_two_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_ticker_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_strategy_radio", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_sma_sliders", "type": "Function", "lineno": 38}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_momentum_mode", "type": "Function", "lineno": 46}]}, {"nodeid": "tests/test_algo_trading.py", "outcome": "passed", "result": [{"nodeid": "tests/test_algo_trading.py::TestAlgoTrading", "type": "Class"}]}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection", "outcome": "passed", "result": [{"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_ticker_input", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_period_selectbox", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_method_radio", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_threshold_slider", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_isolation_forest_mode", "type": "Function", "lineno": 39}]}, {"nodeid": "tests/test_anomaly_detection.py", "outcome": "passed", "result": [{"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection", "type": "Class"}]}, {"nodeid": "tests/test_app.py::TestLandingPage", "outcome": "passed", "result": [{"nodeid": "tests/test_app.py::TestLandingPage::test_loads_without_error", "type": "Function", "lineno": 7}, {"nodeid": "tests/test_app.py::TestLandingPage::test_shows_title", "type": "Function", "lineno": 12}]}, {"nodeid": "tests/test_app.py::TestScannerPage", "outcome": "passed", "result": [{"nodeid": "tests/test_app.py::TestScannerPage::test_loads_without_error", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_app.py::TestScannerPage::test_shows_title", "type": "Function", "lineno": 40}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_three_tabs", "type": "Function", "lineno": 45}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_scan_button", "type": "Function", "lineno": 49}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_preset_buttons", "type": "Function", "lineno": 54}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_equal_weight_button", "type": "Function", "lineno": 61}]}, {"nodeid": "tests/test_app.py", "outcome": "passed", "result": [{"nodeid": "tests/test_app.py::TestLandingPage", "type": "Class"}, {"nodeid": "tests/test_app.py::TestScannerPage", "type": "Class"}]}, {"nodeid": "tests/test_benchmark_datasets.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_datasets.py::test_presets_has_small_and_large_keys", "type": "Function", "lineno": 9}, {"nodeid": "tests/test_benchmark_datasets.py::test_preset_entries_have_required_fields", "type": "Function", "lineno": 13}, {"nodeid": "tests/test_benchmark_datasets.py::test_get_available_presets_filters_missing_files", "type": "Function", "lineno": 21}]}, {"nodeid": "tests/test_benchmark_engines.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_engines.py::test_ops_constant_has_seven_entries", "type": "Function", "lineno": 41}, {"nodeid": "tests/test_benchmark_engines.py::test_default_column_config_resolves", "type": "Function", "lineno": 48}, {"nodeid": "tests/test_benchmark_engines.py::test_read_parity", "type": "Function", "lineno": 55}, {"nodeid": "tests/test_benchmark_engines.py::test_count_parity", "type": "Function", "lineno": 61}, {"nodeid": "tests/test_benchmark_engines.py::test_filter_parity", "type": "Function", "lineno": 67}, {"nodeid": "tests/test_benchmark_engines.py::test_groupby_parity", "type": "Function", "lineno": 77}, {"nodeid": "tests/test_benchmark_engines.py::test_sort_parity", "type": "Function", "lineno": 86}, {"nodeid": "tests/test_benchmark_engines.py::test_regex_parity", "type": "Function", "lineno": 95}, {"nodeid": "tests/test_benchmark_engines.py::test_write_parity", "type": "Function", "lineno": 105}]}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_top_level_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_currency_selectbox", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_notional_input", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_fixed_rate_input", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_position_radio", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_rate_selectbox", "type": "Function", "lineno": 43}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_period_selectbox", "type": "Function", "lineno": 48}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_metrics", "type": "Function", "lineno": 53}]}, {"nodeid": "tests/test_benchmark_rates.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates", "type": "Class"}]}, {"nodeid": "tests/test_benchmark_report.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_report.py::test_build_overview_chart_returns_figure", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_dataframe_result", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_scalar_result", "type": "Function", "lineno": 58}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_write_result", "type": "Function", "lineno": 64}]}, {"nodeid": "tests/test_benchmark_runner.py", "outcome": "passed", "result": [{"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_returns_seven_results", "type": "Function", "lineno": 7}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_correctness_flags_set", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_bad_column_captures_error", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_benchmark_runner.py::test_result_preview_shapes", "type": "Function", "lineno": 49}]}, {"nodeid": "tests/test_bigo_algorithms.py", "outcome": "passed", "result": [{"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-0-0]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-1-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-2-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-5-5]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-10-55]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-20-6765]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-25-75025]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-0-0]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-1-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-2-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-5-5]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-10-55]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-20-6765]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-25-75025]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-0-0]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-1-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-2-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-5-5]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-10-55]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-20-6765]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-25-75025]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-0-0]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-1-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-2-1]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-5-5]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-10-55]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-20-6765]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-25-75025]", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr0-5-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr1-8-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr2-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr3-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr4-6-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr5-9-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr6-15-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr0-5-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr1-8-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr2-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr3-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr4-6-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr5-9-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr6-15-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr0-5-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr1-8-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr2-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr3-5-False]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr4-6-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr5-9-True]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr6-15-False]", "type": "Function", "lineno": 47}]}, {"nodeid": "tests/test_bigo_problems.py", "outcome": "passed", "result": [{"nodeid": "tests/test_bigo_problems.py::test_registry_has_seed_problems", "type": "Function", "lineno": 5}, {"nodeid": "tests/test_bigo_problems.py::test_input_factory_returns_tuple", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_bigo_problems.py::test_variant_big_o_labels_non_empty", "type": "Function", "lineno": 39}]}, {"nodeid": "tests/test_bigo_report.py", "outcome": "passed", "result": [{"nodeid": "tests/test_bigo_report.py::test_build_complexity_chart_returns_figure", "type": "Function", "lineno": 23}, {"nodeid": "tests/test_bigo_report.py::test_build_variant_card_shape", "type": "Function", "lineno": 33}]}, {"nodeid": "tests/test_bigo_runner.py", "outcome": "passed", "result": [{"nodeid": "tests/test_bigo_runner.py::test_run_problem_returns_expected_structure", "type": "Function", "lineno": 10}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_skips_past_budget", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_correctness_check", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_captures_exception", "type": "Function", "lineno": 57}]}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker", "outcome": "passed", "result": [{"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_income_number_input", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_data_editor", "type": "Function", "lineno": 36}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_metrics", "type": "Function", "lineno": 42}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_shows_budget_status_message", "type": "Function", "lineno": 46}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_switch_to_plan_mode", "type": "Function", "lineno": 56}]}, {"nodeid": "tests/test_budget_tracker.py", "outcome": "passed", "result": [{"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker", "type": "Class"}]}, {"nodeid": "tests/test_churros.py::TestChurros", "outcome": "passed", "result": [{"nodeid": "tests/test_churros.py::TestChurros::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_churros.py::TestChurros::test_shows_title", "type": "Function", "lineno": 17}, {"nodeid": "tests/test_churros.py::TestChurros::test_has_password_form", "type": "Function", "lineno": 21}, {"nodeid": "tests/test_churros.py::TestChurros::test_has_form_submit", "type": "Function", "lineno": 32}]}, {"nodeid": "tests/test_churros.py", "outcome": "passed", "result": [{"nodeid": "tests/test_churros.py::TestChurros", "type": "Class"}]}, {"nodeid": "tests/test_clustering.py::TestClustering", "outcome": "passed", "result": [{"nodeid": "tests/test_clustering.py::TestClustering::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_clustering.py::TestClustering::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_two_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_data_source_radio", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_algorithm_radio", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_clusters_slider", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_clustering.py::TestClustering::test_custom_data_mode", "type": "Function", "lineno": 39}]}, {"nodeid": "tests/test_clustering.py", "outcome": "passed", "result": [{"nodeid": "tests/test_clustering.py::TestClustering", "type": "Class"}]}, {"nodeid": "tests/test_contagion_constants.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_constants.py::test_periods_cover_expected_date_ranges", "type": "Function", "lineno": 6}, {"nodeid": "tests/test_contagion_constants.py::test_every_ticker_has_a_role", "type": "Function", "lineno": 14}, {"nodeid": "tests/test_contagion_constants.py::test_destination_cities_include_all_five", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_contagion_constants.py::test_epicenter_origin_is_strait_of_hormuz", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_contagion_constants.py::test_every_destination_city_has_a_ticker_in_roles", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_contagion_constants.py::test_correlation_window_is_positive_int", "type": "Function", "lineno": 39}]}, {"nodeid": "tests/test_contagion_correlations.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_of_identical_series_is_one", "type": "Function", "lineno": 8}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_of_opposite_series_is_negative_one", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_output_bounded", "type": "Function", "lineno": 22}, {"nodeid": "tests/test_contagion_correlations.py::test_middle_east_index_averages_epicenter_tickers", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_window_larger_than_series_is_all_nan", "type": "Function", "lineno": 46}, {"nodeid": "tests/test_contagion_correlations.py::test_middle_east_index_empty_when_no_epicenter_rows", "type": "Function", "lineno": 53}]}, {"nodeid": "tests/test_contagion_data_quality.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_data_quality.py::test_both_periods_present", "type": "Function", "lineno": 40}, {"nodeid": "tests/test_contagion_data_quality.py::test_all_asset_roles_present", "type": "Function", "lineno": 46}, {"nodeid": "tests/test_contagion_data_quality.py::test_core_tickers_present_in_both_periods", "type": "Function", "lineno": 52}, {"nodeid": "tests/test_contagion_data_quality.py::test_minimum_row_counts_per_ticker[2020_us_iran-30-3]", "type": "Function", "lineno": 59}, {"nodeid": "tests/test_contagion_data_quality.py::test_minimum_row_counts_per_ticker[2024_hormuz-200-12]", "type": "Function", "lineno": 59}, {"nodeid": "tests/test_contagion_data_quality.py::test_no_na_in_close_column", "type": "Function", "lineno": 79}, {"nodeid": "tests/test_contagion_data_quality.py::test_close_values_are_positive", "type": "Function", "lineno": 83}]}, {"nodeid": "tests/test_contagion_globe.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_red_at_plus_one", "type": "Function", "lineno": 6}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_green_at_minus_one", "type": "Function", "lineno": 12}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_gray_at_zero", "type": "Function", "lineno": 18}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_clips_out_of_range", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_contagion_globe.py::test_build_arc_layer_returns_one_arc_per_destination", "type": "Function", "lineno": 29}]}, {"nodeid": "tests/test_contagion_loader.py", "outcome": "passed", "result": [{"nodeid": "tests/test_contagion_loader.py::test_load_events_returns_all_rows_when_no_period", "type": "Function", "lineno": 23}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_filters_by_period", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_raises_when_file_missing", "type": "Function", "lineno": 38}]}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator", "outcome": "passed", "result": [{"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_default_mode_shows_payment_input", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_metrics", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_switch_to_target_mode", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_credit_card_calculator.py", "outcome": "passed", "result": [{"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator", "type": "Class"}]}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio", "outcome": "passed", "result": [{"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_data_editor", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_metrics", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_metric_labels", "type": "Function", "lineno": 37}]}, {"nodeid": "tests/test_crypto_portfolio.py", "outcome": "passed", "result": [{"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio", "type": "Class"}]}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard", "outcome": "passed", "result": [{"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_base_currency_selectbox", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_base_currency_options", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_target_multiselect", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_amount_number_input", "type": "Function", "lineno": 36}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_expected_tabs_with_targets", "type": "Function", "lineno": 41}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_shows_metrics_for_targets", "type": "Function", "lineno": 46}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_error_on_fetch_failure", "type": "Function", "lineno": 51}]}, {"nodeid": "tests/test_currency_dashboard.py", "outcome": "passed", "result": [{"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard", "type": "Class"}]}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker", "outcome": "passed", "result": [{"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_ticker_text_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_sector_multiselect", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_company_multiselect", "type": "Function", "lineno": 35}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_fallback_to_sample_scores", "type": "Function", "lineno": 41}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_warning_for_sample_data", "type": "Function", "lineno": 49}]}, {"nodeid": "tests/test_esg_tracker.py", "outcome": "passed", "result": [{"nodeid": "tests/test_esg_tracker.py::TestESGTracker", "type": "Class"}]}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting", "outcome": "passed", "result": [{"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_ticker_text_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_download_buttons", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_download_button_labels", "type": "Function", "lineno": 42}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_metrics", "type": "Function", "lineno": 49}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_metric_labels", "type": "Function", "lineno": 53}]}, {"nodeid": "tests/test_financial_reporting.py", "outcome": "passed", "result": [{"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting", "type": "Class"}]}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage", "outcome": "passed", "result": [{"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_loads_without_error", "type": "Function", "lineno": 10}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_shows_title", "type": "Function", "lineno": 14}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_period_radio", "type": "Function", "lineno": 19}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_timeline_slider", "type": "Function", "lineno": 27}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_play_button", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_side_panel_renders_four_metrics", "type": "Function", "lineno": 38}]}, {"nodeid": "tests/test_global_contagion.py", "outcome": "passed", "result": [{"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage", "type": "Class"}]}, {"nodeid": "tests/test_globe_arc.py", "outcome": "passed", "result": [{"nodeid": "tests/test_globe_arc.py::test_returns_one_row_per_destination", "type": "Function", "lineno": 13}, {"nodeid": "tests/test_globe_arc.py::test_row_keys_present", "type": "Function", "lineno": 18}, {"nodeid": "tests/test_globe_arc.py::test_missing_destination_uses_default", "type": "Function", "lineno": 28}, {"nodeid": "tests/test_globe_arc.py::test_extra_meta_forwarded", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_globe_arc.py::test_source_matches_input", "type": "Function", "lineno": 40}]}, {"nodeid": "tests/test_globe_color.py", "outcome": "passed", "result": [{"nodeid": "tests/test_globe_color.py::test_diverging_color_at_zero_is_zero_anchor", "type": "Function", "lineno": 4}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_pos_one_reaches_pos_anchor", "type": "Function", "lineno": 10}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_neg_one_reaches_neg_anchor", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_alpha_scales_with_magnitude", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_clamps_outside_range", "type": "Function", "lineno": 26}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_at_zero_is_low_anchor", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_at_one_is_high_anchor", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_clamps", "type": "Function", "lineno": 45}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_min_at_zero", "type": "Function", "lineno": 50}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_max_at_one", "type": "Function", "lineno": 54}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_uses_abs", "type": "Function", "lineno": 58}]}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner", "outcome": "passed", "result": [{"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_sliders", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_metrics", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_switch_to_goal_mode", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_investment_planner.py", "outcome": "passed", "result": [{"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner", "type": "Class"}]}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_default_mode_has_term_selectbox", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_metrics", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_switch_to_budget_mode", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_loan_amortization.py", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization", "type": "Class"}]}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_expected_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_selectbox_for_terms", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_metrics", "type": "Function", "lineno": 43}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_switch_to_rate_sensitivity_mode", "type": "Function", "lineno": 47}]}, {"nodeid": "tests/test_loan_comparison.py", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_comparison.py::TestLoanComparison", "type": "Class"}]}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_two_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_model_radio", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_test_size_slider", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_five_number_inputs", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_random_forest_mode", "type": "Function", "lineno": 41}]}, {"nodeid": "tests/test_loan_default.py", "outcome": "passed", "result": [{"nodeid": "tests/test_loan_default.py::TestLoanDefault", "type": "Class"}]}, {"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage", "outcome": "passed", "result": [{"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage::test_loads_without_error", "type": "Function", "lineno": 14}, {"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage::test_shows_title", "type": "Function", "lineno": 18}]}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers", "outcome": "passed", "result": [{"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_load_ppd_returns_dataframe", "type": "Function", "lineno": 43}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_aggregate_by_district_year", "type": "Function", "lineno": 50}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_aggregate_empty_district", "type": "Function", "lineno": 56}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_get_all_districts_summary", "type": "Function", "lineno": 61}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_query_overpass_returns_list", "type": "Function", "lineno": 67}]}, {"nodeid": "tests/test_london_house_prices.py", "outcome": "passed", "result": [{"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage", "type": "Class"}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers", "type": "Class"}]}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights", "outcome": "passed", "result": [{"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_loads_without_error", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_shows_title", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_two_tabs", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_ticker_input", "type": "Function", "lineno": 36}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_period_selectbox", "type": "Function", "lineno": 42}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_headline_text_area", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_reset_button", "type": "Function", "lineno": 52}]}, {"nodeid": "tests/test_market_insights.py", "outcome": "passed", "result": [{"nodeid": "tests/test_market_insights.py::TestMarketInsights", "type": "Class"}]}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance", "outcome": "passed", "result": [{"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_income_number_input", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_data_editors", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_expected_tabs", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_net_worth_metric", "type": "Function", "lineno": 38}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_savings_rate_metric", "type": "Function", "lineno": 43}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_no_external_api_calls", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_personal_finance.py", "outcome": "passed", "result": [{"nodeid": "tests/test_personal_finance.py::TestPersonalFinance", "type": "Class"}]}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_loads_without_error", "type": "Function", "lineno": 14}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_shows_title", "type": "Function", "lineno": 18}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_has_ticker_input", "type": "Function", "lineno": 23}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_has_period_selectbox", "type": "Function", "lineno": 28}]}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_line_chart_returns_figure", "type": "Function", "lineno": 52}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_candlestick_returns_figure", "type": "Function", "lineno": 59}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_volume_bar_returns_figure", "type": "Function", "lineno": 66}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_returns_histogram_returns_figure", "type": "Function", "lineno": 73}]}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_line_chart_returns_figure", "type": "Function", "lineno": 82}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_candlestick_returns_figure", "type": "Function", "lineno": 89}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_volume_bar_returns_figure", "type": "Function", "lineno": 96}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_returns_histogram_returns_figure", "type": "Function", "lineno": 102}]}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_line_chart_returns_chart", "type": "Function", "lineno": 110}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_candlestick_returns_chart", "type": "Function", "lineno": 117}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_volume_bar_returns_chart", "type": "Function", "lineno": 124}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_returns_histogram_returns_chart", "type": "Function", "lineno": 131}]}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_line_chart_returns_figure", "type": "Function", "lineno": 140}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_candlestick_returns_figure", "type": "Function", "lineno": 146}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_volume_bar_returns_figure", "type": "Function", "lineno": 152}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_returns_histogram_returns_figure", "type": "Function", "lineno": 158}]}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_no_outliers_in_clean_data", "type": "Function", "lineno": 166}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_detects_injected_outlier", "type": "Function", "lineno": 172}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_compute_daily_returns", "type": "Function", "lineno": 181}]}, {"nodeid": "tests/test_plotting_libraries.py", "outcome": "passed", "result": [{"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts", "type": "Class"}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection", "type": "Class"}]}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization", "outcome": "passed", "result": [{"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_multiselect_tickers", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_simulations_slider", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_risk_free_rate_input", "type": "Function", "lineno": 38}]}, {"nodeid": "tests/test_portfolio_optimization.py", "outcome": "passed", "result": [{"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization", "type": "Class"}]}, {"nodeid": "tests/test_rent_vs_buy.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rent_vs_buy.py::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_rent_vs_buy.py::test_has_bedroom_selectbox", "type": "Function", "lineno": 16}]}, {"nodeid": "tests/test_rentbuy_charts.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rentbuy_charts.py::test_build_cost_over_time_chart_returns_figure", "type": "Function", "lineno": 10}]}, {"nodeid": "tests/test_rentbuy_finance.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[125000-0]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[250000-2500]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[400000-10000]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[500000-15000]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[925000-36250]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[1000000-43750]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[1500000-93750]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[2000000-153750]", "type": "Function", "lineno": 32}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[300000-0]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[400000-5000]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[500000-10000]", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_ftb_above_cap_uses_standard", "type": "Function", "lineno": 52}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_standard_case", "type": "Function", "lineno": 61}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_zero_interest", "type": "Function", "lineno": 67}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_scales_with_principal", "type": "Function", "lineno": 73}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_at_start_equals_principal", "type": "Function", "lineno": 80}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_partial_term", "type": "Function", "lineno": 84}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_at_end_is_zero", "type": "Function", "lineno": 90}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_zero_interest", "type": "Function", "lineno": 95}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_60", "type": "Function", "lineno": 121}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_75", "type": "Function", "lineno": 125}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_95", "type": "Function", "lineno": 129}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_above_top_bracket", "type": "Function", "lineno": 133}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_bracket_boundary_rounds_up", "type": "Function", "lineno": 138}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_buying_returns_expected_keys", "type": "Function", "lineno": 186}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_buying_upfront_includes_all_components", "type": "Function", "lineno": 198}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_flat_includes_service_charge_and_ground_rent", "type": "Function", "lineno": 208}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_house_ignores_service_charge_even_if_set", "type": "Function", "lineno": 216}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_auto_tier_rate_uses_boe_lookup", "type": "Function", "lineno": 223}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_equity_at_sale_positive", "type": "Function", "lineno": 229}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_includes_remortgage_fees_with_frictions", "type": "Function", "lineno": 235}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_no_remortgage_fees_without_frictions", "type": "Function", "lineno": 243}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_no_remortgage_when_plan_shorter_than_fix", "type": "Function", "lineno": 250}, {"nodeid": "tests/test_rentbuy_finance.py::test_cash_rich_buyer_gets_investment_income", "type": "Function", "lineno": 258}, {"nodeid": "tests/test_rentbuy_finance.py::test_isa_toggle_increases_investment_income", "type": "Function", "lineno": 265}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_renting_returns_expected_keys", "type": "Function", "lineno": 277}, {"nodeid": "tests/test_rentbuy_finance.py::test_zero_rent_growth_total_is_simple_product", "type": "Function", "lineno": 289}, {"nodeid": "tests/test_rentbuy_finance.py::test_rent_growth_compounds", "type": "Function", "lineno": 295}, {"nodeid": "tests/test_rentbuy_finance.py::test_multiple_moves_with_long_term_frictions", "type": "Function", "lineno": 301}, {"nodeid": "tests/test_rentbuy_finance.py::test_single_move_without_long_term_frictions", "type": "Function", "lineno": 312}, {"nodeid": "tests/test_rentbuy_finance.py::test_rent_opportunity_cost_greater_for_cash_rich", "type": "Function", "lineno": 322}, {"nodeid": "tests/test_rentbuy_finance.py::test_breakeven_rent_positive", "type": "Function", "lineno": 329}, {"nodeid": "tests/test_rentbuy_finance.py::test_breakeven_rent_decreases_with_longer_stay", "type": "Function", "lineno": 335}, {"nodeid": "tests/test_rentbuy_finance.py::test_scenario_accepts_bedrooms_field", "type": "Function", "lineno": 342}]}, {"nodeid": "tests/test_rentbuy_inputs.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rentbuy_inputs.py::test_load_district_to_borough_schema", "type": "Function", "lineno": 18}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_borough_rents_schema", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_borough_rents_by_bedroom_schema", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_council_tax_schema", "type": "Function", "lineno": 40}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_boe_rates_schema", "type": "Function", "lineno": 47}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_known_borough", "type": "Function", "lineno": 53}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_missing_borough_returns_fallback", "type": "Function", "lineno": 60}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_with_bedroom_known_borough", "type": "Function", "lineno": 69}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_with_bedroom_studio_smaller_than_2bed", "type": "Function", "lineno": 81}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_falls_back_to_single_median_when_borough_missing", "type": "Function", "lineno": 94}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_council_tax_known_borough", "type": "Function", "lineno": 108}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_council_tax_missing_borough_returns_fallback", "type": "Function", "lineno": 114}, {"nodeid": "tests/test_rentbuy_inputs.py::test_lookup_boe_rate", "type": "Function", "lineno": 120}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_with_postcode_and_property_type", "type": "Function", "lineno": 126}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_falls_back_to_london_median", "type": "Function", "lineno": 135}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_with_bedrooms_filters", "type": "Function", "lineno": 145}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_falls_back_when_borough_missing", "type": "Function", "lineno": 165}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_without_bedrooms_uses_legacy_chain", "type": "Function", "lineno": 182}]}, {"nodeid": "tests/test_rentbuy_scenario.py", "outcome": "passed", "result": [{"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_returns_complete_result", "type": "Function", "lineno": 10}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_verdict_consistent_with_delta", "type": "Function", "lineno": 22}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_feasibility_flag", "type": "Function", "lineno": 31}]}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator", "outcome": "passed", "result": [{"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_top_level_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_radio_mode_selector", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_number_inputs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_monte_carlo_checkbox", "type": "Function", "lineno": 38}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_metrics", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_switch_to_target_mode", "type": "Function", "lineno": 48}]}, {"nodeid": "tests/test_retirement_calculator.py", "outcome": "passed", "result": [{"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator", "type": "Class"}]}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis", "outcome": "passed", "result": [{"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_loads_without_error", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_shows_title", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_analyzer_radio", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_headline_text_area", "type": "Function", "lineno": 37}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_reset_button", "type": "Function", "lineno": 42}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_textblob_mode", "type": "Function", "lineno": 50}]}, {"nodeid": "tests/test_sentiment_analysis.py", "outcome": "passed", "result": [{"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis", "type": "Class"}]}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_top_level_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_ticker_text_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_sma_checkbox", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_ema_checkbox", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_bollinger_checkbox", "type": "Function", "lineno": 44}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_rsi_checkbox", "type": "Function", "lineno": 49}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_macd_checkbox", "type": "Function", "lineno": 54}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_sma_checked_by_default", "type": "Function", "lineno": 59}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_rsi_checked_by_default", "type": "Function", "lineno": 64}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_macd_checked_by_default", "type": "Function", "lineno": 69}]}, {"nodeid": "tests/test_stock_analysis.py", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis", "type": "Class"}]}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_two_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_ticker_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_period_selectbox", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_model_radio", "type": "Function", "lineno": 33}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_test_size_slider", "type": "Function", "lineno": 38}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_random_forest_mode", "type": "Function", "lineno": 43}]}, {"nodeid": "tests/test_stock_prediction.py", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_prediction.py::TestStockPrediction", "type": "Class"}]}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_shows_title", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_expected_tabs", "type": "Function", "lineno": 30}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_ticker_text_input", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_period_radio", "type": "Function", "lineno": 40}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_weight_sliders", "type": "Function", "lineno": 45}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_scan_button", "type": "Function", "lineno": 49}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_preset_buttons", "type": "Function", "lineno": 54}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_equal_weight_button", "type": "Function", "lineno": 61}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_run_checks_button", "type": "Function", "lineno": 66}]}, {"nodeid": "tests/test_stock_risk_scanner.py", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner", "type": "Class"}]}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_top_level_tabs", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_ticker_text_input", "type": "Function", "lineno": 24}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_ticker_default_value", "type": "Function", "lineno": 29}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_period_selectbox", "type": "Function", "lineno": 34}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_metrics", "type": "Function", "lineno": 39}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_error_on_empty_data", "type": "Function", "lineno": 43}]}, {"nodeid": "tests/test_stock_tracker.py", "outcome": "passed", "result": [{"nodeid": "tests/test_stock_tracker.py::TestStockTracker", "type": "Class"}]}, {"nodeid": "tests/test_time_series.py::TestTimeSeries", "outcome": "passed", "result": [{"nodeid": "tests/test_time_series.py::TestTimeSeries::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_shows_title", "type": "Function", "lineno": 17}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_ticker_input", "type": "Function", "lineno": 22}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_period_selectbox", "type": "Function", "lineno": 27}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_loads_data_successfully", "type": "Function", "lineno": 31}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_tabs", "type": "Function", "lineno": 36}]}, {"nodeid": "tests/test_time_series.py", "outcome": "passed", "result": [{"nodeid": "tests/test_time_series.py::TestTimeSeries", "type": "Class"}]}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR", "outcome": "passed", "result": [{"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_loads_without_error", "type": "Function", "lineno": 11}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_shows_title", "type": "Function", "lineno": 15}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_ticker_input", "type": "Function", "lineno": 20}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_period_selectbox", "type": "Function", "lineno": 25}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_confidence_slider", "type": "Function", "lineno": 29}]}, {"nodeid": "tests/test_var_cvar.py", "outcome": "passed", "result": [{"nodeid": "tests/test_var_cvar.py::TestVaRCVaR", "type": "Class"}]}, {"nodeid": "tests", "outcome": "passed", "result": [{"nodeid": "tests/fixtures", "type": "Dir"}, {"nodeid": "tests/test_algo_trading.py", "type": "Module"}, {"nodeid": "tests/test_anomaly_detection.py", "type": "Module"}, {"nodeid": "tests/test_app.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_datasets.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_engines.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_rates.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_report.py", "type": "Module"}, {"nodeid": "tests/test_benchmark_runner.py", "type": "Module"}, {"nodeid": "tests/test_bigo_algorithms.py", "type": "Module"}, {"nodeid": "tests/test_bigo_problems.py", "type": "Module"}, {"nodeid": "tests/test_bigo_report.py", "type": "Module"}, {"nodeid": "tests/test_bigo_runner.py", "type": "Module"}, {"nodeid": "tests/test_budget_tracker.py", "type": "Module"}, {"nodeid": "tests/test_churros.py", "type": "Module"}, {"nodeid": "tests/test_clustering.py", "type": "Module"}, {"nodeid": "tests/test_contagion_constants.py", "type": "Module"}, {"nodeid": "tests/test_contagion_correlations.py", "type": "Module"}, {"nodeid": "tests/test_contagion_data_quality.py", "type": "Module"}, {"nodeid": "tests/test_contagion_globe.py", "type": "Module"}, {"nodeid": "tests/test_contagion_loader.py", "type": "Module"}, {"nodeid": "tests/test_credit_card_calculator.py", "type": "Module"}, {"nodeid": "tests/test_crypto_portfolio.py", "type": "Module"}, {"nodeid": "tests/test_currency_dashboard.py", "type": "Module"}, {"nodeid": "tests/test_esg_tracker.py", "type": "Module"}, {"nodeid": "tests/test_financial_reporting.py", "type": "Module"}, {"nodeid": "tests/test_global_contagion.py", "type": "Module"}, {"nodeid": "tests/test_globe_arc.py", "type": "Module"}, {"nodeid": "tests/test_globe_color.py", "type": "Module"}, {"nodeid": "tests/test_investment_planner.py", "type": "Module"}, {"nodeid": "tests/test_loan_amortization.py", "type": "Module"}, {"nodeid": "tests/test_loan_comparison.py", "type": "Module"}, {"nodeid": "tests/test_loan_default.py", "type": "Module"}, {"nodeid": "tests/test_london_house_prices.py", "type": "Module"}, {"nodeid": "tests/test_market_insights.py", "type": "Module"}, {"nodeid": "tests/test_personal_finance.py", "type": "Module"}, {"nodeid": "tests/test_plotting_libraries.py", "type": "Module"}, {"nodeid": "tests/test_portfolio_optimization.py", "type": "Module"}, {"nodeid": "tests/test_rent_vs_buy.py", "type": "Module"}, {"nodeid": "tests/test_rentbuy_charts.py", "type": "Module"}, {"nodeid": "tests/test_rentbuy_finance.py", "type": "Module"}, {"nodeid": "tests/test_rentbuy_inputs.py", "type": "Module"}, {"nodeid": "tests/test_rentbuy_scenario.py", "type": "Module"}, {"nodeid": "tests/test_retirement_calculator.py", "type": "Module"}, {"nodeid": "tests/test_sentiment_analysis.py", "type": "Module"}, {"nodeid": "tests/test_stock_analysis.py", "type": "Module"}, {"nodeid": "tests/test_stock_prediction.py", "type": "Module"}, {"nodeid": "tests/test_stock_risk_scanner.py", "type": "Module"}, {"nodeid": "tests/test_stock_tracker.py", "type": "Module"}, {"nodeid": "tests/test_time_series.py", "type": "Module"}, {"nodeid": "tests/test_var_cvar.py", "type": "Module"}]}], "tests": [{"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.41846797700003435, "outcome": "passed"}, "call": {"duration": 0.29102715799996304, "outcome": "passed", "stderr": "2026-05-07 09:59:34.292 WARNING streamlit.runtime.scriptrunner_utils.script_run_context: Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002726569999822459, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.006480853000027764, "outcome": "passed"}, "call": {"duration": 0.0442162500000336, "outcome": "passed", "stderr": "2026-05-07 09:59:34.590 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00024499500000274566, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_two_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.005905844999972487, "outcome": "passed"}, "call": {"duration": 0.042597983999996814, "outcome": "passed", "stderr": "2026-05-07 09:59:34.641 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020222599999897284, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_ticker_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.00585916699998279, "outcome": "passed"}, "call": {"duration": 0.04269031699999459, "outcome": "passed", "stderr": "2026-05-07 09:59:34.690 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020008199999210774, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.0062462970000183304, "outcome": "passed"}, "call": {"duration": 0.04479383399996095, "outcome": "passed", "stderr": "2026-05-07 09:59:34.740 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002065640000523672, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_strategy_radio", "lineno": 33, "outcome": "passed", "keywords": ["test_has_strategy_radio", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.005738722000046437, "outcome": "passed"}, "call": {"duration": 0.042474159999983385, "outcome": "passed", "stderr": "2026-05-07 09:59:34.791 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002499739999848316, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_has_sma_sliders", "lineno": 38, "outcome": "passed", "keywords": ["test_has_sma_sliders", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.005927559999975074, "outcome": "passed"}, "call": {"duration": 0.041484366000020145, "outcome": "passed", "stderr": "2026-05-07 09:59:34.840 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019439100003637577, "outcome": "passed"}}, {"nodeid": "tests/test_algo_trading.py::TestAlgoTrading::test_momentum_mode", "lineno": 46, "outcome": "passed", "keywords": ["test_momentum_mode", "TestAlgoTrading", "test_algo_trading.py", "tests", "dashboard", ""], "setup": {"duration": 0.005813998999997239, "outcome": "passed"}, "call": {"duration": 0.08177349099997855, "outcome": "passed", "stderr": "2026-05-07 09:59:34.888 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002259899999899062, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.06630260600002202, "outcome": "passed"}, "call": {"duration": 0.03489725299999691, "outcome": "passed", "stderr": "2026-05-07 09:59:35.037 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.000209177999977328, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.005874272000028213, "outcome": "passed"}, "call": {"duration": 0.036090581999985716, "outcome": "passed", "stderr": "2026-05-07 09:59:35.078 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00024408299998412986, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_ticker_input", "lineno": 20, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.00705367299997306, "outcome": "passed"}, "call": {"duration": 0.030446078000011312, "outcome": "passed", "stderr": "2026-05-07 09:59:35.122 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019006299999091425, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_period_selectbox", "lineno": 25, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.005890781999994488, "outcome": "passed"}, "call": {"duration": 0.03318515900002694, "outcome": "passed", "stderr": "2026-05-07 09:59:35.159 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002688590000161639, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_method_radio", "lineno": 29, "outcome": "passed", "keywords": ["test_has_method_radio", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.008875956999986556, "outcome": "passed"}, "call": {"duration": 0.03338499299997011, "outcome": "passed", "stderr": "2026-05-07 09:59:35.202 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00018918099999609694, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_has_threshold_slider", "lineno": 34, "outcome": "passed", "keywords": ["test_has_threshold_slider", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.005824878999987959, "outcome": "passed"}, "call": {"duration": 0.030142769999997654, "outcome": "passed", "stderr": "2026-05-07 09:59:35.242 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00024090799996656642, "outcome": "passed"}}, {"nodeid": "tests/test_anomaly_detection.py::TestAnomalyDetection::test_isolation_forest_mode", "lineno": 39, "outcome": "passed", "keywords": ["test_isolation_forest_mode", "TestAnomalyDetection", "test_anomaly_detection.py", "tests", "dashboard", ""], "setup": {"duration": 0.005830430000003162, "outcome": "passed"}, "call": {"duration": 1.2277382759999682, "outcome": "passed", "stderr": "2026-05-07 09:59:35.279 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00024963499998875704, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestLandingPage::test_loads_without_error", "lineno": 7, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLandingPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.006105367999964528, "outcome": "passed"}, "call": {"duration": 0.01666861199998948, "outcome": "passed", "stderr": "2026-05-07 09:59:36.514 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019280899999785106, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestLandingPage::test_shows_title", "lineno": 12, "outcome": "passed", "keywords": ["test_shows_title", "TestLandingPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.005881993000002694, "outcome": "passed"}, "call": {"duration": 0.01490066299999171, "outcome": "passed", "stderr": "2026-05-07 09:59:36.537 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001917359999765722, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_loads_without_error", "lineno": 31, "outcome": "passed", "keywords": ["test_loads_without_error", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.005841969000016434, "outcome": "passed"}, "call": {"duration": 0.3181739379999726, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 09:59:36.558 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 09:59:36.620 The widget with key \"weight_slider_0\" was created with a default value but also had its value set via the Session State API.\nStack (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/threading.py\", line 1002, in _bootstrap\n self._bootstrap_inner()\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/threading.py\", line 1045, in _bootstrap_inner\n self.run()\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/threading.py\", line 982, in run\n self._target(*self._args, **self._kwargs)\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/script_runner.py\", line 379, in _run_script_thread\n self._run_script(request.rerun_data)\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/script_runner.py\", line 705, in _run_script\n ) = exec_func_with_error_handling(code_to_exec, ctx)\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/exec_code.py\", line 129, in exec_func_with_error_handling\n result = func()\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/script_runner.py\", line 689, in code_to_exec\n exec(code, module.__dict__) # noqa: S102\n File \"/home/runner/work/QuantLab/QuantLab/dashboard/pages/1_Stock_Risk_Scanner.py\", line 159, in \n w = st.slider(\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runtime/metrics_util.py\", line 698, in wrapped_func\n result = non_optional_func(*args, **kwargs)\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/elements/widgets/slider.py\", line 721, in slider\n return self._slider(\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/elements/widgets/slider.py\", line 762, in _slider\n check_widget_policies(\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/elements/lib/policies.py\", line 180, in check_widget_policies\n check_session_state_rules(\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/elements/lib/policies.py\", line 91, in check_session_state_rules\n _LOGGER.warning(\n"}, "teardown": {"duration": 0.00026623500002642686, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_shows_title", "lineno": 40, "outcome": "passed", "keywords": ["test_shows_title", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.006277940000018134, "outcome": "passed"}, "call": {"duration": 0.09160453999999163, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 09:59:36.883 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020936900000378955, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_three_tabs", "lineno": 45, "outcome": "passed", "keywords": ["test_has_three_tabs", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.0057916249999721, "outcome": "passed"}, "call": {"duration": 0.08938573199998245, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 09:59:36.982 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021340799997915383, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_scan_button", "lineno": 49, "outcome": "passed", "keywords": ["test_has_scan_button", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.005863990000023023, "outcome": "passed"}, "call": {"duration": 0.09159336200002599, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 09:59:37.078 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002219030000105704, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_preset_buttons", "lineno": 54, "outcome": "passed", "keywords": ["test_has_preset_buttons", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.006128451999984463, "outcome": "passed"}, "call": {"duration": 0.0958565930000077, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 09:59:37.176 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002215220000039153, "outcome": "passed"}}, {"nodeid": "tests/test_app.py::TestScannerPage::test_has_equal_weight_button", "lineno": 61, "outcome": "passed", "keywords": ["test_has_equal_weight_button", "TestScannerPage", "test_app.py", "tests", "dashboard", ""], "setup": {"duration": 0.00593059400000584, "outcome": "passed"}, "call": {"duration": 0.1213462939999772, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 09:59:37.278 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00024137999997719817, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_datasets.py::test_presets_has_small_and_large_keys", "lineno": 9, "outcome": "passed", "keywords": ["test_presets_has_small_and_large_keys", "test_benchmark_datasets.py", "tests", "dashboard", ""], "setup": {"duration": 0.0074173400000177026, "outcome": "passed"}, "call": {"duration": 0.0001556189999973867, "outcome": "passed"}, "teardown": {"duration": 0.00023485700000946963, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_datasets.py::test_preset_entries_have_required_fields", "lineno": 13, "outcome": "passed", "keywords": ["test_preset_entries_have_required_fields", "test_benchmark_datasets.py", "tests", "dashboard", ""], "setup": {"duration": 0.0070316219999995155, "outcome": "passed"}, "call": {"duration": 0.00013497099996584438, "outcome": "passed"}, "teardown": {"duration": 0.00017999499999632462, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_datasets.py::test_get_available_presets_filters_missing_files", "lineno": 21, "outcome": "passed", "keywords": ["test_get_available_presets_filters_missing_files", "test_benchmark_datasets.py", "tests", "dashboard", ""], "setup": {"duration": 0.005788680000023305, "outcome": "passed"}, "call": {"duration": 0.00021693399997957385, "outcome": "passed"}, "teardown": {"duration": 0.00018542499998375206, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_ops_constant_has_seven_entries", "lineno": 41, "outcome": "passed", "keywords": ["test_ops_constant_has_seven_entries", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.005860894000022654, "outcome": "passed"}, "call": {"duration": 0.00013527099997645564, "outcome": "passed"}, "teardown": {"duration": 0.0001796650000187583, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_default_column_config_resolves", "lineno": 48, "outcome": "passed", "keywords": ["test_default_column_config_resolves", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.021389634000001934, "outcome": "passed"}, "call": {"duration": 0.0011140220000243062, "outcome": "passed"}, "teardown": {"duration": 0.0002505360000100154, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_read_parity", "lineno": 55, "outcome": "passed", "keywords": ["test_read_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.006718649999982063, "outcome": "passed"}, "call": {"duration": 0.019308292999994592, "outcome": "passed"}, "teardown": {"duration": 0.0002526189999798589, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_count_parity", "lineno": 61, "outcome": "passed", "keywords": ["test_count_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.007945923000022503, "outcome": "passed"}, "call": {"duration": 0.0010008820000280139, "outcome": "passed"}, "teardown": {"duration": 0.00020918899997468543, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_filter_parity", "lineno": 67, "outcome": "passed", "keywords": ["test_filter_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.008921910999958982, "outcome": "passed"}, "call": {"duration": 0.013365971000041554, "outcome": "passed"}, "teardown": {"duration": 0.0002613259999861839, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_groupby_parity", "lineno": 77, "outcome": "passed", "keywords": ["test_groupby_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.008024859999977707, "outcome": "passed"}, "call": {"duration": 0.007468664999976227, "outcome": "passed"}, "teardown": {"duration": 0.00021310599998969337, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_sort_parity", "lineno": 86, "outcome": "passed", "keywords": ["test_sort_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.007372642999996515, "outcome": "passed"}, "call": {"duration": 0.010861051000006228, "outcome": "passed"}, "teardown": {"duration": 0.0002285249999545158, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_regex_parity", "lineno": 95, "outcome": "passed", "keywords": ["test_regex_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.007446233999985452, "outcome": "passed"}, "call": {"duration": 0.006853371000033803, "outcome": "passed"}, "teardown": {"duration": 0.0002304889999891202, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_engines.py::test_write_parity", "lineno": 105, "outcome": "passed", "keywords": ["test_write_parity", "test_benchmark_engines.py", "tests", "dashboard", ""], "setup": {"duration": 0.009278573000017332, "outcome": "passed"}, "call": {"duration": 0.07767634699996506, "outcome": "passed"}, "teardown": {"duration": 0.00022216399997887493, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.00582561800001713, "outcome": "passed"}, "call": {"duration": 0.9819325220000223, "outcome": "passed", "stderr": "2026-05-07 09:59:37.658 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023594900000034613, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.006011144000012791, "outcome": "passed"}, "call": {"duration": 0.07474805399999696, "outcome": "passed", "stderr": "2026-05-07 09:59:38.646 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020684499997969397, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_top_level_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_top_level_tabs", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.005941995000000588, "outcome": "passed"}, "call": {"duration": 0.07491304900003115, "outcome": "passed", "stderr": "2026-05-07 09:59:38.728 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022688199999265635, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_currency_selectbox", "lineno": 24, "outcome": "passed", "keywords": ["test_has_currency_selectbox", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059625029999779144, "outcome": "passed"}, "call": {"duration": 0.07405486099997916, "outcome": "passed", "stderr": "2026-05-07 09:59:38.809 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022653199999922435, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_notional_input", "lineno": 29, "outcome": "passed", "keywords": ["test_has_notional_input", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.005769183000040812, "outcome": "passed"}, "call": {"duration": 0.07265528300001733, "outcome": "passed", "stderr": "2026-05-07 09:59:38.890 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020440999998072584, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_fixed_rate_input", "lineno": 34, "outcome": "passed", "keywords": ["test_has_fixed_rate_input", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.005830367000044134, "outcome": "passed"}, "call": {"duration": 0.07270668099999966, "outcome": "passed", "stderr": "2026-05-07 09:59:38.969 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021555099999659433, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_position_radio", "lineno": 39, "outcome": "passed", "keywords": ["test_has_position_radio", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.005812243999969269, "outcome": "passed"}, "call": {"duration": 0.17961214999996855, "outcome": "passed", "stderr": "2026-05-07 09:59:39.048 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022807399994917432, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_rate_selectbox", "lineno": 43, "outcome": "passed", "keywords": ["test_has_rate_selectbox", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.005819067000004452, "outcome": "passed"}, "call": {"duration": 0.07602910000002794, "outcome": "passed", "stderr": "2026-05-07 09:59:39.234 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023056899999573943, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_period_selectbox", "lineno": 48, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.006581434999986868, "outcome": "passed"}, "call": {"duration": 0.0737257630000272, "outcome": "passed", "stderr": "2026-05-07 09:59:39.318 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002079770000023018, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_rates.py::TestBenchmarkRates::test_has_metrics", "lineno": 53, "outcome": "passed", "keywords": ["test_has_metrics", "TestBenchmarkRates", "test_benchmark_rates.py", "tests", "dashboard", ""], "setup": {"duration": 0.00591016599997829, "outcome": "passed"}, "call": {"duration": 0.07538364399999864, "outcome": "passed", "stderr": "2026-05-07 09:59:39.398 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002330929999629916, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_report.py::test_build_overview_chart_returns_figure", "lineno": 39, "outcome": "passed", "keywords": ["test_build_overview_chart_returns_figure", "test_benchmark_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.006974524999975529, "outcome": "passed"}, "call": {"duration": 0.005724299000007704, "outcome": "passed"}, "teardown": {"duration": 0.0002009840000027907, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_dataframe_result", "lineno": 47, "outcome": "passed", "keywords": ["test_build_op_card_dataframe_result", "test_benchmark_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.006650232999959371, "outcome": "passed"}, "call": {"duration": 0.00014068199999428543, "outcome": "passed"}, "teardown": {"duration": 0.00018921199995247662, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_scalar_result", "lineno": 58, "outcome": "passed", "keywords": ["test_build_op_card_scalar_result", "test_benchmark_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.006451894000008451, "outcome": "passed"}, "call": {"duration": 0.00016653000000133034, "outcome": "passed"}, "teardown": {"duration": 0.00021667300001126932, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_report.py::test_build_op_card_write_result", "lineno": 64, "outcome": "passed", "keywords": ["test_build_op_card_write_result", "test_benchmark_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.006620056000031127, "outcome": "passed"}, "call": {"duration": 0.00013403900004504976, "outcome": "passed"}, "teardown": {"duration": 0.00020529199997554315, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_returns_seven_results", "lineno": 7, "outcome": "passed", "keywords": ["test_run_benchmark_returns_seven_results", "test_benchmark_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006284541999946214, "outcome": "passed"}, "call": {"duration": 3.7919230009999865, "outcome": "passed"}, "teardown": {"duration": 0.00026419100004204665, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_correctness_flags_set", "lineno": 24, "outcome": "passed", "keywords": ["test_run_benchmark_correctness_flags_set", "test_benchmark_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064533089999940785, "outcome": "passed"}, "call": {"duration": 3.4658332949999817, "outcome": "passed"}, "teardown": {"duration": 0.00034051299996917805, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_runner.py::test_run_benchmark_bad_column_captures_error", "lineno": 30, "outcome": "passed", "keywords": ["test_run_benchmark_bad_column_captures_error", "test_benchmark_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006360677999964537, "outcome": "passed"}, "call": {"duration": 1.1138469530000066, "outcome": "passed"}, "teardown": {"duration": 0.000275502000022243, "outcome": "passed"}}, {"nodeid": "tests/test_benchmark_runner.py::test_result_preview_shapes", "lineno": 49, "outcome": "passed", "keywords": ["test_result_preview_shapes", "test_benchmark_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064534699999967415, "outcome": "passed"}, "call": {"duration": 1.4531321190000313, "outcome": "passed"}, "teardown": {"duration": 0.000264751999964119, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-0-0]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-0-0]", "parametrize", "pytestmark", "fib_naive-0-0", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006865165000021989, "outcome": "passed"}, "call": {"duration": 0.00014243499998656262, "outcome": "passed"}, "teardown": {"duration": 0.0002088580000076945, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-1-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-1-1]", "parametrize", "pytestmark", "fib_naive-1-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006054528999982267, "outcome": "passed"}, "call": {"duration": 0.00013186500001438617, "outcome": "passed"}, "teardown": {"duration": 0.00022503800005324592, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-2-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-2-1]", "parametrize", "pytestmark", "fib_naive-2-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006017208999992363, "outcome": "passed"}, "call": {"duration": 0.00013115399997332133, "outcome": "passed"}, "teardown": {"duration": 0.00019005299998298142, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-5-5]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-5-5]", "parametrize", "pytestmark", "fib_naive-5-5", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005968008000024838, "outcome": "passed"}, "call": {"duration": 0.00013329800003702985, "outcome": "passed"}, "teardown": {"duration": 0.000194831999976941, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-10-55]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-10-55]", "parametrize", "pytestmark", "fib_naive-10-55", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005943552000019281, "outcome": "passed"}, "call": {"duration": 0.0001364839999951073, "outcome": "passed"}, "teardown": {"duration": 0.00019439199996895695, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-20-6765]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-20-6765]", "parametrize", "pytestmark", "fib_naive-20-6765", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006023772000048666, "outcome": "passed"}, "call": {"duration": 0.0011432549999881303, "outcome": "passed"}, "teardown": {"duration": 0.00022068999999191874, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_naive-25-75025]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_naive-25-75025]", "parametrize", "pytestmark", "fib_naive-25-75025", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.0060798250000289045, "outcome": "passed"}, "call": {"duration": 0.010835890999999265, "outcome": "passed"}, "teardown": {"duration": 0.00019730700000764045, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-0-0]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-0-0]", "parametrize", "pytestmark", "fib_iterative-0-0", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.0062670130000128665, "outcome": "passed"}, "call": {"duration": 0.0001353210000161198, "outcome": "passed"}, "teardown": {"duration": 0.00020594300002585442, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-1-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-1-1]", "parametrize", "pytestmark", "fib_iterative-1-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006003183000018453, "outcome": "passed"}, "call": {"duration": 0.0001556889999960731, "outcome": "passed"}, "teardown": {"duration": 0.00019505199998093303, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-2-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-2-1]", "parametrize", "pytestmark", "fib_iterative-2-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005974058999981935, "outcome": "passed"}, "call": {"duration": 0.0001299410000115131, "outcome": "passed"}, "teardown": {"duration": 0.00021885699999302233, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-5-5]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-5-5]", "parametrize", "pytestmark", "fib_iterative-5-5", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.007146086999966883, "outcome": "passed"}, "call": {"duration": 0.00013649400000304013, "outcome": "passed"}, "teardown": {"duration": 0.00022476700002016514, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-10-55]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-10-55]", "parametrize", "pytestmark", "fib_iterative-10-55", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.00602590500000133, "outcome": "passed"}, "call": {"duration": 0.00013234599998668273, "outcome": "passed"}, "teardown": {"duration": 0.0001943710000205101, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-20-6765]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-20-6765]", "parametrize", "pytestmark", "fib_iterative-20-6765", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005840841999997792, "outcome": "passed"}, "call": {"duration": 0.0001548779999893668, "outcome": "passed"}, "teardown": {"duration": 0.00019323899999790228, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_iterative-25-75025]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_iterative-25-75025]", "parametrize", "pytestmark", "fib_iterative-25-75025", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005843335999998089, "outcome": "passed"}, "call": {"duration": 0.00012801700000864003, "outcome": "passed"}, "teardown": {"duration": 0.00021949799997855735, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-0-0]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-0-0]", "parametrize", "pytestmark", "fib_memoized-0-0", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005884242999968592, "outcome": "passed"}, "call": {"duration": 0.00013952000000472253, "outcome": "passed"}, "teardown": {"duration": 0.00019969100003436324, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-1-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-1-1]", "parametrize", "pytestmark", "fib_memoized-1-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005873781999980565, "outcome": "passed"}, "call": {"duration": 0.0001368039999647408, "outcome": "passed"}, "teardown": {"duration": 0.00019743699999708042, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-2-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-2-1]", "parametrize", "pytestmark", "fib_memoized-2-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005952638999985993, "outcome": "passed"}, "call": {"duration": 0.00014146299997719325, "outcome": "passed"}, "teardown": {"duration": 0.00022347499998431886, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-5-5]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-5-5]", "parametrize", "pytestmark", "fib_memoized-5-5", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006078954000031445, "outcome": "passed"}, "call": {"duration": 0.0001420739999957732, "outcome": "passed"}, "teardown": {"duration": 0.0001979880000249068, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-10-55]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-10-55]", "parametrize", "pytestmark", "fib_memoized-10-55", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059417589999952725, "outcome": "passed"}, "call": {"duration": 0.00014835500002163826, "outcome": "passed"}, "teardown": {"duration": 0.0001978170000143109, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-20-6765]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-20-6765]", "parametrize", "pytestmark", "fib_memoized-20-6765", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006155546999991657, "outcome": "passed"}, "call": {"duration": 0.00015498700003035992, "outcome": "passed"}, "teardown": {"duration": 0.00019930000001977533, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_memoized-25-75025]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_memoized-25-75025]", "parametrize", "pytestmark", "fib_memoized-25-75025", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.007245570999998563, "outcome": "passed"}, "call": {"duration": 0.00015180200000486366, "outcome": "passed"}, "teardown": {"duration": 0.00019572300004710996, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-0-0]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-0-0]", "parametrize", "pytestmark", "fib_matrix-0-0", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005902036000009048, "outcome": "passed"}, "call": {"duration": 0.00012655500000846587, "outcome": "passed"}, "teardown": {"duration": 0.00020237600000427847, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-1-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-1-1]", "parametrize", "pytestmark", "fib_matrix-1-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005883701000016117, "outcome": "passed"}, "call": {"duration": 0.00012656499995955528, "outcome": "passed"}, "teardown": {"duration": 0.00019181700002945945, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-2-1]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-2-1]", "parametrize", "pytestmark", "fib_matrix-2-1", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005845931000010296, "outcome": "passed"}, "call": {"duration": 0.00015711099996451594, "outcome": "passed"}, "teardown": {"duration": 0.00019118500000558925, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-5-5]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-5-5]", "parametrize", "pytestmark", "fib_matrix-5-5", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005918616000030852, "outcome": "passed"}, "call": {"duration": 0.0001375759999859838, "outcome": "passed"}, "teardown": {"duration": 0.00022119100003692438, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-10-55]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-10-55]", "parametrize", "pytestmark", "fib_matrix-10-55", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059548940000127, "outcome": "passed"}, "call": {"duration": 0.00014365699996687908, "outcome": "passed"}, "teardown": {"duration": 0.00019979100000000471, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-20-6765]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-20-6765]", "parametrize", "pytestmark", "fib_matrix-20-6765", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005929506000029505, "outcome": "passed"}, "call": {"duration": 0.00014519000001200766, "outcome": "passed"}, "teardown": {"duration": 0.00019861900000250898, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_fib_variant_correct[fib_matrix-25-75025]", "lineno": 28, "outcome": "passed", "keywords": ["test_fib_variant_correct[fib_matrix-25-75025]", "parametrize", "pytestmark", "fib_matrix-25-75025", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006027969000001576, "outcome": "passed"}, "call": {"duration": 0.0001701059999845711, "outcome": "passed"}, "teardown": {"duration": 0.00020363799995948284, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr0-5-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr0-5-True]", "parametrize", "pytestmark", "pair_brute-arr0-5-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006116784000028019, "outcome": "passed"}, "call": {"duration": 0.00013815600004818407, "outcome": "passed"}, "teardown": {"duration": 0.00020763600002737803, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr1-8-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr1-8-False]", "parametrize", "pytestmark", "pair_brute-arr1-8-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006014864999997371, "outcome": "passed"}, "call": {"duration": 0.00014825499999915337, "outcome": "passed"}, "teardown": {"duration": 0.00023184099995887664, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr2-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr2-5-False]", "parametrize", "pytestmark", "pair_brute-arr2-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.007149343000037334, "outcome": "passed"}, "call": {"duration": 0.0001287489999981517, "outcome": "passed"}, "teardown": {"duration": 0.0001979269999878852, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr3-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr3-5-False]", "parametrize", "pytestmark", "pair_brute-arr3-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005888489999961166, "outcome": "passed"}, "call": {"duration": 0.0001314239999601341, "outcome": "passed"}, "teardown": {"duration": 0.00020158400002401322, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr4-6-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr4-6-True]", "parametrize", "pytestmark", "pair_brute-arr4-6-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005918386000018927, "outcome": "passed"}, "call": {"duration": 0.00013171499995223712, "outcome": "passed"}, "teardown": {"duration": 0.00019825800001171956, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr5-9-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr5-9-True]", "parametrize", "pytestmark", "pair_brute-arr5-9-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005999986999995599, "outcome": "passed"}, "call": {"duration": 0.0001426750000064203, "outcome": "passed"}, "teardown": {"duration": 0.00022093000001177643, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_brute-arr6-15-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_brute-arr6-15-False]", "parametrize", "pytestmark", "pair_brute-arr6-15-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005996851000020342, "outcome": "passed"}, "call": {"duration": 0.00013600199997654272, "outcome": "passed"}, "teardown": {"duration": 0.00020250599999371843, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr0-5-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr0-5-True]", "parametrize", "pytestmark", "pair_sorted-arr0-5-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005998353999984829, "outcome": "passed"}, "call": {"duration": 0.00013772500000186483, "outcome": "passed"}, "teardown": {"duration": 0.00020166500002005705, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr1-8-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr1-8-False]", "parametrize", "pytestmark", "pair_sorted-arr1-8-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006220196000015221, "outcome": "passed"}, "call": {"duration": 0.0001523430000247572, "outcome": "passed"}, "teardown": {"duration": 0.00021040100000391249, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr2-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr2-5-False]", "parametrize", "pytestmark", "pair_sorted-arr2-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005973908000044048, "outcome": "passed"}, "call": {"duration": 0.00015326499999446241, "outcome": "passed"}, "teardown": {"duration": 0.0002049909999755073, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr3-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr3-5-False]", "parametrize", "pytestmark", "pair_sorted-arr3-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.00602122700001928, "outcome": "passed"}, "call": {"duration": 0.0001327969999920242, "outcome": "passed"}, "teardown": {"duration": 0.00022738299998081857, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr4-6-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr4-6-True]", "parametrize", "pytestmark", "pair_sorted-arr4-6-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006023901999981263, "outcome": "passed"}, "call": {"duration": 0.00013300700004492683, "outcome": "passed"}, "teardown": {"duration": 0.0001996810000264304, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr5-9-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr5-9-True]", "parametrize", "pytestmark", "pair_sorted-arr5-9-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005989497999962623, "outcome": "passed"}, "call": {"duration": 0.0001332879999722536, "outcome": "passed"}, "teardown": {"duration": 0.00020422900001904054, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_sorted-arr6-15-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_sorted-arr6-15-False]", "parametrize", "pytestmark", "pair_sorted-arr6-15-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.00753142299998899, "outcome": "passed"}, "call": {"duration": 0.00013443899996445907, "outcome": "passed"}, "teardown": {"duration": 0.00019859799999721872, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr0-5-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr0-5-True]", "parametrize", "pytestmark", "pair_hash-arr0-5-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006022549000022082, "outcome": "passed"}, "call": {"duration": 0.00013097300001163603, "outcome": "passed"}, "teardown": {"duration": 0.00019512300002588745, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr1-8-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr1-8-False]", "parametrize", "pytestmark", "pair_hash-arr1-8-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005853996000041661, "outcome": "passed"}, "call": {"duration": 0.0001310330000023896, "outcome": "passed"}, "teardown": {"duration": 0.00019768700002487094, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr2-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr2-5-False]", "parametrize", "pytestmark", "pair_hash-arr2-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005903538999973534, "outcome": "passed"}, "call": {"duration": 0.0001265349999926002, "outcome": "passed"}, "teardown": {"duration": 0.0001996810000264304, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr3-5-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr3-5-False]", "parametrize", "pytestmark", "pair_hash-arr3-5-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005891314999985298, "outcome": "passed"}, "call": {"duration": 0.00012756700004956656, "outcome": "passed"}, "teardown": {"duration": 0.0001990100000170969, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr4-6-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr4-6-True]", "parametrize", "pytestmark", "pair_hash-arr4-6-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005912794999971993, "outcome": "passed"}, "call": {"duration": 0.00012685600000850172, "outcome": "passed"}, "teardown": {"duration": 0.0002006630000437326, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr5-9-True]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr5-9-True]", "parametrize", "pytestmark", "pair_hash-arr5-9-True", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.005972055000029286, "outcome": "passed"}, "call": {"duration": 0.00012778699999671517, "outcome": "passed"}, "teardown": {"duration": 0.00019861999999193358, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_algorithms.py::test_pair_variant_correct[pair_hash-arr6-15-False]", "lineno": 47, "outcome": "passed", "keywords": ["test_pair_variant_correct[pair_hash-arr6-15-False]", "parametrize", "pytestmark", "pair_hash-arr6-15-False", "test_bigo_algorithms.py", "tests", "dashboard", ""], "setup": {"duration": 0.006096827000021676, "outcome": "passed"}, "call": {"duration": 0.0001318849999734084, "outcome": "passed"}, "teardown": {"duration": 0.00020206599998573438, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_problems.py::test_registry_has_seed_problems", "lineno": 5, "outcome": "passed", "keywords": ["test_registry_has_seed_problems", "test_bigo_problems.py", "tests", "dashboard", ""], "setup": {"duration": 0.005790176999994401, "outcome": "passed"}, "call": {"duration": 0.00017528600000105143, "outcome": "passed"}, "teardown": {"duration": 0.0001859960000274441, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_problems.py::test_input_factory_returns_tuple", "lineno": 24, "outcome": "passed", "keywords": ["test_input_factory_returns_tuple", "test_bigo_problems.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059707730000013726, "outcome": "passed"}, "call": {"duration": 0.00027060299998993287, "outcome": "passed"}, "teardown": {"duration": 0.00019157599996333374, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_problems.py::test_variant_big_o_labels_non_empty", "lineno": 39, "outcome": "passed", "keywords": ["test_variant_big_o_labels_non_empty", "test_bigo_problems.py", "tests", "dashboard", ""], "setup": {"duration": 0.007829675999971641, "outcome": "passed"}, "call": {"duration": 0.00015963599997803612, "outcome": "passed"}, "teardown": {"duration": 0.00019286899998860463, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_report.py::test_build_complexity_chart_returns_figure", "lineno": 23, "outcome": "passed", "keywords": ["test_build_complexity_chart_returns_figure", "test_bigo_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.0057604419999961465, "outcome": "passed"}, "call": {"duration": 0.008024597999963134, "outcome": "passed"}, "teardown": {"duration": 0.00020754600001282597, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_report.py::test_build_variant_card_shape", "lineno": 33, "outcome": "passed", "keywords": ["test_build_variant_card_shape", "test_bigo_report.py", "tests", "dashboard", ""], "setup": {"duration": 0.0060052869999935865, "outcome": "passed"}, "call": {"duration": 0.00019620500000883112, "outcome": "passed"}, "teardown": {"duration": 0.00020516099999667858, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_returns_expected_structure", "lineno": 10, "outcome": "passed", "keywords": ["test_run_problem_returns_expected_structure", "test_bigo_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0058013080000023365, "outcome": "passed"}, "call": {"duration": 3.462121582000009, "outcome": "passed"}, "teardown": {"duration": 0.0002682979999804047, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_skips_past_budget", "lineno": 24, "outcome": "passed", "keywords": ["test_run_problem_skips_past_budget", "test_bigo_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006556107999983851, "outcome": "passed"}, "call": {"duration": 0.050329338000040025, "outcome": "passed"}, "teardown": {"duration": 0.00023760099998071382, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_correctness_check", "lineno": 47, "outcome": "passed", "keywords": ["test_run_problem_correctness_check", "test_bigo_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005953899000019192, "outcome": "passed"}, "call": {"duration": 3.5148593490000053, "outcome": "passed"}, "teardown": {"duration": 0.0002914410000016687, "outcome": "passed"}}, {"nodeid": "tests/test_bigo_runner.py::test_run_problem_captures_exception", "lineno": 57, "outcome": "passed", "keywords": ["test_run_problem_captures_exception", "test_bigo_runner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006448728999998821, "outcome": "passed"}, "call": {"duration": 0.00017947300000287214, "outcome": "passed"}, "teardown": {"duration": 0.00020137400002795403, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.0058176960000082545, "outcome": "passed"}, "call": {"duration": 0.05877030700003161, "outcome": "passed", "stderr": "2026-05-07 09:59:56.816 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019495200001529156, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005774595999980647, "outcome": "passed"}, "call": {"duration": 0.045469599999989896, "outcome": "passed", "stderr": "2026-05-07 09:59:56.881 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001973269999666627, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005831993000015245, "outcome": "passed"}, "call": {"duration": 0.044990020000000186, "outcome": "passed", "stderr": "2026-05-07 09:59:56.933 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022241299996039743, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005752846000007139, "outcome": "passed"}, "call": {"duration": 0.04498392800002193, "outcome": "passed", "stderr": "2026-05-07 09:59:56.985 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020402900003091418, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_income_number_input", "lineno": 30, "outcome": "passed", "keywords": ["test_has_income_number_input", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005760110000039731, "outcome": "passed"}, "call": {"duration": 0.04480453500002568, "outcome": "passed", "stderr": "2026-05-07 09:59:57.036 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.000190043000031892, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_data_editor", "lineno": 36, "outcome": "passed", "keywords": ["test_has_data_editor", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005850636999980452, "outcome": "passed"}, "call": {"duration": 0.044863574999965294, "outcome": "passed", "stderr": "2026-05-07 09:59:57.088 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021770500001139226, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_has_metrics", "lineno": 42, "outcome": "passed", "keywords": ["test_has_metrics", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005779085000028772, "outcome": "passed"}, "call": {"duration": 0.04474698799998578, "outcome": "passed", "stderr": "2026-05-07 09:59:57.139 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00018908099997361205, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_shows_budget_status_message", "lineno": 46, "outcome": "passed", "keywords": ["test_shows_budget_status_message", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005917812999996386, "outcome": "passed"}, "call": {"duration": 0.04476859900000818, "outcome": "passed", "stderr": "2026-05-07 09:59:57.190 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00018873100003702348, "outcome": "passed"}}, {"nodeid": "tests/test_budget_tracker.py::TestBudgetTracker::test_switch_to_plan_mode", "lineno": 56, "outcome": "passed", "keywords": ["test_switch_to_plan_mode", "TestBudgetTracker", "test_budget_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005786808999971527, "outcome": "passed"}, "call": {"duration": 0.08943466499999886, "outcome": "passed", "stderr": "2026-05-07 09:59:57.241 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001987289999760833, "outcome": "passed"}}, {"nodeid": "tests/test_churros.py::TestChurros::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestChurros", "test_churros.py", "tests", "dashboard", ""], "setup": {"duration": 0.006233087999987674, "outcome": "passed"}, "call": {"duration": 0.015379517999974723, "outcome": "passed", "stderr": "2026-05-07 09:59:57.338 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019163600001093073, "outcome": "passed"}}, {"nodeid": "tests/test_churros.py::TestChurros::test_shows_title", "lineno": 17, "outcome": "passed", "keywords": ["test_shows_title", "TestChurros", "test_churros.py", "tests", "dashboard", ""], "setup": {"duration": 0.005786779000004572, "outcome": "passed"}, "call": {"duration": 0.012703076999969198, "outcome": "passed", "stderr": "2026-05-07 09:59:57.359 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019198699999378732, "outcome": "passed"}}, {"nodeid": "tests/test_churros.py::TestChurros::test_has_password_form", "lineno": 21, "outcome": "passed", "keywords": ["test_has_password_form", "TestChurros", "test_churros.py", "tests", "dashboard", ""], "setup": {"duration": 0.005734282000048552, "outcome": "passed"}, "call": {"duration": 0.01260054599998739, "outcome": "passed", "stderr": "2026-05-07 09:59:57.379 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001905739999870093, "outcome": "passed"}}, {"nodeid": "tests/test_churros.py::TestChurros::test_has_form_submit", "lineno": 32, "outcome": "passed", "keywords": ["test_has_form_submit", "TestChurros", "test_churros.py", "tests", "dashboard", ""], "setup": {"duration": 0.006370203000017227, "outcome": "passed"}, "call": {"duration": 0.012938103000010415, "outcome": "passed", "stderr": "2026-05-07 09:59:57.398 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019221700000571218, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.005732367999996768, "outcome": "passed"}, "call": {"duration": 0.2582306300000141, "outcome": "passed", "stderr": "2026-05-07 09:59:57.418 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021939800001291587, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059217799999942144, "outcome": "passed"}, "call": {"duration": 0.06657591499998716, "outcome": "passed", "stderr": "2026-05-07 09:59:57.682 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019995100001324317, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_two_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.005766450999999506, "outcome": "passed"}, "call": {"duration": 0.06480028000004268, "outcome": "passed", "stderr": "2026-05-07 09:59:57.755 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023379500004239162, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_data_source_radio", "lineno": 24, "outcome": "passed", "keywords": ["test_has_data_source_radio", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.006047943999988092, "outcome": "passed"}, "call": {"duration": 0.06523737999998502, "outcome": "passed", "stderr": "2026-05-07 09:59:57.827 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001967659999877469, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_algorithm_radio", "lineno": 29, "outcome": "passed", "keywords": ["test_has_algorithm_radio", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.005888378000008743, "outcome": "passed"}, "call": {"duration": 0.06541268399996625, "outcome": "passed", "stderr": "2026-05-07 09:59:57.899 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020099299996445552, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_has_clusters_slider", "lineno": 34, "outcome": "passed", "keywords": ["test_has_clusters_slider", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.005798961000039071, "outcome": "passed"}, "call": {"duration": 0.06565837300001931, "outcome": "passed", "stderr": "2026-05-07 09:59:57.971 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00024661800000558287, "outcome": "passed"}}, {"nodeid": "tests/test_clustering.py::TestClustering::test_custom_data_mode", "lineno": 39, "outcome": "passed", "keywords": ["test_custom_data_mode", "TestClustering", "test_clustering.py", "tests", "dashboard", ""], "setup": {"duration": 0.005993553999985579, "outcome": "passed"}, "call": {"duration": 0.19146293099998957, "outcome": "passed", "stderr": "2026-05-07 09:59:58.043 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022044899998263645, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_periods_cover_expected_date_ranges", "lineno": 6, "outcome": "passed", "keywords": ["test_periods_cover_expected_date_ranges", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.0058898600000247825, "outcome": "passed"}, "call": {"duration": 0.0001351909999698364, "outcome": "passed"}, "teardown": {"duration": 0.00021343700001352772, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_every_ticker_has_a_role", "lineno": 14, "outcome": "passed", "keywords": ["test_every_ticker_has_a_role", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.005699697000011383, "outcome": "passed"}, "call": {"duration": 0.00013702400002557624, "outcome": "passed"}, "teardown": {"duration": 0.00018124700000043958, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_destination_cities_include_all_five", "lineno": 20, "outcome": "passed", "keywords": ["test_destination_cities_include_all_five", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.005700359000002209, "outcome": "passed"}, "call": {"duration": 0.0001285789999769804, "outcome": "passed"}, "teardown": {"duration": 0.00018274900003234507, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_epicenter_origin_is_strait_of_hormuz", "lineno": 25, "outcome": "passed", "keywords": ["test_epicenter_origin_is_strait_of_hormuz", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056145899999933135, "outcome": "passed"}, "call": {"duration": 0.00015181199995595307, "outcome": "passed"}, "teardown": {"duration": 0.00018263900000192734, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_every_destination_city_has_a_ticker_in_roles", "lineno": 31, "outcome": "passed", "keywords": ["test_every_destination_city_has_a_ticker_in_roles", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.005602776999978687, "outcome": "passed"}, "call": {"duration": 0.00012782699997160307, "outcome": "passed"}, "teardown": {"duration": 0.00018594600004462336, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_constants.py::test_correlation_window_is_positive_int", "lineno": 39, "outcome": "passed", "keywords": ["test_correlation_window_is_positive_int", "test_contagion_constants.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056686500000182605, "outcome": "passed"}, "call": {"duration": 0.000124561999996331, "outcome": "passed"}, "teardown": {"duration": 0.0002286249999770007, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_of_identical_series_is_one", "lineno": 8, "outcome": "passed", "keywords": ["test_rolling_corr_of_identical_series_is_one", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.005609390000017811, "outcome": "passed"}, "call": {"duration": 0.0007926720000455134, "outcome": "passed"}, "teardown": {"duration": 0.00018822999999201784, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_of_opposite_series_is_negative_one", "lineno": 15, "outcome": "passed", "keywords": ["test_rolling_corr_of_opposite_series_is_negative_one", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.006079191999958766, "outcome": "passed"}, "call": {"duration": 0.000615723999999318, "outcome": "passed"}, "teardown": {"duration": 0.00018419200000607816, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_output_bounded", "lineno": 22, "outcome": "passed", "keywords": ["test_rolling_corr_output_bounded", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.11893843100000367, "outcome": "passed"}, "call": {"duration": 0.0010379180000086308, "outcome": "passed"}, "teardown": {"duration": 0.00019655500000226311, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_middle_east_index_averages_epicenter_tickers", "lineno": 31, "outcome": "passed", "keywords": ["test_middle_east_index_averages_epicenter_tickers", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.0057582460000276114, "outcome": "passed"}, "call": {"duration": 0.00676969400001326, "outcome": "passed"}, "teardown": {"duration": 0.00019268800002691933, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_rolling_corr_window_larger_than_series_is_all_nan", "lineno": 46, "outcome": "passed", "keywords": ["test_rolling_corr_window_larger_than_series_is_all_nan", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.005616282999994837, "outcome": "passed"}, "call": {"duration": 0.0006318929999906686, "outcome": "passed"}, "teardown": {"duration": 0.00018546399996921537, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_correlations.py::test_middle_east_index_empty_when_no_epicenter_rows", "lineno": 53, "outcome": "passed", "keywords": ["test_middle_east_index_empty_when_no_epicenter_rows", "test_contagion_correlations.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056914419999998245, "outcome": "passed"}, "call": {"duration": 0.005481291999956284, "outcome": "passed"}, "teardown": {"duration": 0.00021585000001778099, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_both_periods_present", "lineno": 40, "outcome": "passed", "keywords": ["test_both_periods_present", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.009093651000000591, "outcome": "passed"}, "call": {"duration": 0.0003878709999867169, "outcome": "passed"}, "teardown": {"duration": 0.00019221700000571218, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_all_asset_roles_present", "lineno": 46, "outcome": "passed", "keywords": ["test_all_asset_roles_present", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.005626341000038337, "outcome": "passed"}, "call": {"duration": 0.0002804309999646648, "outcome": "passed"}, "teardown": {"duration": 0.00018696800003681346, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_core_tickers_present_in_both_periods", "lineno": 52, "outcome": "passed", "keywords": ["test_core_tickers_present_in_both_periods", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.005612284999983785, "outcome": "passed"}, "call": {"duration": 0.0019038359999967724, "outcome": "passed"}, "teardown": {"duration": 0.0002117030000476916, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_minimum_row_counts_per_ticker[2020_us_iran-30-3]", "lineno": 59, "outcome": "passed", "keywords": ["test_minimum_row_counts_per_ticker[2020_us_iran-30-3]", "parametrize", "pytestmark", "2020_us_iran-30-3", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.005791747999978725, "outcome": "passed"}, "call": {"duration": 0.0026052289999825007, "outcome": "passed"}, "teardown": {"duration": 0.00022949599997446057, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_minimum_row_counts_per_ticker[2024_hormuz-200-12]", "lineno": 59, "outcome": "passed", "keywords": ["test_minimum_row_counts_per_ticker[2024_hormuz-200-12]", "parametrize", "pytestmark", "2024_hormuz-200-12", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.005891673999997238, "outcome": "passed"}, "call": {"duration": 0.002970658000037929, "outcome": "passed"}, "teardown": {"duration": 0.00020572199997559437, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_no_na_in_close_column", "lineno": 79, "outcome": "passed", "keywords": ["test_no_na_in_close_column", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.006672564999973929, "outcome": "passed"}, "call": {"duration": 0.0002792389999513034, "outcome": "passed"}, "teardown": {"duration": 0.0001850440000339404, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_data_quality.py::test_close_values_are_positive", "lineno": 83, "outcome": "passed", "keywords": ["test_close_values_are_positive", "test_contagion_data_quality.py", "tests", "dashboard", ""], "setup": {"duration": 0.005580366000003778, "outcome": "passed"}, "call": {"duration": 0.0011403979999613512, "outcome": "passed"}, "teardown": {"duration": 0.00020261700001356076, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_red_at_plus_one", "lineno": 6, "outcome": "passed", "keywords": ["test_correlation_to_color_red_at_plus_one", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.005649904999984301, "outcome": "passed"}, "call": {"duration": 0.00013087299998915114, "outcome": "passed"}, "teardown": {"duration": 0.00020441899999923407, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_green_at_minus_one", "lineno": 12, "outcome": "passed", "keywords": ["test_correlation_to_color_green_at_minus_one", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.005612955999993119, "outcome": "passed"}, "call": {"duration": 0.00015388599996413177, "outcome": "passed"}, "teardown": {"duration": 0.00017990399999234796, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_gray_at_zero", "lineno": 18, "outcome": "passed", "keywords": ["test_correlation_to_color_gray_at_zero", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.005671225000014601, "outcome": "passed"}, "call": {"duration": 0.0001291700000365381, "outcome": "passed"}, "teardown": {"duration": 0.0001814970000282301, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_correlation_to_color_clips_out_of_range", "lineno": 24, "outcome": "passed", "keywords": ["test_correlation_to_color_clips_out_of_range", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.005583290999993551, "outcome": "passed"}, "call": {"duration": 0.00013693500000044878, "outcome": "passed"}, "teardown": {"duration": 0.0002040389999820036, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_globe.py::test_build_arc_layer_returns_one_arc_per_destination", "lineno": 29, "outcome": "passed", "keywords": ["test_build_arc_layer_returns_one_arc_per_destination", "test_contagion_globe.py", "tests", "dashboard", ""], "setup": {"duration": 0.005575987999975496, "outcome": "passed"}, "call": {"duration": 0.00018411199999945893, "outcome": "passed"}, "teardown": {"duration": 0.0001841019999915261, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_returns_all_rows_when_no_period", "lineno": 23, "outcome": "passed", "keywords": ["test_load_events_returns_all_rows_when_no_period", "test_contagion_loader.py", "tests", "dashboard", ""], "setup": {"duration": 0.006108166000046822, "outcome": "passed"}, "call": {"duration": 0.003522852999992665, "outcome": "passed"}, "teardown": {"duration": 0.00019887899998138892, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_filters_by_period", "lineno": 30, "outcome": "passed", "keywords": ["test_load_events_filters_by_period", "test_contagion_loader.py", "tests", "dashboard", ""], "setup": {"duration": 0.005949782000016057, "outcome": "passed"}, "call": {"duration": 0.003886469000008219, "outcome": "passed"}, "teardown": {"duration": 0.00019453100003374857, "outcome": "passed"}}, {"nodeid": "tests/test_contagion_loader.py::test_load_events_raises_when_file_missing", "lineno": 38, "outcome": "passed", "keywords": ["test_load_events_raises_when_file_missing", "test_contagion_loader.py", "tests", "dashboard", ""], "setup": {"duration": 0.005947387999981402, "outcome": "passed"}, "call": {"duration": 0.00018641599996271907, "outcome": "passed"}, "teardown": {"duration": 0.00021513900003355957, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005614769000032993, "outcome": "passed"}, "call": {"duration": 0.07104835399997, "outcome": "passed", "stderr": "2026-05-07 09:59:58.565 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019896899999594098, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005695199000001594, "outcome": "passed"}, "call": {"duration": 0.06842867800003205, "outcome": "passed", "stderr": "2026-05-07 09:59:58.642 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00024538499997106555, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056738090000294505, "outcome": "passed"}, "call": {"duration": 0.06842344800003275, "outcome": "passed", "stderr": "2026-05-07 09:59:58.717 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002266909999661948, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005705347999992227, "outcome": "passed"}, "call": {"duration": 0.06823094999998602, "outcome": "passed", "stderr": "2026-05-07 09:59:58.792 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002082569999970474, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005749058999981571, "outcome": "passed"}, "call": {"duration": 0.06839652799999385, "outcome": "passed", "stderr": "2026-05-07 09:59:58.866 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019969100003436324, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_default_mode_shows_payment_input", "lineno": 37, "outcome": "passed", "keywords": ["test_default_mode_shows_payment_input", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005767132999949354, "outcome": "passed"}, "call": {"duration": 0.06777338099999497, "outcome": "passed", "stderr": "2026-05-07 09:59:58.941 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019537299999683455, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_has_metrics", "lineno": 44, "outcome": "passed", "keywords": ["test_has_metrics", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.006858859999965716, "outcome": "passed"}, "call": {"duration": 0.06831577799999877, "outcome": "passed", "stderr": "2026-05-07 09:59:59.016 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002047000000402477, "outcome": "passed"}}, {"nodeid": "tests/test_credit_card_calculator.py::TestCreditCardCalculator::test_switch_to_target_mode", "lineno": 48, "outcome": "passed", "keywords": ["test_switch_to_target_mode", "TestCreditCardCalculator", "test_credit_card_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.0057445410000127595, "outcome": "passed"}, "call": {"duration": 0.13582248400001617, "outcome": "passed", "stderr": "2026-05-07 09:59:59.091 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002107610000052773, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.005805303999977696, "outcome": "passed"}, "call": {"duration": 0.09222275899998067, "outcome": "passed", "stderr": "2026-05-07 09:59:59.234 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022122100000387945, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.006519179000008535, "outcome": "passed"}, "call": {"duration": 0.044553532000009, "outcome": "passed", "stderr": "2026-05-07 09:59:59.333 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019727599999441736, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.005788491999965117, "outcome": "passed"}, "call": {"duration": 0.042214922999960436, "outcome": "passed", "stderr": "2026-05-07 09:59:59.384 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023098899998785782, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_data_editor", "lineno": 24, "outcome": "skipped", "keywords": ["test_has_data_editor", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.00641111799995997, "outcome": "passed"}, "call": {"duration": 0.04256189200003746, "outcome": "skipped", "stderr": "2026-05-07 09:59:59.433 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n", "longrepr": "('/home/runner/work/QuantLab/QuantLab/dashboard/tests/test_crypto_portfolio.py', 31, \"Skipped: data_editor not exposed in this Streamlit version's AppTest\")"}, "teardown": {"duration": 0.0002021459999923536, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_has_metrics", "lineno": 32, "outcome": "passed", "keywords": ["test_has_metrics", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.005789644000003591, "outcome": "passed"}, "call": {"duration": 0.04281638100002283, "outcome": "passed", "stderr": "2026-05-07 09:59:59.483 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022444699999368822, "outcome": "passed"}}, {"nodeid": "tests/test_crypto_portfolio.py::TestCryptoPortfolio::test_metric_labels", "lineno": 37, "outcome": "passed", "keywords": ["test_metric_labels", "TestCryptoPortfolio", "test_crypto_portfolio.py", "tests", "dashboard", ""], "setup": {"duration": 0.005811144000006152, "outcome": "passed"}, "call": {"duration": 0.042141961000027095, "outcome": "passed", "stderr": "2026-05-07 09:59:59.532 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019325900001376795, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.005861827999979141, "outcome": "passed"}, "call": {"duration": 0.05288978400000133, "outcome": "passed", "stderr": "2026-05-07 09:59:59.580 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.000214028000016242, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.005862739999997757, "outcome": "passed"}, "call": {"duration": 0.05353277800003298, "outcome": "passed", "stderr": "2026-05-07 09:59:59.640 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002336229999855277, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_base_currency_selectbox", "lineno": 20, "outcome": "passed", "keywords": ["test_has_base_currency_selectbox", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.005973005999976522, "outcome": "passed"}, "call": {"duration": 0.05344954399998869, "outcome": "passed", "stderr": "2026-05-07 09:59:59.700 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021773399998892273, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_base_currency_options", "lineno": 25, "outcome": "passed", "keywords": ["test_base_currency_options", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.00593385200005514, "outcome": "passed"}, "call": {"duration": 0.05414240800001835, "outcome": "passed", "stderr": "2026-05-07 09:59:59.760 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.000233443000013267, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_target_multiselect", "lineno": 31, "outcome": "passed", "keywords": ["test_has_target_multiselect", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006017387999975199, "outcome": "passed"}, "call": {"duration": 0.053935996999996405, "outcome": "passed", "stderr": "2026-05-07 09:59:59.821 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00025536400005421456, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_amount_number_input", "lineno": 36, "outcome": "passed", "keywords": ["test_has_amount_number_input", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006195689000037419, "outcome": "passed"}, "call": {"duration": 0.05459048699998448, "outcome": "passed", "stderr": "2026-05-07 09:59:59.882 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002303179999785243, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_has_expected_tabs_with_targets", "lineno": 41, "outcome": "passed", "keywords": ["test_has_expected_tabs_with_targets", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006060342000012042, "outcome": "passed"}, "call": {"duration": 0.05421838699999171, "outcome": "passed", "stderr": "2026-05-07 09:59:59.944 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002209510000170667, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_shows_metrics_for_targets", "lineno": 46, "outcome": "passed", "keywords": ["test_shows_metrics_for_targets", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059493559999737045, "outcome": "passed"}, "call": {"duration": 0.18230218500002593, "outcome": "passed", "stderr": "2026-05-07 10:00:00.004 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.000232391999986703, "outcome": "passed"}}, {"nodeid": "tests/test_currency_dashboard.py::TestCurrencyDashboard::test_error_on_fetch_failure", "lineno": 51, "outcome": "passed", "keywords": ["test_error_on_fetch_failure", "TestCurrencyDashboard", "test_currency_dashboard.py", "tests", "dashboard", ""], "setup": {"duration": 0.006154316999982257, "outcome": "passed"}, "call": {"duration": 0.00969686000001957, "outcome": "passed", "stderr": "2026-05-07 10:00:00.194 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00027974999994739846, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005720479999979489, "outcome": "passed"}, "call": {"duration": 0.07167191000002049, "outcome": "passed", "stderr": "2026-05-07 10:00:00.210 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020742499998505082, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005822960999978477, "outcome": "passed"}, "call": {"duration": 0.06947435000000723, "outcome": "passed", "stderr": "2026-05-07 10:00:00.288 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002678779999882863, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.008793642000000546, "outcome": "passed"}, "call": {"duration": 0.07752958600002557, "outcome": "passed", "stderr": "2026-05-07 10:00:00.367 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021885700004986575, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_ticker_text_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005795499999976528, "outcome": "passed"}, "call": {"duration": 0.07001442299997507, "outcome": "passed", "stderr": "2026-05-07 10:00:00.451 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00025212799999962954, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_sector_multiselect", "lineno": 29, "outcome": "passed", "keywords": ["test_has_sector_multiselect", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.006048679999992146, "outcome": "passed"}, "call": {"duration": 0.06898742399999946, "outcome": "passed", "stderr": "2026-05-07 10:00:00.528 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020682500002067172, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_has_company_multiselect", "lineno": 35, "outcome": "passed", "keywords": ["test_has_company_multiselect", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005817600999989736, "outcome": "passed"}, "call": {"duration": 0.06850830500002303, "outcome": "passed", "stderr": "2026-05-07 10:00:00.604 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020748599996522898, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_fallback_to_sample_scores", "lineno": 41, "outcome": "passed", "keywords": ["test_fallback_to_sample_scores", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005899123000006057, "outcome": "passed"}, "call": {"duration": 0.06862126200002194, "outcome": "passed", "stderr": "2026-05-07 10:00:00.679 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022409700000025623, "outcome": "passed"}}, {"nodeid": "tests/test_esg_tracker.py::TestESGTracker::test_warning_for_sample_data", "lineno": 49, "outcome": "passed", "keywords": ["test_warning_for_sample_data", "TestESGTracker", "test_esg_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.00580429600000798, "outcome": "passed"}, "call": {"duration": 0.0679647750000072, "outcome": "passed", "stderr": "2026-05-07 10:00:00.754 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002255689999515198, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.005951418999984526, "outcome": "passed"}, "call": {"duration": 0.0944274299999961, "outcome": "passed", "stderr": "2026-05-07 10:00:00.828 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002044999999952779, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.005846735000034187, "outcome": "passed"}, "call": {"duration": 0.09300090000004957, "outcome": "passed", "stderr": "2026-05-07 10:00:00.929 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022474700000429948, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.0058525959999542465, "outcome": "passed"}, "call": {"duration": 0.09397808399995711, "outcome": "passed", "stderr": "2026-05-07 10:00:01.029 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020997100000386126, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_ticker_text_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.005901837000010346, "outcome": "passed"}, "call": {"duration": 0.09249391700001297, "outcome": "passed", "stderr": "2026-05-07 10:00:01.130 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020547200000464727, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.005748673999960374, "outcome": "passed"}, "call": {"duration": 0.09146907299998475, "outcome": "passed", "stderr": "2026-05-07 10:00:01.228 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020032300000139003, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_download_buttons", "lineno": 34, "outcome": "passed", "keywords": ["test_has_download_buttons", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.0057380239999815785, "outcome": "passed"}, "call": {"duration": 0.09214773399997966, "outcome": "passed", "stderr": "2026-05-07 10:00:01.326 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002035179999779757, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_download_button_labels", "lineno": 42, "outcome": "passed", "keywords": ["test_download_button_labels", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.005750155999976414, "outcome": "passed"}, "call": {"duration": 0.09241081499999382, "outcome": "passed", "stderr": "2026-05-07 10:00:01.425 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002479310000467194, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_has_metrics", "lineno": 49, "outcome": "passed", "keywords": ["test_has_metrics", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.005980905000001258, "outcome": "passed"}, "call": {"duration": 0.09273873200004346, "outcome": "passed", "stderr": "2026-05-07 10:00:01.524 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019924000002902176, "outcome": "passed"}}, {"nodeid": "tests/test_financial_reporting.py::TestFinancialReporting::test_metric_labels", "lineno": 53, "outcome": "passed", "keywords": ["test_metric_labels", "TestFinancialReporting", "test_financial_reporting.py", "tests", "dashboard", ""], "setup": {"duration": 0.0060222210000233645, "outcome": "passed"}, "call": {"duration": 0.09174605699996619, "outcome": "passed", "stderr": "2026-05-07 10:00:01.623 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019627500000751752, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_loads_without_error", "lineno": 10, "outcome": "passed", "keywords": ["test_loads_without_error", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.005810478000000785, "outcome": "passed"}, "call": {"duration": 0.08664102899996351, "outcome": "passed", "stderr": "2026-05-07 10:00:01.722 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002607049999596711, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_shows_title", "lineno": 14, "outcome": "passed", "keywords": ["test_shows_title", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.005862204000038673, "outcome": "passed"}, "call": {"duration": 0.07737597299995969, "outcome": "passed", "stderr": "2026-05-07 10:00:01.815 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002468389999989995, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_period_radio", "lineno": 19, "outcome": "passed", "keywords": ["test_has_period_radio", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.005798885999979575, "outcome": "passed"}, "call": {"duration": 0.19999159700000746, "outcome": "passed", "stderr": "2026-05-07 10:00:01.899 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021981800000503426, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_timeline_slider", "lineno": 27, "outcome": "passed", "keywords": ["test_has_timeline_slider", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.005867733999991742, "outcome": "passed"}, "call": {"duration": 0.07697523899997805, "outcome": "passed", "stderr": "2026-05-07 10:00:02.105 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022357599999622835, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_has_play_button", "lineno": 31, "outcome": "passed", "keywords": ["test_has_play_button", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059101830000258815, "outcome": "passed"}, "call": {"duration": 0.07634665000000496, "outcome": "passed", "stderr": "2026-05-07 10:00:02.189 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021809499997971216, "outcome": "passed"}}, {"nodeid": "tests/test_global_contagion.py::TestGlobalContagionPage::test_side_panel_renders_four_metrics", "lineno": 38, "outcome": "passed", "keywords": ["test_side_panel_renders_four_metrics", "TestGlobalContagionPage", "test_global_contagion.py", "tests", "dashboard", ""], "setup": {"duration": 0.005739565999988372, "outcome": "passed"}, "call": {"duration": 0.07905530400000771, "outcome": "passed", "stderr": "2026-05-07 10:00:02.272 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002015050000068186, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_returns_one_row_per_destination", "lineno": 13, "outcome": "passed", "keywords": ["test_returns_one_row_per_destination", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.00589918299999681, "outcome": "passed"}, "call": {"duration": 0.00015851500000962915, "outcome": "passed"}, "teardown": {"duration": 0.00020455999998603147, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_row_keys_present", "lineno": 18, "outcome": "passed", "keywords": ["test_row_keys_present", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.005753892999962318, "outcome": "passed"}, "call": {"duration": 0.000149177000025702, "outcome": "passed"}, "teardown": {"duration": 0.0001750650000076348, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_missing_destination_uses_default", "lineno": 28, "outcome": "passed", "keywords": ["test_missing_destination_uses_default", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.005725850000033006, "outcome": "passed"}, "call": {"duration": 0.00014852600003223415, "outcome": "passed"}, "teardown": {"duration": 0.00020134400000415553, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_extra_meta_forwarded", "lineno": 34, "outcome": "passed", "keywords": ["test_extra_meta_forwarded", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.005665028000009897, "outcome": "passed"}, "call": {"duration": 0.0001489970000534413, "outcome": "passed"}, "teardown": {"duration": 0.00018113699997002186, "outcome": "passed"}}, {"nodeid": "tests/test_globe_arc.py::test_source_matches_input", "lineno": 40, "outcome": "passed", "keywords": ["test_source_matches_input", "test_globe_arc.py", "tests", "dashboard", ""], "setup": {"duration": 0.005772096999976384, "outcome": "passed"}, "call": {"duration": 0.00014209400001163885, "outcome": "passed"}, "teardown": {"duration": 0.00018014500000163025, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_at_zero_is_zero_anchor", "lineno": 4, "outcome": "passed", "keywords": ["test_diverging_color_at_zero_is_zero_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005676389000029758, "outcome": "passed"}, "call": {"duration": 0.0001557589999947595, "outcome": "passed"}, "teardown": {"duration": 0.00017655799996418864, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_pos_one_reaches_pos_anchor", "lineno": 10, "outcome": "passed", "keywords": ["test_diverging_color_pos_one_reaches_pos_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056712090000132775, "outcome": "passed"}, "call": {"duration": 0.00012813800003641518, "outcome": "passed"}, "teardown": {"duration": 0.00018165699998462514, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_neg_one_reaches_neg_anchor", "lineno": 15, "outcome": "passed", "keywords": ["test_diverging_color_neg_one_reaches_neg_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005719639000005827, "outcome": "passed"}, "call": {"duration": 0.00013162499999452848, "outcome": "passed"}, "teardown": {"duration": 0.00018263999999135194, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_alpha_scales_with_magnitude", "lineno": 20, "outcome": "passed", "keywords": ["test_diverging_color_alpha_scales_with_magnitude", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005755996999994295, "outcome": "passed"}, "call": {"duration": 0.00013140499999053645, "outcome": "passed"}, "teardown": {"duration": 0.0001788229999988289, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_diverging_color_clamps_outside_range", "lineno": 26, "outcome": "passed", "keywords": ["test_diverging_color_clamps_outside_range", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.0064471119999893745, "outcome": "passed"}, "call": {"duration": 0.00013469999998960702, "outcome": "passed"}, "teardown": {"duration": 0.00018004499997914536, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_at_zero_is_low_anchor", "lineno": 33, "outcome": "passed", "keywords": ["test_sequential_color_at_zero_is_low_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005705673000022671, "outcome": "passed"}, "call": {"duration": 0.00020874799997727678, "outcome": "passed"}, "teardown": {"duration": 0.0001805850000096143, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_at_one_is_high_anchor", "lineno": 39, "outcome": "passed", "keywords": ["test_sequential_color_at_one_is_high_anchor", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056981200000336685, "outcome": "passed"}, "call": {"duration": 0.00012862800002721997, "outcome": "passed"}, "teardown": {"duration": 0.00017978500000026543, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_sequential_color_clamps", "lineno": 45, "outcome": "passed", "keywords": ["test_sequential_color_clamps", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005728766000004271, "outcome": "passed"}, "call": {"duration": 0.00013114400002223192, "outcome": "passed"}, "teardown": {"duration": 0.00020230699999501667, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_min_at_zero", "lineno": 50, "outcome": "passed", "keywords": ["test_value_to_width_min_at_zero", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005601639999952113, "outcome": "passed"}, "call": {"duration": 0.0001281479999875046, "outcome": "passed"}, "teardown": {"duration": 0.00017836099999612998, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_max_at_one", "lineno": 54, "outcome": "passed", "keywords": ["test_value_to_width_max_at_one", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005610226000044349, "outcome": "passed"}, "call": {"duration": 0.00013348800001722338, "outcome": "passed"}, "teardown": {"duration": 0.00018183800000315387, "outcome": "passed"}}, {"nodeid": "tests/test_globe_color.py::test_value_to_width_uses_abs", "lineno": 58, "outcome": "passed", "keywords": ["test_value_to_width_uses_abs", "test_globe_color.py", "tests", "dashboard", ""], "setup": {"duration": 0.005642746000035004, "outcome": "passed"}, "call": {"duration": 0.0001285789999769804, "outcome": "passed"}, "teardown": {"duration": 0.00020233599997254714, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005619964000004529, "outcome": "passed"}, "call": {"duration": 0.03589421399999537, "outcome": "passed", "stderr": "2026-05-07 10:00:02.461 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019133600000031947, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005734777999975904, "outcome": "passed"}, "call": {"duration": 0.034560225000006994, "outcome": "passed", "stderr": "2026-05-07 10:00:02.503 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00018873100003702348, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005683152000017344, "outcome": "passed"}, "call": {"duration": 0.03453846500002555, "outcome": "passed", "stderr": "2026-05-07 10:00:02.544 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021594100002175765, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005745617999991737, "outcome": "passed"}, "call": {"duration": 0.033846218000007866, "outcome": "passed", "stderr": "2026-05-07 10:00:02.585 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019182699998054886, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.006193118999988201, "outcome": "passed"}, "call": {"duration": 0.03372557500000539, "outcome": "passed", "stderr": "2026-05-07 10:00:02.625 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022492799996598478, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_sliders", "lineno": 37, "outcome": "passed", "keywords": ["test_has_sliders", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005655089000015323, "outcome": "passed"}, "call": {"duration": 0.03445937799995136, "outcome": "passed", "stderr": "2026-05-07 10:00:02.666 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00018964200000937126, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_has_metrics", "lineno": 44, "outcome": "passed", "keywords": ["test_has_metrics", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005677551000019321, "outcome": "passed"}, "call": {"duration": 0.03433017699995844, "outcome": "passed", "stderr": "2026-05-07 10:00:02.706 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00018921200000932004, "outcome": "passed"}}, {"nodeid": "tests/test_investment_planner.py::TestInvestmentPlanner::test_switch_to_goal_mode", "lineno": 48, "outcome": "passed", "keywords": ["test_switch_to_goal_mode", "TestInvestmentPlanner", "test_investment_planner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005735448999985238, "outcome": "passed"}, "call": {"duration": 0.06908109800002649, "outcome": "passed", "stderr": "2026-05-07 10:00:02.747 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019740699997328193, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.006155939999985094, "outcome": "passed"}, "call": {"duration": 0.03720730499998126, "outcome": "passed", "stderr": "2026-05-07 10:00:02.823 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019145600003867003, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005772196999998869, "outcome": "passed"}, "call": {"duration": 0.03707072100002051, "outcome": "passed", "stderr": "2026-05-07 10:00:02.867 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022132099996952093, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005765523999968991, "outcome": "passed"}, "call": {"duration": 0.037263429000006454, "outcome": "passed", "stderr": "2026-05-07 10:00:02.910 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.000209248999965439, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005732471999976951, "outcome": "passed"}, "call": {"duration": 0.037421864000009464, "outcome": "passed", "stderr": "2026-05-07 10:00:02.954 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001894430000106695, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.0062355480000064745, "outcome": "passed"}, "call": {"duration": 0.03634308900001315, "outcome": "passed", "stderr": "2026-05-07 10:00:02.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022515800003475306, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_default_mode_has_term_selectbox", "lineno": 37, "outcome": "passed", "keywords": ["test_default_mode_has_term_selectbox", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005799607999961154, "outcome": "passed"}, "call": {"duration": 0.036833969999975125, "outcome": "passed", "stderr": "2026-05-07 10:00:03.041 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00018878100001984421, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_has_metrics", "lineno": 44, "outcome": "passed", "keywords": ["test_has_metrics", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005833269999982349, "outcome": "passed"}, "call": {"duration": 0.037250265000011495, "outcome": "passed", "stderr": "2026-05-07 10:00:03.084 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002141379999898163, "outcome": "passed"}}, {"nodeid": "tests/test_loan_amortization.py::TestLoanAmortization::test_switch_to_budget_mode", "lineno": 48, "outcome": "passed", "keywords": ["test_switch_to_budget_mode", "TestLoanAmortization", "test_loan_amortization.py", "tests", "dashboard", ""], "setup": {"duration": 0.0060151280000013685, "outcome": "passed"}, "call": {"duration": 0.07470681199998808, "outcome": "passed", "stderr": "2026-05-07 10:00:03.128 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001982379999958539, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.005815799000004063, "outcome": "passed"}, "call": {"duration": 0.04258005899998807, "outcome": "passed", "stderr": "2026-05-07 10:00:03.209 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:03.239 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.00019868900000119538, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.005801271000052566, "outcome": "passed"}, "call": {"duration": 0.04178528200003484, "outcome": "passed", "stderr": "2026-05-07 10:00:03.258 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:03.288 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.0001863470000103007, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_expected_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.005686007000008431, "outcome": "passed"}, "call": {"duration": 0.04207141400002001, "outcome": "passed", "stderr": "2026-05-07 10:00:03.306 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:03.336 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.00022015900003680144, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.005755555999996886, "outcome": "passed"}, "call": {"duration": 0.04147455500003616, "outcome": "passed", "stderr": "2026-05-07 10:00:03.355 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:03.384 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.00018994200001998252, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.0057482220000224515, "outcome": "passed"}, "call": {"duration": 0.041738005000013345, "outcome": "passed", "stderr": "2026-05-07 10:00:03.403 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:03.432 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.0002155409999886615, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_selectbox_for_terms", "lineno": 37, "outcome": "passed", "keywords": ["test_has_selectbox_for_terms", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.005819795000036265, "outcome": "passed"}, "call": {"duration": 0.042314154999985476, "outcome": "passed", "stderr": "2026-05-07 10:00:03.451 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:03.480 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.00021122200001855163, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_has_metrics", "lineno": 43, "outcome": "passed", "keywords": ["test_has_metrics", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.005887239999992744, "outcome": "passed"}, "call": {"duration": 0.0418044669999631, "outcome": "passed", "stderr": "2026-05-07 10:00:03.500 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:03.529 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.00019212699999116012, "outcome": "passed"}}, {"nodeid": "tests/test_loan_comparison.py::TestLoanComparison::test_switch_to_rate_sensitivity_mode", "lineno": 47, "outcome": "passed", "keywords": ["test_switch_to_rate_sensitivity_mode", "TestLoanComparison", "test_loan_comparison.py", "tests", "dashboard", ""], "setup": {"duration": 0.005781995000006646, "outcome": "passed"}, "call": {"duration": 0.08041524099996877, "outcome": "passed", "stderr": "2026-05-07 10:00:03.548 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:03.577 Serialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.\nTraceback (most recent call last):\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/dataframe_util.py\", line 961, in convert_pandas_df_to_arrow_bytes\n table = pa.Table.from_pandas(df)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/table.pxi\", line 4768, in pyarrow.lib.Table.from_pandas\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in dataframe_to_arrays\n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 651, in \n arrays = [convert_column(c, f)\n ^^^^^^^^^^^^^^^^^^^^\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 639, in convert_column\n raise e\n File \"/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/pyarrow/pandas_compat.py\", line 633, in convert_column\n result = pa.array(col, type=type_, from_pandas=True, safe=safe)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"pyarrow/array.pxi\", line 390, in pyarrow.lib.array\n File \"pyarrow/array.pxi\", line 91, in pyarrow.lib._ndarray_to_array\n File \"pyarrow/error.pxi\", line 92, in pyarrow.lib.check_status\npyarrow.lib.ArrowInvalid: (\"Could not convert '--' with type str: tried to convert to double\", 'Conversion failed for column payment_B with type object')\n"}, "teardown": {"duration": 0.000222183000005316, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.005806710999991083, "outcome": "passed"}, "call": {"duration": 0.05878642099997933, "outcome": "passed", "stderr": "2026-05-07 10:00:03.635 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002372310000282596, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.007862450999994053, "outcome": "passed"}, "call": {"duration": 0.17931444500004545, "outcome": "passed", "stderr": "2026-05-07 10:00:03.703 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002239159999817275, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_two_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.006149599000025319, "outcome": "passed"}, "call": {"duration": 0.03538856699998405, "outcome": "passed", "stderr": "2026-05-07 10:00:03.889 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022009999997862906, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_model_radio", "lineno": 24, "outcome": "passed", "keywords": ["test_has_model_radio", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.005804917999967074, "outcome": "passed"}, "call": {"duration": 0.03490771100001666, "outcome": "passed", "stderr": "2026-05-07 10:00:03.931 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019025299997110778, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_test_size_slider", "lineno": 29, "outcome": "passed", "keywords": ["test_has_test_size_slider", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.005807392000008349, "outcome": "passed"}, "call": {"duration": 0.0347518600000285, "outcome": "passed", "stderr": "2026-05-07 10:00:03.972 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019234699999515215, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_has_five_number_inputs", "lineno": 34, "outcome": "passed", "keywords": ["test_has_five_number_inputs", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.006295539000007011, "outcome": "passed"}, "call": {"duration": 0.03490103100000397, "outcome": "passed", "stderr": "2026-05-07 10:00:04.014 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019013299998960065, "outcome": "passed"}}, {"nodeid": "tests/test_loan_default.py::TestLoanDefault::test_random_forest_mode", "lineno": 41, "outcome": "passed", "keywords": ["test_random_forest_mode", "TestLoanDefault", "test_loan_default.py", "tests", "dashboard", ""], "setup": {"duration": 0.005810207999957129, "outcome": "passed"}, "call": {"duration": 0.2627876790000414, "outcome": "passed", "stderr": "2026-05-07 10:00:04.055 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.000236819999997806, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage::test_loads_without_error", "lineno": 14, "outcome": "passed", "keywords": ["test_loads_without_error", "TestLondonHousePricesPage", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059916349999866725, "outcome": "passed"}, "call": {"duration": 0.7566117989999839, "outcome": "passed", "stderr": "2026-05-07 10:00:04.325 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002479300000004514, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestLondonHousePricesPage::test_shows_title", "lineno": 18, "outcome": "passed", "keywords": ["test_shows_title", "TestLondonHousePricesPage", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061383670000054735, "outcome": "passed"}, "call": {"duration": 0.6049735710000164, "outcome": "passed", "stderr": "2026-05-07 10:00:05.089 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002788379999856261, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_load_ppd_returns_dataframe", "lineno": 43, "outcome": "passed", "keywords": ["test_load_ppd_returns_dataframe", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.00798957700004621, "outcome": "passed"}, "call": {"duration": 0.0008108970000080262, "outcome": "passed"}, "teardown": {"duration": 0.00019561400000611684, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_aggregate_by_district_year", "lineno": 50, "outcome": "passed", "keywords": ["test_aggregate_by_district_year", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.007624448999990818, "outcome": "passed"}, "call": {"duration": 0.005693591000010656, "outcome": "passed"}, "teardown": {"duration": 0.0001988700000197241, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_aggregate_empty_district", "lineno": 56, "outcome": "passed", "keywords": ["test_aggregate_empty_district", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.007628195999984655, "outcome": "passed"}, "call": {"duration": 0.0011398280000207706, "outcome": "passed"}, "teardown": {"duration": 0.00021502000004147703, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_get_all_districts_summary", "lineno": 61, "outcome": "passed", "keywords": ["test_get_all_districts_summary", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.007515936999993755, "outcome": "passed"}, "call": {"duration": 0.005222364999951878, "outcome": "passed"}, "teardown": {"duration": 0.00019180600003210202, "outcome": "passed"}}, {"nodeid": "tests/test_london_house_prices.py::TestHousePriceHelpers::test_query_overpass_returns_list", "lineno": 67, "outcome": "passed", "keywords": ["test_query_overpass_returns_list", "TestHousePriceHelpers", "test_london_house_prices.py", "tests", "dashboard", ""], "setup": {"duration": 0.00615131099999644, "outcome": "passed"}, "call": {"duration": 0.0009115340000107608, "outcome": "passed"}, "teardown": {"duration": 0.00020824699998911456, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_loads_without_error", "lineno": 20, "outcome": "passed", "keywords": ["test_loads_without_error", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.005563538999979301, "outcome": "passed"}, "call": {"duration": 0.06077371300000323, "outcome": "passed", "stderr": "2026-05-07 10:00:05.755 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002430419999654987, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_shows_title", "lineno": 25, "outcome": "passed", "keywords": ["test_shows_title", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.005713276999983918, "outcome": "passed"}, "call": {"duration": 0.048744731999988744, "outcome": "passed", "stderr": "2026-05-07 10:00:05.822 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020515099998874575, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_two_tabs", "lineno": 31, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.005741499999999178, "outcome": "passed"}, "call": {"duration": 0.048394915000017136, "outcome": "passed", "stderr": "2026-05-07 10:00:05.877 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023536700001614008, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_ticker_input", "lineno": 36, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.005775172000028306, "outcome": "passed"}, "call": {"duration": 0.049509186000022964, "outcome": "passed", "stderr": "2026-05-07 10:00:05.932 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023469600000680657, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_period_selectbox", "lineno": 42, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.005674725999995189, "outcome": "passed"}, "call": {"duration": 0.04866767499999014, "outcome": "passed", "stderr": "2026-05-07 10:00:05.988 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023160099999586237, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_headline_text_area", "lineno": 47, "outcome": "passed", "keywords": ["test_has_headline_text_area", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.005764181999950324, "outcome": "passed"}, "call": {"duration": 0.04822365699999409, "outcome": "passed", "stderr": "2026-05-07 10:00:06.043 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001992200000131561, "outcome": "passed"}}, {"nodeid": "tests/test_market_insights.py::TestMarketInsights::test_has_reset_button", "lineno": 52, "outcome": "passed", "keywords": ["test_has_reset_button", "TestMarketInsights", "test_market_insights.py", "tests", "dashboard", ""], "setup": {"duration": 0.005708517999948981, "outcome": "passed"}, "call": {"duration": 0.049616264999997384, "outcome": "passed", "stderr": "2026-05-07 10:00:06.098 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019678500001418797, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.00591088400000217, "outcome": "passed"}, "call": {"duration": 0.21775274600003058, "outcome": "passed", "stderr": "2026-05-07 10:00:06.154 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00024150899997721353, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061863959999755025, "outcome": "passed"}, "call": {"duration": 0.06882909900002687, "outcome": "passed", "stderr": "2026-05-07 10:00:06.379 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022747299999537063, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_income_number_input", "lineno": 20, "outcome": "passed", "keywords": ["test_has_income_number_input", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005820266000000629, "outcome": "passed"}, "call": {"duration": 0.06713326799996366, "outcome": "passed", "stderr": "2026-05-07 10:00:06.454 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021795499998233936, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_data_editors", "lineno": 25, "outcome": "skipped", "keywords": ["test_has_data_editors", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005845253000018147, "outcome": "passed"}, "call": {"duration": 0.06676310000000285, "outcome": "skipped", "stderr": "2026-05-07 10:00:06.528 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n", "longrepr": "('/home/runner/work/QuantLab/QuantLab/dashboard/tests/test_personal_finance.py', 32, \"Skipped: data_editor not exposed in this Streamlit version's AppTest\")"}, "teardown": {"duration": 0.00021696300001394775, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_expected_tabs", "lineno": 33, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.00580077999995865, "outcome": "passed"}, "call": {"duration": 0.06726166699996838, "outcome": "passed", "stderr": "2026-05-07 10:00:06.601 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019585500001539913, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_net_worth_metric", "lineno": 38, "outcome": "passed", "keywords": ["test_has_net_worth_metric", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005855361999977049, "outcome": "passed"}, "call": {"duration": 0.06742396900000358, "outcome": "passed", "stderr": "2026-05-07 10:00:06.675 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019561300001669224, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_has_savings_rate_metric", "lineno": 43, "outcome": "passed", "keywords": ["test_has_savings_rate_metric", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005827079000027879, "outcome": "passed"}, "call": {"duration": 0.06733096499999647, "outcome": "passed", "stderr": "2026-05-07 10:00:06.749 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002334030000383791, "outcome": "passed"}}, {"nodeid": "tests/test_personal_finance.py::TestPersonalFinance::test_no_external_api_calls", "lineno": 48, "outcome": "passed", "keywords": ["test_no_external_api_calls", "TestPersonalFinance", "test_personal_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.00592288699999699, "outcome": "passed"}, "call": {"duration": 0.06688901400002578, "outcome": "passed", "stderr": "2026-05-07 10:00:06.823 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002449460000093495, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_loads_without_error", "lineno": 14, "outcome": "passed", "keywords": ["test_loads_without_error", "TestPlottingLibrariesPage", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.005820787000004657, "outcome": "passed"}, "call": {"duration": 3.7479912919999947, "outcome": "passed", "stderr": "2026-05-07 10:00:06.896 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:10.444 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:10.520 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:10.575 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:10.622 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.00024998499998218904, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_shows_title", "lineno": 18, "outcome": "passed", "keywords": ["test_shows_title", "TestPlottingLibrariesPage", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006297132999975474, "outcome": "passed"}, "call": {"duration": 1.7884836110000037, "outcome": "passed", "stderr": "2026-05-07 10:00:10.651 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:12.243 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:12.318 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:12.372 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:12.419 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.0002476199999819073, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_has_ticker_input", "lineno": 23, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestPlottingLibrariesPage", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006023124000023472, "outcome": "passed"}, "call": {"duration": 1.9087644290000298, "outcome": "passed", "stderr": "2026-05-07 10:00:12.446 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:14.155 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:14.231 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:14.284 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:14.334 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.00029132099996331817, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlottingLibrariesPage::test_has_period_selectbox", "lineno": 28, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestPlottingLibrariesPage", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006124590000013086, "outcome": "passed"}, "call": {"duration": 1.7490382359999899, "outcome": "passed", "stderr": "2026-05-07 10:00:14.362 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n2026-05-07 10:00:15.914 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:15.991 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:16.044 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n2026-05-07 10:00:16.090 Please replace `st.components.v1.html` with `st.iframe`.\n\n`st.components.v1.html` will be removed after 2026-06-01.\n"}, "teardown": {"duration": 0.00028905799996437054, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_line_chart_returns_figure", "lineno": 52, "outcome": "passed", "keywords": ["test_line_chart_returns_figure", "TestPlotlyCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006923705000019709, "outcome": "passed"}, "call": {"duration": 0.004586121999977877, "outcome": "passed"}, "teardown": {"duration": 0.00021154399996703432, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_candlestick_returns_figure", "lineno": 59, "outcome": "passed", "keywords": ["test_candlestick_returns_figure", "TestPlotlyCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.007298864000006233, "outcome": "passed"}, "call": {"duration": 0.003584214999989399, "outcome": "passed"}, "teardown": {"duration": 0.00020318800000040937, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_volume_bar_returns_figure", "lineno": 66, "outcome": "passed", "keywords": ["test_volume_bar_returns_figure", "TestPlotlyCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.00636919100003297, "outcome": "passed"}, "call": {"duration": 0.0035364370000365852, "outcome": "passed"}, "teardown": {"duration": 0.0002049209999768209, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestPlotlyCharts::test_returns_histogram_returns_figure", "lineno": 73, "outcome": "passed", "keywords": ["test_returns_histogram_returns_figure", "TestPlotlyCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006381535000002714, "outcome": "passed"}, "call": {"duration": 0.002959070999963842, "outcome": "passed"}, "teardown": {"duration": 0.0002084380000155761, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_line_chart_returns_figure", "lineno": 82, "outcome": "passed", "keywords": ["test_line_chart_returns_figure", "TestMatplotlibCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006355235999990327, "outcome": "passed"}, "call": {"duration": 0.04564656299999115, "outcome": "passed"}, "teardown": {"duration": 0.00025843099996336605, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_candlestick_returns_figure", "lineno": 89, "outcome": "passed", "keywords": ["test_candlestick_returns_figure", "TestMatplotlibCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006415769000000182, "outcome": "passed"}, "call": {"duration": 0.04752880900002765, "outcome": "passed"}, "teardown": {"duration": 0.00021415899999510657, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_volume_bar_returns_figure", "lineno": 96, "outcome": "passed", "keywords": ["test_volume_bar_returns_figure", "TestMatplotlibCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006402484000034292, "outcome": "passed"}, "call": {"duration": 0.05151326899999731, "outcome": "passed"}, "teardown": {"duration": 0.00020416000000977874, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestMatplotlibCharts::test_returns_histogram_returns_figure", "lineno": 102, "outcome": "passed", "keywords": ["test_returns_histogram_returns_figure", "TestMatplotlibCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.0066631999999913205, "outcome": "passed"}, "call": {"duration": 0.27674933299999793, "outcome": "passed"}, "teardown": {"duration": 0.00025776999996196537, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_line_chart_returns_chart", "lineno": 110, "outcome": "passed", "keywords": ["test_line_chart_returns_chart", "TestAltairCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006851079000000482, "outcome": "passed"}, "call": {"duration": 0.011263877999965644, "outcome": "passed"}, "teardown": {"duration": 0.00021094300001323063, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_candlestick_returns_chart", "lineno": 117, "outcome": "passed", "keywords": ["test_candlestick_returns_chart", "TestAltairCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006323245999965366, "outcome": "passed"}, "call": {"duration": 0.03172904299998436, "outcome": "passed"}, "teardown": {"duration": 0.00023225300003559823, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_volume_bar_returns_chart", "lineno": 124, "outcome": "passed", "keywords": ["test_volume_bar_returns_chart", "TestAltairCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006287830000019312, "outcome": "passed"}, "call": {"duration": 0.0018648939999934555, "outcome": "passed"}, "teardown": {"duration": 0.0002009840000027907, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestAltairCharts::test_returns_histogram_returns_chart", "lineno": 131, "outcome": "passed", "keywords": ["test_returns_histogram_returns_chart", "TestAltairCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006238479000046482, "outcome": "passed"}, "call": {"duration": 0.0016554740000174206, "outcome": "passed"}, "teardown": {"duration": 0.00020454100001643383, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_line_chart_returns_figure", "lineno": 140, "outcome": "passed", "keywords": ["test_line_chart_returns_figure", "TestBokehCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006323024999971949, "outcome": "passed"}, "call": {"duration": 0.020611527000028218, "outcome": "passed"}, "teardown": {"duration": 0.000233234999996057, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_candlestick_returns_figure", "lineno": 146, "outcome": "passed", "keywords": ["test_candlestick_returns_figure", "TestBokehCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006301436000001104, "outcome": "passed"}, "call": {"duration": 0.025635775000012018, "outcome": "passed"}, "teardown": {"duration": 0.00020737599999165468, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_volume_bar_returns_figure", "lineno": 152, "outcome": "passed", "keywords": ["test_volume_bar_returns_figure", "TestBokehCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006268473999966773, "outcome": "passed"}, "call": {"duration": 0.018744710000021314, "outcome": "passed"}, "teardown": {"duration": 0.00021203500000410713, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestBokehCharts::test_returns_histogram_returns_figure", "lineno": 158, "outcome": "passed", "keywords": ["test_returns_histogram_returns_figure", "TestBokehCharts", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006383860000028108, "outcome": "passed"}, "call": {"duration": 0.015870537000012064, "outcome": "passed"}, "teardown": {"duration": 0.0002338649999842346, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_no_outliers_in_clean_data", "lineno": 166, "outcome": "passed", "keywords": ["test_no_outliers_in_clean_data", "TestOutlierDetection", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.007879173999981504, "outcome": "passed"}, "call": {"duration": 0.001298549000011917, "outcome": "passed"}, "teardown": {"duration": 0.00020497200000590965, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_detects_injected_outlier", "lineno": 172, "outcome": "passed", "keywords": ["test_detects_injected_outlier", "TestOutlierDetection", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006331901999999445, "outcome": "passed"}, "call": {"duration": 0.001568731000020307, "outcome": "passed"}, "teardown": {"duration": 0.0001976780000063627, "outcome": "passed"}}, {"nodeid": "tests/test_plotting_libraries.py::TestOutlierDetection::test_compute_daily_returns", "lineno": 181, "outcome": "passed", "keywords": ["test_compute_daily_returns", "TestOutlierDetection", "test_plotting_libraries.py", "tests", "dashboard", ""], "setup": {"duration": 0.006340619000013703, "outcome": "passed"}, "call": {"duration": 0.0005556049999881907, "outcome": "passed"}, "teardown": {"duration": 0.00022382600002401887, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005684728000005634, "outcome": "passed"}, "call": {"duration": 0.1330468410000094, "outcome": "passed", "stderr": "2026-05-07 10:00:16.822 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020469099996489604, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005844926000008854, "outcome": "passed"}, "call": {"duration": 0.043456152000032944, "outcome": "passed", "stderr": "2026-05-07 10:00:16.961 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019411099998478676, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_multiselect_tickers", "lineno": 20, "outcome": "passed", "keywords": ["test_has_multiselect_tickers", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005677623999986281, "outcome": "passed"}, "call": {"duration": 0.044153504000007615, "outcome": "passed", "stderr": "2026-05-07 10:00:17.011 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022516899997526707, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.006031473000007281, "outcome": "passed"}, "call": {"duration": 0.04420352299996466, "outcome": "passed", "stderr": "2026-05-07 10:00:17.062 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002616080000166221, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_simulations_slider", "lineno": 33, "outcome": "passed", "keywords": ["test_has_simulations_slider", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005918371999996452, "outcome": "passed"}, "call": {"duration": 0.04313230200000362, "outcome": "passed", "stderr": "2026-05-07 10:00:17.113 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019962200002510144, "outcome": "passed"}}, {"nodeid": "tests/test_portfolio_optimization.py::TestPortfolioOptimization::test_has_risk_free_rate_input", "lineno": 38, "outcome": "passed", "keywords": ["test_has_risk_free_rate_input", "TestPortfolioOptimization", "test_portfolio_optimization.py", "tests", "dashboard", ""], "setup": {"duration": 0.005730943999992633, "outcome": "passed"}, "call": {"duration": 0.04268205899995792, "outcome": "passed", "stderr": "2026-05-07 10:00:17.162 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020485100003497791, "outcome": "passed"}}, {"nodeid": "tests/test_rent_vs_buy.py::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "test_rent_vs_buy.py", "tests", "dashboard", ""], "setup": {"duration": 0.005777168999998139, "outcome": "passed"}, "call": {"duration": 0.15976990799998703, "outcome": "passed", "stderr": "2026-05-07 10:00:17.212 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002631899999983034, "outcome": "passed"}}, {"nodeid": "tests/test_rent_vs_buy.py::test_has_bedroom_selectbox", "lineno": 16, "outcome": "passed", "keywords": ["test_has_bedroom_selectbox", "test_rent_vs_buy.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061139360000197485, "outcome": "passed"}, "call": {"duration": 0.07016910400000143, "outcome": "passed", "stderr": "2026-05-07 10:00:17.378 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00026482300000907344, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_charts.py::test_build_cost_over_time_chart_returns_figure", "lineno": 10, "outcome": "passed", "keywords": ["test_build_cost_over_time_chart_returns_figure", "test_rentbuy_charts.py", "tests", "dashboard", ""], "setup": {"duration": 0.006366426999989017, "outcome": "passed"}, "call": {"duration": 0.010067750000018805, "outcome": "passed"}, "teardown": {"duration": 0.00020500199997286472, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[125000-0]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[125000-0]", "parametrize", "pytestmark", "125000-0", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005935203999968053, "outcome": "passed"}, "call": {"duration": 0.0001480259999766531, "outcome": "passed"}, "teardown": {"duration": 0.00021447899996474007, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[250000-2500]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[250000-2500]", "parametrize", "pytestmark", "250000-2500", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005826160000026448, "outcome": "passed"}, "call": {"duration": 0.0001385180000283981, "outcome": "passed"}, "teardown": {"duration": 0.0001895229999604453, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[400000-10000]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[400000-10000]", "parametrize", "pytestmark", "400000-10000", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005920717000037712, "outcome": "passed"}, "call": {"duration": 0.00013831800004027173, "outcome": "passed"}, "teardown": {"duration": 0.00019680599996263481, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[500000-15000]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[500000-15000]", "parametrize", "pytestmark", "500000-15000", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005798540000000685, "outcome": "passed"}, "call": {"duration": 0.00014100200002076235, "outcome": "passed"}, "teardown": {"duration": 0.00018774000000121305, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[925000-36250]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[925000-36250]", "parametrize", "pytestmark", "925000-36250", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059546919999888814, "outcome": "passed"}, "call": {"duration": 0.0001412319999758438, "outcome": "passed"}, "teardown": {"duration": 0.00019154599999637867, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[1000000-43750]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[1000000-43750]", "parametrize", "pytestmark", "1000000-43750", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059265579999987494, "outcome": "passed"}, "call": {"duration": 0.00013747600002034233, "outcome": "passed"}, "teardown": {"duration": 0.00021303699998043157, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[1500000-93750]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[1500000-93750]", "parametrize", "pytestmark", "1500000-93750", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005908804999990025, "outcome": "passed"}, "call": {"duration": 0.00013570300001219948, "outcome": "passed"}, "teardown": {"duration": 0.0001848050000035073, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_standard[2000000-153750]", "lineno": 32, "outcome": "passed", "keywords": ["test_sdlt_standard[2000000-153750]", "parametrize", "pytestmark", "2000000-153750", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005914644999961638, "outcome": "passed"}, "call": {"duration": 0.0001646169999958147, "outcome": "passed"}, "teardown": {"duration": 0.00019138700002940823, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[300000-0]", "lineno": 47, "outcome": "passed", "keywords": ["test_sdlt_first_time_buyer[300000-0]", "parametrize", "pytestmark", "300000-0", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006051621000040086, "outcome": "passed"}, "call": {"duration": 0.00013555200001746925, "outcome": "passed"}, "teardown": {"duration": 0.00019765700000107245, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[400000-5000]", "lineno": 47, "outcome": "passed", "keywords": ["test_sdlt_first_time_buyer[400000-5000]", "parametrize", "pytestmark", "400000-5000", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006683947999988504, "outcome": "passed"}, "call": {"duration": 0.0001339190000066992, "outcome": "passed"}, "teardown": {"duration": 0.00018895199997359668, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_first_time_buyer[500000-10000]", "lineno": 47, "outcome": "passed", "keywords": ["test_sdlt_first_time_buyer[500000-10000]", "parametrize", "pytestmark", "500000-10000", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005821341999990182, "outcome": "passed"}, "call": {"duration": 0.0001366550000057032, "outcome": "passed"}, "teardown": {"duration": 0.00019324999999525971, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_sdlt_ftb_above_cap_uses_standard", "lineno": 52, "outcome": "passed", "keywords": ["test_sdlt_ftb_above_cap_uses_standard", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005698202000019137, "outcome": "passed"}, "call": {"duration": 0.00013485100004118067, "outcome": "passed"}, "teardown": {"duration": 0.00017709899998408218, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_standard_case", "lineno": 61, "outcome": "passed", "keywords": ["test_mortgage_payment_standard_case", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005722057000014047, "outcome": "passed"}, "call": {"duration": 0.00012873999997964347, "outcome": "passed"}, "teardown": {"duration": 0.00022177300002113043, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_zero_interest", "lineno": 67, "outcome": "passed", "keywords": ["test_mortgage_payment_zero_interest", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005929121999997733, "outcome": "passed"}, "call": {"duration": 0.00012876000005235255, "outcome": "passed"}, "teardown": {"duration": 0.00017864299996972477, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_mortgage_payment_scales_with_principal", "lineno": 73, "outcome": "passed", "keywords": ["test_mortgage_payment_scales_with_principal", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005735702000038145, "outcome": "passed"}, "call": {"duration": 0.00014210500000899629, "outcome": "passed"}, "teardown": {"duration": 0.00018307100003767118, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_at_start_equals_principal", "lineno": 80, "outcome": "passed", "keywords": ["test_remaining_balance_at_start_equals_principal", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005818456999975297, "outcome": "passed"}, "call": {"duration": 0.00012760700002445446, "outcome": "passed"}, "teardown": {"duration": 0.00017897399999355912, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_partial_term", "lineno": 84, "outcome": "passed", "keywords": ["test_remaining_balance_partial_term", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005666803999986314, "outcome": "passed"}, "call": {"duration": 0.0001317050000011477, "outcome": "passed"}, "teardown": {"duration": 0.00020463099997414247, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_at_end_is_zero", "lineno": 90, "outcome": "passed", "keywords": ["test_remaining_balance_at_end_is_zero", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0058158409999578, "outcome": "passed"}, "call": {"duration": 0.00013581299998577379, "outcome": "passed"}, "teardown": {"duration": 0.0001817080000137139, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_remaining_balance_zero_interest", "lineno": 95, "outcome": "passed", "keywords": ["test_remaining_balance_zero_interest", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0057501090000187105, "outcome": "passed"}, "call": {"duration": 0.0001268460000005689, "outcome": "passed"}, "teardown": {"duration": 0.00020396000002165238, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_60", "lineno": 121, "outcome": "passed", "keywords": ["test_suggest_rate_ltv_60", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.00602979999996478, "outcome": "passed"}, "call": {"duration": 0.0007712260000403148, "outcome": "passed"}, "teardown": {"duration": 0.00018884200000002238, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_75", "lineno": 125, "outcome": "passed", "keywords": ["test_suggest_rate_ltv_75", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0068404399999622, "outcome": "passed"}, "call": {"duration": 0.0008554030000027524, "outcome": "passed"}, "teardown": {"duration": 0.00018890100000135135, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_ltv_95", "lineno": 129, "outcome": "passed", "keywords": ["test_suggest_rate_ltv_95", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059197439999820745, "outcome": "passed"}, "call": {"duration": 0.0008293040000353358, "outcome": "passed"}, "teardown": {"duration": 0.0001926790000084111, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_above_top_bracket", "lineno": 133, "outcome": "passed", "keywords": ["test_suggest_rate_above_top_bracket", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.00600529500002267, "outcome": "passed"}, "call": {"duration": 0.0009187809999957608, "outcome": "passed"}, "teardown": {"duration": 0.00019146699997918404, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_suggest_rate_bracket_boundary_rounds_up", "lineno": 138, "outcome": "passed", "keywords": ["test_suggest_rate_bracket_boundary_rounds_up", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059846259999858376, "outcome": "passed"}, "call": {"duration": 0.0007662970000410496, "outcome": "passed"}, "teardown": {"duration": 0.00021602200001780147, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_buying_returns_expected_keys", "lineno": 186, "outcome": "passed", "keywords": ["test_total_cost_of_buying_returns_expected_keys", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061019039999905544, "outcome": "passed"}, "call": {"duration": 0.00015324499997859675, "outcome": "passed"}, "teardown": {"duration": 0.00022052099996017205, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_buying_upfront_includes_all_components", "lineno": 198, "outcome": "passed", "keywords": ["test_total_cost_of_buying_upfront_includes_all_components", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006015353000009327, "outcome": "passed"}, "call": {"duration": 0.00015708199998698547, "outcome": "passed"}, "teardown": {"duration": 0.00018352199998616925, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_flat_includes_service_charge_and_ground_rent", "lineno": 208, "outcome": "passed", "keywords": ["test_total_cost_flat_includes_service_charge_and_ground_rent", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006063511999968796, "outcome": "passed"}, "call": {"duration": 0.00016668999995772538, "outcome": "passed"}, "teardown": {"duration": 0.00018208900002036899, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_house_ignores_service_charge_even_if_set", "lineno": 216, "outcome": "passed", "keywords": ["test_total_cost_house_ignores_service_charge_even_if_set", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005900999999994383, "outcome": "passed"}, "call": {"duration": 0.0001702779999845916, "outcome": "passed"}, "teardown": {"duration": 0.0001865280000288294, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_auto_tier_rate_uses_boe_lookup", "lineno": 223, "outcome": "passed", "keywords": ["test_total_cost_auto_tier_rate_uses_boe_lookup", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059342520000313925, "outcome": "passed"}, "call": {"duration": 0.0007788409999989199, "outcome": "passed"}, "teardown": {"duration": 0.00018840999996427854, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_equity_at_sale_positive", "lineno": 229, "outcome": "passed", "keywords": ["test_total_cost_equity_at_sale_positive", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006023940000034145, "outcome": "passed"}, "call": {"duration": 0.00017463499995074017, "outcome": "passed"}, "teardown": {"duration": 0.00018363200001658697, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_includes_remortgage_fees_with_frictions", "lineno": 235, "outcome": "passed", "keywords": ["test_total_cost_includes_remortgage_fees_with_frictions", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.0069099390000246785, "outcome": "passed"}, "call": {"duration": 0.00014975900000990805, "outcome": "passed"}, "teardown": {"duration": 0.00021766499997966093, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_no_remortgage_fees_without_frictions", "lineno": 243, "outcome": "passed", "keywords": ["test_total_cost_no_remortgage_fees_without_frictions", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006007828999997855, "outcome": "passed"}, "call": {"duration": 0.00014915799999926094, "outcome": "passed"}, "teardown": {"duration": 0.00018523500000355853, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_no_remortgage_when_plan_shorter_than_fix", "lineno": 250, "outcome": "passed", "keywords": ["test_total_cost_no_remortgage_when_plan_shorter_than_fix", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006172245000016119, "outcome": "passed"}, "call": {"duration": 0.0001494989999741847, "outcome": "passed"}, "teardown": {"duration": 0.0001841729999796371, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_cash_rich_buyer_gets_investment_income", "lineno": 258, "outcome": "passed", "keywords": ["test_cash_rich_buyer_gets_investment_income", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005986429000017779, "outcome": "passed"}, "call": {"duration": 0.00019034500002135246, "outcome": "passed"}, "teardown": {"duration": 0.00018591600002082487, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_isa_toggle_increases_investment_income", "lineno": 265, "outcome": "passed", "keywords": ["test_isa_toggle_increases_investment_income", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005952516000036212, "outcome": "passed"}, "call": {"duration": 0.0001662399999986519, "outcome": "passed"}, "teardown": {"duration": 0.00018865099997356083, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_total_cost_of_renting_returns_expected_keys", "lineno": 277, "outcome": "passed", "keywords": ["test_total_cost_of_renting_returns_expected_keys", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005980707999981405, "outcome": "passed"}, "call": {"duration": 0.00014526100000011866, "outcome": "passed"}, "teardown": {"duration": 0.00018497499996783517, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_zero_rent_growth_total_is_simple_product", "lineno": 289, "outcome": "passed", "keywords": ["test_zero_rent_growth_total_is_simple_product", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005683513999997558, "outcome": "passed"}, "call": {"duration": 0.00018011500003467518, "outcome": "passed"}, "teardown": {"duration": 0.00018074700000170196, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_rent_growth_compounds", "lineno": 295, "outcome": "passed", "keywords": ["test_rent_growth_compounds", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005700587000035284, "outcome": "passed"}, "call": {"duration": 0.00015160199995989387, "outcome": "passed"}, "teardown": {"duration": 0.00018094699998982833, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_multiple_moves_with_long_term_frictions", "lineno": 301, "outcome": "passed", "keywords": ["test_multiple_moves_with_long_term_frictions", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005775065000023005, "outcome": "passed"}, "call": {"duration": 0.00017881299999089606, "outcome": "passed"}, "teardown": {"duration": 0.0001807170000347469, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_single_move_without_long_term_frictions", "lineno": 312, "outcome": "passed", "keywords": ["test_single_move_without_long_term_frictions", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005770837999989453, "outcome": "passed"}, "call": {"duration": 0.0001504400000271744, "outcome": "passed"}, "teardown": {"duration": 0.00017901299997902242, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_rent_opportunity_cost_greater_for_cash_rich", "lineno": 322, "outcome": "passed", "keywords": ["test_rent_opportunity_cost_greater_for_cash_rich", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.00665747900001179, "outcome": "passed"}, "call": {"duration": 0.0001740440000048693, "outcome": "passed"}, "teardown": {"duration": 0.00018605600001819766, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_breakeven_rent_positive", "lineno": 329, "outcome": "passed", "keywords": ["test_breakeven_rent_positive", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.006030031000022973, "outcome": "passed"}, "call": {"duration": 0.00016109000000597007, "outcome": "passed"}, "teardown": {"duration": 0.00022069100003818676, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_breakeven_rent_decreases_with_longer_stay", "lineno": 335, "outcome": "passed", "keywords": ["test_breakeven_rent_decreases_with_longer_stay", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005999994000035258, "outcome": "passed"}, "call": {"duration": 0.0001841029999809507, "outcome": "passed"}, "teardown": {"duration": 0.00018359199998485565, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_finance.py::test_scenario_accepts_bedrooms_field", "lineno": 342, "outcome": "passed", "keywords": ["test_scenario_accepts_bedrooms_field", "test_rentbuy_finance.py", "tests", "dashboard", ""], "setup": {"duration": 0.005702611000003799, "outcome": "passed"}, "call": {"duration": 0.00015992800001640717, "outcome": "passed"}, "teardown": {"duration": 0.00018994399999883171, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_district_to_borough_schema", "lineno": 18, "outcome": "passed", "keywords": ["test_load_district_to_borough_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005689616999973168, "outcome": "passed"}, "call": {"duration": 0.001068339999960699, "outcome": "passed"}, "teardown": {"duration": 0.00018619699994815164, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_borough_rents_schema", "lineno": 24, "outcome": "passed", "keywords": ["test_load_borough_rents_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.00564853100001983, "outcome": "passed"}, "call": {"duration": 0.0009133809999752884, "outcome": "passed"}, "teardown": {"duration": 0.00022230400003309114, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_borough_rents_by_bedroom_schema", "lineno": 30, "outcome": "passed", "keywords": ["test_load_borough_rents_by_bedroom_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056529990000058206, "outcome": "passed"}, "call": {"duration": 0.0009340089999909651, "outcome": "passed"}, "teardown": {"duration": 0.0002085079999574191, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_council_tax_schema", "lineno": 40, "outcome": "passed", "keywords": ["test_load_council_tax_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005713119999995797, "outcome": "passed"}, "call": {"duration": 0.0008934239999689453, "outcome": "passed"}, "teardown": {"duration": 0.00018407300001399562, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_load_boe_rates_schema", "lineno": 47, "outcome": "passed", "keywords": ["test_load_boe_rates_schema", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005756722000000991, "outcome": "passed"}, "call": {"duration": 0.0008092070000316198, "outcome": "passed"}, "teardown": {"duration": 0.00018426299999418916, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_known_borough", "lineno": 53, "outcome": "passed", "keywords": ["test_default_monthly_rent_known_borough", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005785764999984622, "outcome": "passed"}, "call": {"duration": 0.0024388820000353917, "outcome": "passed"}, "teardown": {"duration": 0.00020345899997664674, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_missing_borough_returns_fallback", "lineno": 60, "outcome": "passed", "keywords": ["test_default_monthly_rent_missing_borough_returns_fallback", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.006701861999999892, "outcome": "passed"}, "call": {"duration": 0.002671295000027385, "outcome": "passed"}, "teardown": {"duration": 0.00018827999997483857, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_with_bedroom_known_borough", "lineno": 69, "outcome": "passed", "keywords": ["test_default_monthly_rent_with_bedroom_known_borough", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005718971000021611, "outcome": "passed"}, "call": {"duration": 0.002261873000009018, "outcome": "passed"}, "teardown": {"duration": 0.00018642700001691992, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_with_bedroom_studio_smaller_than_2bed", "lineno": 81, "outcome": "passed", "keywords": ["test_default_monthly_rent_with_bedroom_studio_smaller_than_2bed", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005651536000016222, "outcome": "passed"}, "call": {"duration": 0.0027504919999614685, "outcome": "passed"}, "teardown": {"duration": 0.00022447899999633592, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_monthly_rent_falls_back_to_single_median_when_borough_missing", "lineno": 94, "outcome": "passed", "keywords": ["test_default_monthly_rent_falls_back_to_single_median_when_borough_missing", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.00572295900002473, "outcome": "passed"}, "call": {"duration": 0.0026622479999787174, "outcome": "passed"}, "teardown": {"duration": 0.00021207499997899504, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_council_tax_known_borough", "lineno": 108, "outcome": "passed", "keywords": ["test_default_council_tax_known_borough", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005677031999994142, "outcome": "passed"}, "call": {"duration": 0.0016089770000462522, "outcome": "passed"}, "teardown": {"duration": 0.00026518399999986286, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_council_tax_missing_borough_returns_fallback", "lineno": 114, "outcome": "passed", "keywords": ["test_default_council_tax_missing_borough_returns_fallback", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005684096000038608, "outcome": "passed"}, "call": {"duration": 0.0014243329999885646, "outcome": "passed"}, "teardown": {"duration": 0.00018562600001814644, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_lookup_boe_rate", "lineno": 120, "outcome": "passed", "keywords": ["test_lookup_boe_rate", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005660121000005347, "outcome": "passed"}, "call": {"duration": 0.0015239079999673777, "outcome": "passed"}, "teardown": {"duration": 0.00018570600002476567, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_with_postcode_and_property_type", "lineno": 126, "outcome": "passed", "keywords": ["test_default_home_price_with_postcode_and_property_type", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.005639322999968499, "outcome": "passed"}, "call": {"duration": 0.054933358000027965, "outcome": "passed"}, "teardown": {"duration": 0.0002331239999762147, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_falls_back_to_london_median", "lineno": 135, "outcome": "passed", "keywords": ["test_default_home_price_falls_back_to_london_median", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.006069292999995923, "outcome": "passed"}, "call": {"duration": 0.047922927999991316, "outcome": "passed"}, "teardown": {"duration": 0.0002559459999815772, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_with_bedrooms_filters", "lineno": 145, "outcome": "passed", "keywords": ["test_default_home_price_with_bedrooms_filters", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.00596788499996137, "outcome": "passed"}, "call": {"duration": 0.08389375600000903, "outcome": "passed"}, "teardown": {"duration": 0.00024871300001905183, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_falls_back_when_borough_missing", "lineno": 165, "outcome": "passed", "keywords": ["test_default_home_price_falls_back_when_borough_missing", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.007994579000012436, "outcome": "passed"}, "call": {"duration": 0.06305331100003286, "outcome": "passed"}, "teardown": {"duration": 0.00025431299997080714, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_inputs.py::test_default_home_price_without_bedrooms_uses_legacy_chain", "lineno": 182, "outcome": "passed", "keywords": ["test_default_home_price_without_bedrooms_uses_legacy_chain", "test_rentbuy_inputs.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059769920000007914, "outcome": "passed"}, "call": {"duration": 0.062470195999992484, "outcome": "passed"}, "teardown": {"duration": 0.0002469700000347075, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_returns_complete_result", "lineno": 10, "outcome": "passed", "keywords": ["test_run_scenario_returns_complete_result", "test_rentbuy_scenario.py", "tests", "dashboard", ""], "setup": {"duration": 0.006303430000002663, "outcome": "passed"}, "call": {"duration": 0.00031279299997777343, "outcome": "passed"}, "teardown": {"duration": 0.00019523399998888635, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_verdict_consistent_with_delta", "lineno": 22, "outcome": "passed", "keywords": ["test_run_scenario_verdict_consistent_with_delta", "test_rentbuy_scenario.py", "tests", "dashboard", ""], "setup": {"duration": 0.005971652000027916, "outcome": "passed"}, "call": {"duration": 0.0002820859999701497, "outcome": "passed"}, "teardown": {"duration": 0.00019143700001222896, "outcome": "passed"}}, {"nodeid": "tests/test_rentbuy_scenario.py::test_run_scenario_feasibility_flag", "lineno": 31, "outcome": "passed", "keywords": ["test_run_scenario_feasibility_flag", "test_rentbuy_scenario.py", "tests", "dashboard", ""], "setup": {"duration": 0.005966843000010158, "outcome": "passed"}, "call": {"duration": 0.0006415340000103242, "outcome": "passed"}, "teardown": {"duration": 0.00019563499995456368, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005693233000044984, "outcome": "passed"}, "call": {"duration": 0.033934761000011804, "outcome": "passed", "stderr": "2026-05-07 10:00:18.247 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019818900000245776, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005699934999995548, "outcome": "passed"}, "call": {"duration": 0.031478165000009994, "outcome": "passed", "stderr": "2026-05-07 10:00:18.287 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002552750000290871, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_top_level_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_top_level_tabs", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.006141989000013837, "outcome": "passed"}, "call": {"duration": 0.03209960300000603, "outcome": "passed", "stderr": "2026-05-07 10:00:18.325 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002394159999994372, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_radio_mode_selector", "lineno": 24, "outcome": "passed", "keywords": ["test_has_radio_mode_selector", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005761219999953937, "outcome": "passed"}, "call": {"duration": 0.03155928699999322, "outcome": "passed", "stderr": "2026-05-07 10:00:18.364 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023081000000502172, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_number_inputs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_number_inputs", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005677774999981011, "outcome": "passed"}, "call": {"duration": 0.03265500700001667, "outcome": "passed", "stderr": "2026-05-07 10:00:18.402 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022603100001106213, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_monte_carlo_checkbox", "lineno": 38, "outcome": "passed", "keywords": ["test_has_monte_carlo_checkbox", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005796425000028194, "outcome": "passed"}, "call": {"duration": 0.03164125900002546, "outcome": "passed", "stderr": "2026-05-07 10:00:18.441 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023532799997383336, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_has_metrics", "lineno": 44, "outcome": "passed", "keywords": ["test_has_metrics", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005832661999988886, "outcome": "passed"}, "call": {"duration": 0.03179171900001165, "outcome": "passed", "stderr": "2026-05-07 10:00:18.479 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002315809999799967, "outcome": "passed"}}, {"nodeid": "tests/test_retirement_calculator.py::TestRetirementCalculator::test_switch_to_target_mode", "lineno": 48, "outcome": "passed", "keywords": ["test_switch_to_target_mode", "TestRetirementCalculator", "test_retirement_calculator.py", "tests", "dashboard", ""], "setup": {"duration": 0.005701197999997021, "outcome": "passed"}, "call": {"duration": 0.06312330200000815, "outcome": "passed", "stderr": "2026-05-07 10:00:18.517 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021721400003116287, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_loads_without_error", "lineno": 20, "outcome": "passed", "keywords": ["test_loads_without_error", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006266341000014108, "outcome": "passed"}, "call": {"duration": 0.03814855799998895, "outcome": "passed", "stderr": "2026-05-07 10:00:18.587 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002719160000310694, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_shows_title", "lineno": 25, "outcome": "passed", "keywords": ["test_shows_title", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006518060000018977, "outcome": "passed"}, "call": {"duration": 0.0299034579999784, "outcome": "passed", "stderr": "2026-05-07 10:00:18.633 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019299000001637978, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_analyzer_radio", "lineno": 31, "outcome": "passed", "keywords": ["test_has_analyzer_radio", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005781288000036966, "outcome": "passed"}, "call": {"duration": 0.02929139299999406, "outcome": "passed", "stderr": "2026-05-07 10:00:18.669 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022628099998200923, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_headline_text_area", "lineno": 37, "outcome": "passed", "keywords": ["test_has_headline_text_area", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.0061158600000226215, "outcome": "passed"}, "call": {"duration": 0.02906427799996436, "outcome": "passed", "stderr": "2026-05-07 10:00:18.705 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001922580000268681, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_has_reset_button", "lineno": 42, "outcome": "passed", "keywords": ["test_has_reset_button", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005766849999986334, "outcome": "passed"}, "call": {"duration": 0.028741366000019752, "outcome": "passed", "stderr": "2026-05-07 10:00:18.741 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023422599997502402, "outcome": "passed"}}, {"nodeid": "tests/test_sentiment_analysis.py::TestSentimentAnalysis::test_textblob_mode", "lineno": 50, "outcome": "passed", "keywords": ["test_textblob_mode", "TestSentimentAnalysis", "test_sentiment_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005753856000012547, "outcome": "passed"}, "call": {"duration": 0.29169784900000195, "outcome": "passed", "stderr": "2026-05-07 10:00:18.776 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00025558599998021236, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.006103908000000047, "outcome": "passed"}, "call": {"duration": 0.07466500800001086, "outcome": "passed", "stderr": "2026-05-07 10:00:19.074 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019998199996962285, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005690468000011606, "outcome": "passed"}, "call": {"duration": 0.07256739100000686, "outcome": "passed", "stderr": "2026-05-07 10:00:19.155 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001958849999823542, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_top_level_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_top_level_tabs", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005713882000009107, "outcome": "passed"}, "call": {"duration": 0.07294826099996499, "outcome": "passed", "stderr": "2026-05-07 10:00:19.234 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021781499998496656, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_ticker_text_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005714753000006567, "outcome": "passed"}, "call": {"duration": 0.07216288799997983, "outcome": "passed", "stderr": "2026-05-07 10:00:19.314 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019997200001853344, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005783731000008174, "outcome": "passed"}, "call": {"duration": 0.07273540400001366, "outcome": "passed", "stderr": "2026-05-07 10:00:19.392 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019640499999695749, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_sma_checkbox", "lineno": 34, "outcome": "passed", "keywords": ["test_has_sma_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005673526000009588, "outcome": "passed"}, "call": {"duration": 0.07293915299999298, "outcome": "passed", "stderr": "2026-05-07 10:00:19.471 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019914099999596147, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_ema_checkbox", "lineno": 39, "outcome": "passed", "keywords": ["test_has_ema_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005728078000004189, "outcome": "passed"}, "call": {"duration": 0.07184179999995877, "outcome": "passed", "stderr": "2026-05-07 10:00:19.551 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019372099995962344, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_bollinger_checkbox", "lineno": 44, "outcome": "passed", "keywords": ["test_has_bollinger_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005728477999980441, "outcome": "passed"}, "call": {"duration": 0.07266957100000582, "outcome": "passed", "stderr": "2026-05-07 10:00:19.629 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019279899998991823, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_rsi_checkbox", "lineno": 49, "outcome": "passed", "keywords": ["test_has_rsi_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.00573520099999314, "outcome": "passed"}, "call": {"duration": 0.07286126799999693, "outcome": "passed", "stderr": "2026-05-07 10:00:19.708 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020166600000948165, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_has_macd_checkbox", "lineno": 54, "outcome": "passed", "keywords": ["test_has_macd_checkbox", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005765817999986211, "outcome": "passed"}, "call": {"duration": 0.07313374599999634, "outcome": "passed", "stderr": "2026-05-07 10:00:19.787 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020037399997363536, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_sma_checked_by_default", "lineno": 59, "outcome": "passed", "keywords": ["test_sma_checked_by_default", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.00584773100001712, "outcome": "passed"}, "call": {"duration": 0.07184308099999726, "outcome": "passed", "stderr": "2026-05-07 10:00:19.867 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019579500002464556, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_rsi_checked_by_default", "lineno": 64, "outcome": "passed", "keywords": ["test_rsi_checked_by_default", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.005708911999988686, "outcome": "passed"}, "call": {"duration": 0.30628748499998437, "outcome": "passed", "stderr": "2026-05-07 10:00:19.945 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022459899997784305, "outcome": "passed"}}, {"nodeid": "tests/test_stock_analysis.py::TestStockAnalysis::test_macd_checked_by_default", "lineno": 69, "outcome": "passed", "keywords": ["test_macd_checked_by_default", "TestStockAnalysis", "test_stock_analysis.py", "tests", "dashboard", ""], "setup": {"duration": 0.0062526960000468534, "outcome": "passed"}, "call": {"duration": 0.07532796300000655, "outcome": "passed", "stderr": "2026-05-07 10:00:20.259 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002025279999884333, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.005742313999974158, "outcome": "passed"}, "call": {"duration": 0.05063574299998663, "outcome": "passed", "stderr": "2026-05-07 10:00:20.340 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.000193911999986085, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.005797997999991367, "outcome": "passed"}, "call": {"duration": 0.043989082999985385, "outcome": "passed", "stderr": "2026-05-07 10:00:20.398 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001950029999875369, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_two_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_two_tabs", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.00597311099994613, "outcome": "passed"}, "call": {"duration": 0.041926287000023876, "outcome": "passed", "stderr": "2026-05-07 10:00:20.448 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019144499998446918, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_ticker_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.006256136999979844, "outcome": "passed"}, "call": {"duration": 0.04174299199996767, "outcome": "passed", "stderr": "2026-05-07 10:00:20.497 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019068400001742702, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_period_selectbox", "lineno": 29, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.005911215000026004, "outcome": "passed"}, "call": {"duration": 0.04383639099995662, "outcome": "passed", "stderr": "2026-05-07 10:00:20.545 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00021704300002056698, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_model_radio", "lineno": 33, "outcome": "passed", "keywords": ["test_has_model_radio", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.005979030999981205, "outcome": "passed"}, "call": {"duration": 0.04197661800003516, "outcome": "passed", "stderr": "2026-05-07 10:00:20.596 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023926500000470696, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_has_test_size_slider", "lineno": 38, "outcome": "passed", "keywords": ["test_has_test_size_slider", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.005832108999982211, "outcome": "passed"}, "call": {"duration": 0.041850974000055885, "outcome": "passed", "stderr": "2026-05-07 10:00:20.644 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001979979999759962, "outcome": "passed"}}, {"nodeid": "tests/test_stock_prediction.py::TestStockPrediction::test_random_forest_mode", "lineno": 43, "outcome": "passed", "keywords": ["test_random_forest_mode", "TestStockPrediction", "test_stock_prediction.py", "tests", "dashboard", ""], "setup": {"duration": 0.005888242000025912, "outcome": "passed"}, "call": {"duration": 0.20161992800001372, "outcome": "passed", "stderr": "2026-05-07 10:00:20.693 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023047799999176277, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0060192060000190395, "outcome": "passed"}, "call": {"duration": 0.09802769200001649, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:20.901 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.000236047999976563, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_shows_title", "lineno": 25, "outcome": "passed", "keywords": ["test_shows_title", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.00592866699997785, "outcome": "passed"}, "call": {"duration": 0.090291475000015, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:21.006 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020283700001755278, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_expected_tabs", "lineno": 30, "outcome": "passed", "keywords": ["test_has_expected_tabs", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059123670000076345, "outcome": "passed"}, "call": {"duration": 0.09007090500000459, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:21.103 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00025628600002391977, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_ticker_text_input", "lineno": 34, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005904802999964431, "outcome": "passed"}, "call": {"duration": 0.09054130999999188, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:21.199 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019673600002079183, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_period_radio", "lineno": 40, "outcome": "passed", "keywords": ["test_has_period_radio", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.00591328899997734, "outcome": "passed"}, "call": {"duration": 0.09075719999998455, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:21.297 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00025785899998709283, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_weight_sliders", "lineno": 45, "outcome": "passed", "keywords": ["test_has_weight_sliders", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005980284000031588, "outcome": "passed"}, "call": {"duration": 0.09222951800001056, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:21.394 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00025337099998523627, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_scan_button", "lineno": 49, "outcome": "passed", "keywords": ["test_has_scan_button", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.0060443429999850196, "outcome": "passed"}, "call": {"duration": 0.0907397579999838, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:21.493 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020015199999079414, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_preset_buttons", "lineno": 54, "outcome": "passed", "keywords": ["test_has_preset_buttons", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005792393999968226, "outcome": "passed"}, "call": {"duration": 0.08984485500002393, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:21.590 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002007730000173069, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_equal_weight_button", "lineno": 61, "outcome": "passed", "keywords": ["test_has_equal_weight_button", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005752250000000458, "outcome": "passed"}, "call": {"duration": 0.09066330599995354, "outcome": "passed", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:21.687 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023316300001852142, "outcome": "passed"}}, {"nodeid": "tests/test_stock_risk_scanner.py::TestStockRiskScanner::test_has_run_checks_button", "lineno": 66, "outcome": "skipped", "keywords": ["test_has_run_checks_button", "TestStockRiskScanner", "test_stock_risk_scanner.py", "tests", "dashboard", ""], "setup": {"duration": 0.005930149999983314, "outcome": "passed"}, "call": {"duration": 0.09065482999994856, "outcome": "skipped", "stdout": "\u001b[31m\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[31m\u2500\u2500\u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mexec_code.py\u001b[0m:129 in exec_func_with_error_handling \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/streamlit/runti\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2mme/scriptrunner/\u001b[0m\u001b[1mscript_runner.py\u001b[0m:689 in code_to_exec \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/pages/\u001b[0m\u001b[1m1_Stock_Risk_Scanner.py\u001b[0m:305 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m302 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c1: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m303 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(price_history_chart(prices), width=\u001b[33m'\u001b[0m\u001b[33mstretch\u001b[0m\u001b[33m'\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m304 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c2: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m305 \u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(\u001b[1;4mcumulative_return_chart(prices, scan_weights)\u001b[0m, \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m306 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0mc3, c4 = st.columns(\u001b[94m2\u001b[0m) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m307 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u001b[0m\u001b[94mwith\u001b[0m c3: \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m308 \u001b[0m\u001b[2m\u2502 \u2502 \u2502 \u2502 \u001b[0mst.plotly_chart(drawdown_chart(prices, scan_weights), width=\u001b[33m'\u001b[0m\u001b[33ms\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m/home/runner/work/QuantLab/QuantLab/dashboard/lib/\u001b[0m\u001b[1mcharts.py\u001b[0m:24 in \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m cumulative_return_chart \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m21 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m22 \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mcumulative_return_chart\u001b[0m(prices: pd.DataFrame, weights: \u001b[96mlist\u001b[0m[\u001b[96mfloat\u001b[0m]) -> go.F \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m23 \u001b[0m\u001b[2m\u2502 \u001b[0mlog_returns = np.log(prices / prices.shift(\u001b[94m1\u001b[0m)).dropna() \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[31m\u2771 \u001b[0m24 \u001b[2m\u2502 \u001b[0mportfolio_returns = \u001b[1;4mlog_returns.values @ np.array(weights)\u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m25 \u001b[0m\u001b[2m\u2502 \u001b[0mcumulative = np.exp(np.cumsum(portfolio_returns)) \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m26 \u001b[0m\u001b[2m\u2502 \u001b[0m \u001b[31m \u001b[0m\n\u001b[31m \u001b[0m \u001b[2m27 \u001b[0m\u001b[2m\u2502 \u001b[0mfig = go.Figure() \u001b[31m \u001b[0m\n\u001b[31m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n\u001b[1;91mValueError: \u001b[0mmatmul: Input operand \u001b[1;36m1\u001b[0m has a mismatch in its core dimension \u001b[1;36m0\u001b[0m, with gufunc \nsignature \u001b[1m(\u001b[0mn?,k\u001b[1m)\u001b[0m,\u001b[1m(\u001b[0mk,m?\u001b[1m)\u001b[0m->\u001b[1m(\u001b[0mn?,m?\u001b[1m)\u001b[0m \u001b[1m(\u001b[0msize \u001b[1;36m3\u001b[0m is different from \u001b[1;36m4\u001b[0m\u001b[1m)\u001b[0m\n", "stderr": "2026-05-07 10:00:21.784 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n", "longrepr": "('/home/runner/work/QuantLab/QuantLab/dashboard/tests/test_stock_risk_scanner.py', 76, 'Skipped: Page crashed before rendering Run Checks tab')"}, "teardown": {"duration": 0.00020237600000427847, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005804636999982904, "outcome": "passed"}, "call": {"duration": 0.04876429199998711, "outcome": "passed", "stderr": "2026-05-07 10:00:21.881 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001959850000048391, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005716142999972362, "outcome": "passed"}, "call": {"duration": 0.04789633899997625, "outcome": "passed", "stderr": "2026-05-07 10:00:21.936 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001991100000395818, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_top_level_tabs", "lineno": 20, "outcome": "passed", "keywords": ["test_has_top_level_tabs", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005635722999954851, "outcome": "passed"}, "call": {"duration": 0.04726592800000162, "outcome": "passed", "stderr": "2026-05-07 10:00:21.991 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020498100002441788, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_ticker_text_input", "lineno": 24, "outcome": "passed", "keywords": ["test_has_ticker_text_input", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005754613999954472, "outcome": "passed"}, "call": {"duration": 0.04748178799997049, "outcome": "passed", "stderr": "2026-05-07 10:00:22.044 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001925079999978152, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_ticker_default_value", "lineno": 29, "outcome": "passed", "keywords": ["test_ticker_default_value", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.0056889719999730914, "outcome": "passed"}, "call": {"duration": 0.04796056899999712, "outcome": "passed", "stderr": "2026-05-07 10:00:22.098 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019468199997163538, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_period_selectbox", "lineno": 34, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005734758000016882, "outcome": "passed"}, "call": {"duration": 0.047839613999997255, "outcome": "passed", "stderr": "2026-05-07 10:00:22.152 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019835899996678563, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_has_metrics", "lineno": 39, "outcome": "passed", "keywords": ["test_has_metrics", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.005714210000007824, "outcome": "passed"}, "call": {"duration": 0.0481272680000302, "outcome": "passed", "stderr": "2026-05-07 10:00:22.207 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023527700000158802, "outcome": "passed"}}, {"nodeid": "tests/test_stock_tracker.py::TestStockTracker::test_error_on_empty_data", "lineno": 43, "outcome": "passed", "keywords": ["test_error_on_empty_data", "TestStockTracker", "test_stock_tracker.py", "tests", "dashboard", ""], "setup": {"duration": 0.007998534999956064, "outcome": "passed", "stderr": "2026-05-07 10:00:22.261 No runtime found, using MemoryCacheStorageManager\n"}, "call": {"duration": 0.008301616999972339, "outcome": "passed", "stderr": "2026-05-07 10:00:22.263 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002040789999568915, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.005757759999994505, "outcome": "passed"}, "call": {"duration": 0.16729186999998547, "outcome": "passed", "stderr": "2026-05-07 10:00:22.278 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00023510699998041673, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_shows_title", "lineno": 17, "outcome": "passed", "keywords": ["test_shows_title", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.0060146879999933844, "outcome": "passed"}, "call": {"duration": 0.05220204500000136, "outcome": "passed", "stderr": "2026-05-07 10:00:22.452 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00020030199999609977, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_ticker_input", "lineno": 22, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.0059281970000029105, "outcome": "passed"}, "call": {"duration": 0.052275873000041884, "outcome": "passed", "stderr": "2026-05-07 10:00:22.511 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00022878499999023916, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_period_selectbox", "lineno": 27, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.005777878000003511, "outcome": "passed"}, "call": {"duration": 0.052096072000040294, "outcome": "passed", "stderr": "2026-05-07 10:00:22.570 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019575400000348964, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_loads_data_successfully", "lineno": 31, "outcome": "passed", "keywords": ["test_loads_data_successfully", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.005816779000042516, "outcome": "passed"}, "call": {"duration": 0.051336214000002656, "outcome": "passed", "stderr": "2026-05-07 10:00:22.628 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019801799999186187, "outcome": "passed"}}, {"nodeid": "tests/test_time_series.py::TestTimeSeries::test_has_tabs", "lineno": 36, "outcome": "passed", "keywords": ["test_has_tabs", "TestTimeSeries", "test_time_series.py", "tests", "dashboard", ""], "setup": {"duration": 0.005807602999993833, "outcome": "passed"}, "call": {"duration": 0.0520231969999827, "outcome": "passed", "stderr": "2026-05-07 10:00:22.686 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001930280000124185, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_loads_without_error", "lineno": 11, "outcome": "passed", "keywords": ["test_loads_without_error", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.005876551000028485, "outcome": "passed"}, "call": {"duration": 0.032090848999985155, "outcome": "passed", "stderr": "2026-05-07 10:00:22.745 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019344999998338608, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_shows_title", "lineno": 15, "outcome": "passed", "keywords": ["test_shows_title", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.0058687570000302, "outcome": "passed"}, "call": {"duration": 0.03148425999995652, "outcome": "passed", "stderr": "2026-05-07 10:00:22.783 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019682499998907588, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_ticker_input", "lineno": 20, "outcome": "passed", "keywords": ["test_has_ticker_input", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.005779571000005035, "outcome": "passed"}, "call": {"duration": 0.03060465999999451, "outcome": "passed", "stderr": "2026-05-07 10:00:22.821 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0001919069999871681, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_period_selectbox", "lineno": 25, "outcome": "passed", "keywords": ["test_has_period_selectbox", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.005870949999973618, "outcome": "passed"}, "call": {"duration": 0.03132631099998662, "outcome": "passed", "stderr": "2026-05-07 10:00:22.858 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.00019277799998462797, "outcome": "passed"}}, {"nodeid": "tests/test_var_cvar.py::TestVaRCVaR::test_has_confidence_slider", "lineno": 29, "outcome": "passed", "keywords": ["test_has_confidence_slider", "TestVaRCVaR", "test_var_cvar.py", "tests", "dashboard", ""], "setup": {"duration": 0.005768800999987889, "outcome": "passed"}, "call": {"duration": 0.030662427999970987, "outcome": "passed", "stderr": "2026-05-07 10:00:22.896 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"}, "teardown": {"duration": 0.0002689899999950285, "outcome": "passed"}}], "warnings": [{"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "X does not have valid feature names, but StandardScaler was fitted with feature names", "category": "UserWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/sklearn/utils/validation.py", "lineno": 2691}, {"message": "*choropleth_mapbox* is deprecated! Use *choropleth_map* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/home/runner/work/QuantLab/QuantLab/dashboard/pages/42_London_House_Prices.py", "lineno": 92}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 1049}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 2551}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/_plotly_utils/basevalidators.py", "lineno": 2669}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 2578}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/_plotly_utils/basevalidators.py", "lineno": 2669}, {"message": "*choropleth_mapbox* is deprecated! Use *choropleth_map* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/home/runner/work/QuantLab/QuantLab/dashboard/pages/42_London_House_Prices.py", "lineno": 92}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 1049}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 2551}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/_plotly_utils/basevalidators.py", "lineno": 2669}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/plotly/express/_core.py", "lineno": 2578}, {"message": "*choroplethmapbox* is deprecated! Use *choroplethmap* instead. Learn more at: https://plotly.com/python/mapbox-to-maplibre/", "category": "DeprecationWarning", "when": "runtest", "filename": "/opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/_plotly_utils/basevalidators.py", "lineno": 2669}]} \ No newline at end of file