[1m=== Unit Tests ===[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 1786 items

tests/unit/container/test_manager.py::test_shared_mode_creates_shared_container PASSED [  0%]
tests/unit/container/test_manager.py::test_shared_mode_reuses_running_container PASSED [  0%]
tests/unit/container/test_manager.py::test_shared_mode_custom_port PASSED [  0%]
tests/unit/container/test_manager.py::test_dedicated_mode_creates_project_container PASSED [  0%]
tests/unit/container/test_manager.py::test_dedicated_mode_persists_config PASSED [  0%]
tests/unit/container/test_manager.py::test_external_mode_connects_directly PASSED [  0%]
tests/unit/container/test_manager.py::test_dedicated_overrides_external PASSED [  0%]
tests/unit/container/test_manager.py::test_shared_mode_handles_name_conflict PASSED [  0%]
tests/unit/container/test_manager.py::test_stop_noop_for_shared_mode PASSED [  0%]
tests/unit/container/test_manager.py::test_stop_stops_dedicated_container PASSED [  0%]
tests/unit/container/test_manager.py::test_remove_dedicated_removes_container_and_config PASSED [  0%]
tests/unit/container/test_manager.py::test_remove_shared_only_deletes_config PASSED [  0%]
tests/unit/container/test_manager.py::test_docker_not_running_raises_on_get_connection PASSED [  0%]
tests/unit/container/test_manager.py::test_external_mode_no_docker_needed PASSED [  0%]
tests/unit/container/test_manager.py::test_docker_not_running_error_macos PASSED [  0%]
tests/unit/container/test_manager.py::test_docker_not_running_error_linux PASSED [  0%]
tests/unit/container/test_manager.py::test_wait_for_bolt_success PASSED  [  0%]
tests/unit/container/test_manager.py::test_wait_for_bolt_timeout PASSED  [  1%]
tests/unit/doctor/test_base.py::test_checkresult_has_required_fields PASSED [  1%]
tests/unit/doctor/test_base.py::test_checkresult_is_frozen PASSED        [  1%]
tests/unit/doctor/test_base.py::test_checkresult_fix_can_be_string PASSED [  1%]
tests/unit/doctor/test_base.py::test_checkstatus_valid_values PASSED     [  1%]
tests/unit/doctor/test_base.py::test_doctor_check_is_runtime_checkable PASSED [  1%]
tests/unit/doctor/test_base.py::test_incomplete_object_fails_protocol_check PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_exits_0_when_all_pass PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_exits_1_when_docker_fails PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_exits_0_when_warn_only PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_output_contains_check_name PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_output_contains_pass_status PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_output_contains_fail_status PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_output_contains_fix_for_failing_check PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_output_no_fix_for_passing_check PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_output_contains_group_header PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_output_contains_summary_line PASSED [  1%]
tests/unit/doctor/test_cli_doctor.py::test_doctor_runs_all_ten_checks PASSED [  1%]
tests/unit/doctor/test_csharp.py::test_dotnet_pass_when_list_runtimes_has_netcore_app PASSED [  2%]
tests/unit/doctor/test_csharp.py::test_dotnet_fail_when_not_on_path PASSED [  2%]
tests/unit/doctor/test_csharp.py::test_dotnet_fail_when_no_netcore_runtime PASSED [  2%]
tests/unit/doctor/test_csharp.py::test_dotnet_fail_when_list_runtimes_exits_nonzero PASSED [  2%]
tests/unit/doctor/test_csharp.py::test_dotnet_fail_when_timeout PASSED   [  2%]
tests/unit/doctor/test_csharp.py::test_dotnet_group_is_csharp PASSED     [  2%]
tests/unit/doctor/test_csharp.py::test_roslyn_pass_when_dll_found PASSED [  2%]
tests/unit/doctor/test_csharp.py::test_roslyn_warn_when_not_yet_downloaded PASSED [  2%]
tests/unit/doctor/test_csharp.py::test_roslyn_warn_when_dotnet_absent PASSED [  2%]
tests/unit/doctor/test_csharp.py::test_roslyn_warn_when_dotnet_exits_nonzero PASSED [  2%]
tests/unit/doctor/test_csharp.py::test_roslyn_group_is_csharp PASSED     [  2%]
tests/unit/doctor/test_docker_daemon.py::test_docker_daemon_pass_when_ping_succeeds PASSED [  2%]
tests/unit/doctor/test_docker_daemon.py::test_docker_daemon_fail_when_ping_raises PASSED [  2%]
tests/unit/doctor/test_docker_daemon.py::test_docker_daemon_fail_contains_exception_message PASSED [  2%]
tests/unit/doctor/test_docker_daemon.py::test_docker_daemon_fix_on_macos PASSED [  2%]
tests/unit/doctor/test_docker_daemon.py::test_docker_daemon_fix_on_linux PASSED [  2%]
tests/unit/doctor/test_docker_daemon.py::test_docker_daemon_pass_has_no_fix PASSED [  2%]
tests/unit/doctor/test_docker_daemon.py::test_docker_daemon_group_is_core PASSED [  2%]
tests/unit/doctor/test_fix_strings.py::test_docker_daemon_fix_platform_aware[Darwin-open -a Docker] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_docker_daemon_fix_platform_aware[Linux-sudo systemctl start docker] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_memgraph_fix_contains_docker_ps PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_memgraph_fix_contains_docker_compose_up PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_dotnet_fix_platform_aware[Darwin-brew install dotnet] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_dotnet_fix_platform_aware[Linux-sudo apt-get install dotnet-sdk] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_node_fix_platform_aware[Darwin-brew install node] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_node_fix_platform_aware[Linux-sudo apt-get install nodejs] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_typescript_ls_fix_platform_aware[Darwin-brew install node] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_typescript_ls_fix_platform_aware[Linux-sudo apt-get install npm] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_python_fix_platform_aware[Darwin-brew install python3] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_python_fix_platform_aware[Linux-sudo apt-get install python3] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_java_fix_platform_aware[Darwin-brew install --cask temurin] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_java_fix_platform_aware[Linux-sudo apt-get install default-jdk] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_jdtls_fix_platform_aware[Darwin-brew install jdtls] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_jdtls_fix_platform_aware[Linux-https://github.com/eclipse-jdtls/eclipse.jdt.ls] PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_csharp_ls_fix_unchanged PASSED [  3%]
tests/unit/doctor/test_fix_strings.py::test_pylsp_fix_unchanged PASSED   [  3%]
tests/unit/doctor/test_java.py::test_java_pass_when_version_exits_zero PASSED [  4%]
tests/unit/doctor/test_java.py::test_java_fail_when_not_on_path PASSED   [  4%]
tests/unit/doctor/test_java.py::test_java_fail_when_version_exits_nonzero PASSED [  4%]
tests/unit/doctor/test_java.py::test_java_fail_when_timeout PASSED       [  4%]
tests/unit/doctor/test_java.py::test_java_group_is_java PASSED           [  4%]
tests/unit/doctor/test_java.py::test_java_pass_fix_is_none PASSED        [  4%]
tests/unit/doctor/test_java.py::test_jdtls_pass_when_launcher_jar_exists PASSED [  4%]
tests/unit/doctor/test_java.py::test_jdtls_fail_when_launcher_jar_missing PASSED [  4%]
tests/unit/doctor/test_java.py::test_jdtls_warn_when_java_absent PASSED  [  4%]
tests/unit/doctor/test_java.py::test_jdtls_group_is_java PASSED          [  4%]
tests/unit/doctor/test_java.py::test_jdtls_pass_fix_is_none PASSED       [  4%]
tests/unit/doctor/test_memgraph_bolt.py::test_memgraph_warns_when_docker_unavailable PASSED [  4%]
tests/unit/doctor/test_memgraph_bolt.py::test_memgraph_fail_when_bolt_handshake_receives_no_bytes PASSED [  4%]
tests/unit/doctor/test_memgraph_bolt.py::test_memgraph_fail_when_socket_raises_oserror PASSED [  4%]
tests/unit/doctor/test_memgraph_bolt.py::test_memgraph_pass_when_bolt_handshake_receives_4_bytes PASSED [  4%]
tests/unit/doctor/test_memgraph_bolt.py::test_memgraph_pass_has_no_fix PASSED [  4%]
tests/unit/doctor/test_memgraph_bolt.py::test_memgraph_warn_has_no_fix PASSED [  4%]
tests/unit/doctor/test_memgraph_bolt.py::test_memgraph_fail_has_fix PASSED [  4%]
tests/unit/doctor/test_memgraph_bolt.py::test_memgraph_group_is_core PASSED [  5%]
tests/unit/doctor/test_memgraph_bolt.py::test_bolt_check_uses_shared_port PASSED [  5%]
tests/unit/doctor/test_memgraph_bolt.py::test_bolt_check_uses_external_host PASSED [  5%]
tests/unit/doctor/test_python.py::test_python_pass_when_version_exits_zero PASSED [  5%]
tests/unit/doctor/test_python.py::test_python_fail_when_not_on_path PASSED [  5%]
tests/unit/doctor/test_python.py::test_python_fail_when_version_exits_nonzero PASSED [  5%]
tests/unit/doctor/test_python.py::test_python_fail_when_timeout PASSED   [  5%]
tests/unit/doctor/test_python.py::test_python_group_is_python PASSED     [  5%]
tests/unit/doctor/test_python.py::test_python_pass_fix_is_none PASSED    [  5%]
tests/unit/doctor/test_python.py::test_pyright_pass_when_importable PASSED [  5%]
tests/unit/doctor/test_python.py::test_pyright_fail_when_not_importable PASSED [  5%]
tests/unit/doctor/test_python.py::test_pyright_fail_when_executable_not_found PASSED [  5%]
tests/unit/doctor/test_python.py::test_pyright_fail_when_timeout PASSED  [  5%]
tests/unit/doctor/test_python.py::test_pyright_group_is_python PASSED    [  5%]
tests/unit/doctor/test_service.py::test_service_returns_all_results PASSED [  5%]
tests/unit/doctor/test_service.py::test_service_returns_doctor_report PASSED [  5%]
tests/unit/doctor/test_service.py::test_service_absorbs_exception PASSED [  5%]
tests/unit/doctor/test_service.py::test_service_absorbed_exception_detail_contains_message PASSED [  5%]
tests/unit/doctor/test_service.py::test_has_failures_true_on_fail PASSED [  6%]
tests/unit/doctor/test_service.py::test_has_failures_false_on_pass_only PASSED [  6%]
tests/unit/doctor/test_service.py::test_has_failures_false_on_warn_only PASSED [  6%]
tests/unit/doctor/test_service.py::test_empty_service_returns_empty_report PASSED [  6%]
tests/unit/doctor/test_typescript.py::test_node_pass_when_version_exits_zero PASSED [  6%]
tests/unit/doctor/test_typescript.py::test_node_fail_when_not_on_path PASSED [  6%]
tests/unit/doctor/test_typescript.py::test_node_fail_when_version_exits_nonzero PASSED [  6%]
tests/unit/doctor/test_typescript.py::test_node_fail_when_timeout PASSED [  6%]
tests/unit/doctor/test_typescript.py::test_node_group_is_typescript PASSED [  6%]
tests/unit/doctor/test_typescript.py::test_node_pass_fix_is_none PASSED  [  6%]
tests/unit/doctor/test_typescript.py::test_npm_pass_when_on_path PASSED  [  6%]
tests/unit/doctor/test_typescript.py::test_npm_fail_when_not_on_path PASSED [  6%]
tests/unit/doctor/test_typescript.py::test_npm_warn_when_node_absent PASSED [  6%]
tests/unit/doctor/test_typescript.py::test_npm_group_is_typescript PASSED [  6%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_aggregates PASSED [  6%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_deduplicates_total PASSED [  6%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_empty PASSED [  6%]
tests/unit/graph/test_analysis.py::test_find_interface_contract_returns_siblings PASSED [  6%]
tests/unit/graph/test_analysis.py::test_find_interface_contract_no_siblings PASSED [  7%]
tests/unit/graph/test_analysis.py::test_find_interface_contract_via_overrides_chain PASSED [  7%]
tests/unit/graph/test_analysis.py::test_find_interface_contract_no_interface PASSED [  7%]
tests/unit/graph/test_analysis.py::test_find_type_impact_categorizes PASSED [  7%]
tests/unit/graph/test_analysis.py::test_find_type_impact_empty PASSED    [  7%]
tests/unit/graph/test_analysis.py::test_find_type_impact_includes_interface_mediated_dependents PASSED [  7%]
tests/unit/graph/test_analysis.py::test_find_type_impact_no_interfaces_uses_direct_only PASSED [  7%]
tests/unit/graph/test_analysis.py::test_audit_layering_violations PASSED [  7%]
tests/unit/graph/test_analysis.py::test_audit_untested_services PASSED   [  7%]
tests/unit/graph/test_analysis.py::test_audit_invalid_rule_raises PASSED [  7%]
tests/unit/graph/test_analysis.py::test_audit_empty_results PASSED       [  7%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_direct_callers_excludes_tests PASSED [  7%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_direct_callers_uses_regex_not_substring PASSED [  7%]
tests/unit/graph/test_analysis.py::test_find_type_impact_uses_regex_not_substring PASSED [  7%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_transitive_includes_interface_dispatch PASSED [  7%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_direct_includes_interface_dispatch PASSED [  7%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_tests_includes_interface_dispatch PASSED [  7%]
tests/unit/graph/test_analysis.py::test_audit_architecture_violations_have_named_keys PASSED [  8%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_includes_direct_callees PASSED [  8%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_callees_not_in_total_affected PASSED [  8%]
tests/unit/graph/test_analysis.py::test_audit_untested_services_uses_regex_pattern PASSED [  8%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_tests_uses_regex_not_contains PASSED [  8%]
tests/unit/graph/test_analysis.py::test_analyze_change_impact_transitive_excludes_tests PASSED [  8%]
tests/unit/graph/test_connection.py::test_create_returns_graph_connection PASSED [  8%]
tests/unit/graph/test_connection.py::test_query_returns_records PASSED   [  8%]
tests/unit/graph/test_connection.py::test_execute_returns_none PASSED    [  8%]
tests/unit/graph/test_connection.py::test_execute_implicit_uses_session_run PASSED [  8%]
tests/unit/graph/test_connection.py::test_close_calls_driver_close PASSED [  8%]
tests/unit/graph/test_connection.py::test_dialect_stored_on_instance PASSED [  8%]
tests/unit/graph/test_connection.py::test_query_with_timeout_returns_records PASSED [  8%]
tests/unit/graph/test_connection.py::test_query_with_timeout_raises_timeout_error PASSED [  8%]
tests/unit/graph/test_connection.py::test_query_with_timeout_shuts_down_executor_with_wait_on_success PASSED [  8%]
tests/unit/graph/test_connection.py::test_query_with_timeout_shuts_down_executor_with_no_wait_on_timeout PASSED [  8%]
tests/unit/graph/test_connection.py::test_query_wraps_service_unavailable PASSED [  8%]
tests/unit/graph/test_connection.py::test_execute_wraps_service_unavailable PASSED [  8%]
tests/unit/graph/test_connection.py::test_execute_implicit_wraps_session_expired PASSED [  9%]
tests/unit/graph/test_connection.py::test_query_wraps_driver_error_base PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_dir_contains_matches_both_nodes_by_path PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_file_contains_symbol_matches_file_by_path PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_contains_symbol_matches_both_by_full_name PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_calls_uses_full_names PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_implements_accepts_class_or_interface_label PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_inherits_creates_edge PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_overrides_creates_edge PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_interface_inherits_creates_edge PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_references_creates_edge_with_kind PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_method_implements_writes_implements_edge PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_method_implements_writes_dispatches_to_edge PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_calls_with_line_col_sets_call_sites PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_calls_without_line_col_uses_bare_merge PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_calls_line_only_still_stores_call_site PASSED [  9%]
tests/unit/graph/test_edges.py::test_upsert_repo_contains_dir_matches_repo_by_path PASSED [  9%]
tests/unit/graph/test_edges_delete_outgoing.py::test_deletes_symbol_level_resolution_edges PASSED [  9%]
tests/unit/graph/test_edges_delete_outgoing.py::test_deletes_imports_from_file_node PASSED [ 10%]
tests/unit/graph/test_edges_delete_outgoing.py::test_does_not_delete_contains_edges PASSED [ 10%]
tests/unit/graph/test_edges_delete_outgoing.py::test_passes_file_path_to_both_queries PASSED [ 10%]
tests/unit/graph/test_http_graph_ops.py::test_upsert_endpoint_executes_merge PASSED [ 10%]
tests/unit/graph/test_http_graph_ops.py::test_upsert_serves_executes_merge PASSED [ 10%]
tests/unit/graph/test_http_graph_ops.py::test_upsert_http_calls_with_call_site PASSED [ 10%]
tests/unit/graph/test_http_graph_ops.py::test_batch_upsert_serves_skips_empty PASSED [ 10%]
tests/unit/graph/test_http_graph_ops.py::test_batch_upsert_http_calls_skips_empty PASSED [ 10%]
tests/unit/graph/test_http_graph_ops.py::test_batch_upsert_serves_executes_unwind PASSED [ 10%]
tests/unit/graph/test_http_graph_ops.py::test_batch_upsert_http_calls_executes_unwind PASSED [ 10%]
tests/unit/graph/test_http_graph_ops.py::test_delete_orphan_endpoints PASSED [ 10%]
tests/unit/graph/test_nodes.py::test_upsert_repository_calls_merge PASSED [ 10%]
tests/unit/graph/test_nodes.py::test_upsert_repository_uses_languages_list PASSED [ 10%]
tests/unit/graph/test_nodes.py::test_upsert_class_includes_kind PASSED   [ 10%]
tests/unit/graph/test_nodes.py::test_upsert_method_includes_flags PASSED [ 10%]
tests/unit/graph/test_nodes.py::test_delete_file_nodes_uses_file_path PASSED [ 10%]
tests/unit/graph/test_nodes.py::test_set_summary_adds_summarized_label PASSED [ 10%]
tests/unit/graph/test_nodes.py::test_remove_summary_strips_label_and_properties PASSED [ 10%]
tests/unit/graph/test_nodes.py::test_upsert_package_creates_package_node PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_interface_creates_interface_node PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_class_does_not_use_namespace_label PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_method_includes_end_line PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_class_includes_end_line PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_interface_includes_end_line PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_property_includes_end_line PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_field_includes_end_line PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_class_stores_file_path PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_interface_stores_file_path PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_method_stores_file_path PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_repository_strips_trailing_slash PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_repository_sets_name PASSED  [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_repository_sets_name_after_strip PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_upsert_interface_sets_kind_property PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_collect_summaries_queries_summarized_nodes_under_file PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_restore_summaries_reapplies_label_and_properties PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_restore_summaries_skips_empty_list PASSED [ 11%]
tests/unit/graph/test_nodes.py::test_set_attributes_stores_json_list PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_set_attributes_empty_list PASSED    [ 12%]
tests/unit/graph/test_nodes.py::test_set_attributes_uses_match_not_merge PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_upsert_class_language_param_sets_node_language PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_upsert_method_language_param_sets_node_language PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_upsert_property_language_param_sets_node_language PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_upsert_field_language_param_sets_node_language PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_upsert_interface_language_param_sets_node_language PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_upsert_functions_default_language_to_empty_string PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_set_metadata_flags_writes_whitelisted_flags PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_set_metadata_flags_ignores_non_whitelisted_keys PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_set_metadata_flags_noop_on_empty_dict PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_set_metadata_flags_noop_when_all_keys_non_whitelisted PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_set_metadata_flags_classmethod_and_async PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_upsert_method_accepts_is_classmethod_and_is_async PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_upsert_method_defaults_is_classmethod_and_is_async_to_false PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_index_symbol_accepts_is_classmethod_and_is_async PASSED [ 12%]
tests/unit/graph/test_nodes.py::test_index_symbol_defaults_is_classmethod_and_is_async_to_false PASSED [ 12%]
tests/unit/graph/test_nodes_commit_rename.py::TestSetLastIndexedCommit::test_executes_match_set_with_sha PASSED [ 13%]
tests/unit/graph/test_nodes_commit_rename.py::TestGetLastIndexedCommit::test_returns_sha_when_present PASSED [ 13%]
tests/unit/graph/test_nodes_commit_rename.py::TestGetLastIndexedCommit::test_returns_none_when_no_rows PASSED [ 13%]
tests/unit/graph/test_nodes_commit_rename.py::TestGetLastIndexedCommit::test_returns_none_when_sha_is_none PASSED [ 13%]
tests/unit/graph/test_nodes_commit_rename.py::TestRenameFileNode::test_updates_file_path_name_and_child_symbols PASSED [ 13%]
tests/unit/graph/test_nodes_commit_rename.py::TestGetFileSymbolNames::test_returns_set_of_full_names PASSED [ 13%]
tests/unit/graph/test_nodes_commit_rename.py::TestGetFileSymbolNames::test_returns_empty_set_when_no_symbols PASSED [ 13%]
tests/unit/graph/test_nodes_commit_rename.py::TestDeleteOrphanedSymbols::test_deletes_symbols_not_in_keep_set PASSED [ 13%]
tests/unit/graph/test_nodes_commit_rename.py::TestDeleteOrphanedSymbols::test_returns_zero_when_no_orphans PASSED [ 13%]
tests/unit/graph/test_orphan_endpoints.py::test_cleanup_removes_repo_contains_edge_and_orphaned_endpoint PASSED [ 13%]
tests/unit/graph/test_orphan_endpoints.py::test_cleanup_passes_repo_path PASSED [ 13%]
tests/unit/graph/test_queries.py::test_get_symbol_returns_none_when_not_found PASSED [ 13%]
tests/unit/graph/test_queries.py::test_get_symbol_returns_first_row PASSED [ 13%]
tests/unit/graph/test_queries.py::test_find_implementations_returns_list PASSED [ 13%]
tests/unit/graph/test_queries.py::test_find_implementations_does_not_require_interface_label PASSED [ 13%]
tests/unit/graph/test_queries.py::test_find_implementations_no_abc_fallback PASSED [ 13%]
tests/unit/graph/test_queries.py::test_find_callers_passes_full_name PASSED [ 13%]
tests/unit/graph/test_queries.py::test_find_callers_excludes_tests_by_default PASSED [ 13%]
tests/unit/graph/test_queries.py::test_search_symbols_with_kind_filter PASSED [ 14%]
tests/unit/graph/test_queries.py::test_list_projects_queries_repository_nodes PASSED [ 14%]
tests/unit/graph/test_queries.py::test_execute_readonly_query_allows_match PASSED [ 14%]
tests/unit/graph/test_queries.py::test_execute_readonly_query_propagates_timeout_error PASSED [ 14%]
tests/unit/graph/test_queries.py::test_execute_readonly_query_blocks_create PASSED [ 14%]
tests/unit/graph/test_queries.py::test_execute_readonly_query_blocks_trailing_delete PASSED [ 14%]
tests/unit/graph/test_queries.py::test_execute_readonly_query_blocks_multiline_merge PASSED [ 14%]
tests/unit/graph/test_queries.py::test_search_symbols_rejects_invalid_kind PASSED [ 14%]
tests/unit/graph/test_queries.py::test_get_method_symbol_map_returns_correct_dict PASSED [ 14%]
tests/unit/graph/test_queries.py::test_get_symbol_source_info_returns_location PASSED [ 14%]
tests/unit/graph/test_queries.py::test_get_symbol_source_info_returns_none_when_not_found PASSED [ 14%]
tests/unit/graph/test_queries.py::test_get_symbol_source_info_uses_stored_file_path PASSED [ 14%]
tests/unit/graph/test_queries.py::test_find_type_references_returns_referencing_symbols PASSED [ 14%]
tests/unit/graph/test_queries.py::test_find_type_references_returns_empty_for_no_refs PASSED [ 14%]
tests/unit/graph/test_queries.py::test_find_type_references_with_kind_filter PASSED [ 14%]
tests/unit/graph/test_queries.py::test_find_type_references_without_kind_returns_all PASSED [ 14%]
tests/unit/graph/test_queries.py::test_find_type_references_kind_in_query PASSED [ 14%]
tests/unit/graph/test_queries.py::test_find_dependencies_returns_referenced_types PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_containing_type_returns_parent PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_containing_type_returns_none_for_top_level PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_members_overview_returns_children PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_called_members_returns_called_only PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_called_members_returns_empty_for_no_calls PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_implemented_interfaces_returns_interfaces PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_index_status_returns_none_when_not_found PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_index_status_strips_trailing_slash PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_index_status_returns_counts PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_index_status_includes_symbol_breakdown PASSED [ 15%]
tests/unit/graph/test_queries.py::test_get_hierarchy_interface_returns_implementors_as_children PASSED [ 15%]
tests/unit/graph/test_queries.py::test_resolve_with_labels_exact_match PASSED [ 15%]
tests/unit/graph/test_queries.py::test_resolve_with_labels_suffix_match_single PASSED [ 15%]
tests/unit/graph/test_queries.py::test_resolve_with_labels_suffix_match_ambiguous PASSED [ 15%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_csharp_tests_dir PASSED [ 15%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_python_tests_dir PASSED [ 15%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_jest_dunder_tests_dir PASSED [ 15%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_test_suffix_ts PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_spec_suffix_tsx PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_test_suffix_js PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_spec_suffix_jsx PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_python_unit_tests_dir PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_underscore_test_py PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_matches_underscore_test_go PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_no_match_regular_ts_file PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_no_match_regular_cs_file PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_no_match_testimonial_card PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_no_match_testing_utils PASSED [ 16%]
tests/unit/graph/test_queries.py::TestTestPathPattern::test_no_match_contest_py PASSED [ 16%]
tests/unit/graph/test_resolve.py::test_exact_match_returns_string PASSED [ 16%]
tests/unit/graph/test_resolve.py::test_exact_match_without_dot PASSED    [ 16%]
tests/unit/graph/test_resolve.py::test_suffix_fallback_single_match PASSED [ 16%]
tests/unit/graph/test_resolve.py::test_suffix_fallback_multiple_matches PASSED [ 16%]
tests/unit/graph/test_resolve.py::test_no_match_returns_original PASSED  [ 16%]
tests/unit/graph/test_resolve.py::test_exact_match_skips_suffix PASSED   [ 16%]
tests/unit/graph/test_resolve.py::test_suffix_fallback_prefers_class_over_method PASSED [ 17%]
tests/unit/graph/test_schema.py::test_ensure_schema_memgraph_creates_indices PASSED [ 17%]
tests/unit/graph/test_schema.py::test_ensure_schema_neo4j_creates_indices PASSED [ 17%]
tests/unit/graph/test_schema.py::test_schema_includes_package_index PASSED [ 17%]
tests/unit/graph/test_schema.py::test_schema_includes_interface_index PASSED [ 17%]
tests/unit/graph/test_schema.py::test_schema_does_not_include_namespace_index PASSED [ 17%]
tests/unit/graph/test_schema.py::test_schema_correct_number_of_indices PASSED [ 17%]
tests/unit/graph/test_search_language_filter.py::test_search_symbols_with_language_adds_where_condition PASSED [ 17%]
tests/unit/graph/test_search_language_filter.py::test_search_symbols_without_language_omits_condition PASSED [ 17%]
tests/unit/graph/test_search_language_filter.py::test_search_symbols_kind_and_language_combined PASSED [ 17%]
tests/unit/graph/test_search_language_filter.py::test_search_symbols_default_language_is_none PASSED [ 17%]
tests/unit/graph/test_search_language_filter.py::test_search_symbols_language_filter_csharp PASSED [ 17%]
tests/unit/graph/test_staleness.py::test_check_staleness_stale_file PASSED [ 17%]
tests/unit/graph/test_staleness.py::test_check_staleness_fresh_file PASSED [ 17%]
tests/unit/graph/test_staleness.py::test_check_staleness_file_not_in_graph PASSED [ 17%]
tests/unit/graph/test_staleness.py::test_check_staleness_file_deleted_from_disk PASSED [ 17%]
tests/unit/graph/test_traversal.py::test_trace_call_chain_returns_paths PASSED [ 17%]
tests/unit/graph/test_traversal.py::test_trace_call_chain_no_path PASSED [ 17%]
tests/unit/graph/test_traversal.py::test_trace_call_chain_depth_clamped PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_trace_call_chain_depth_in_cypher PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_returns_paths PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_empty PASSED  [ 18%]
tests/unit/graph/test_traversal.py::test_get_call_depth_returns_callees PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_get_call_depth_empty PASSED     [ 18%]
tests/unit/graph/test_traversal.py::test_trace_call_chain_traverses_dispatches_to PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_traverses_dispatches_to PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_exclude_pattern_in_cypher PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_no_exclude_clause_when_pattern_empty PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_exclude_promotes_callers_to_roots PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_deduplicates_by_entry PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_get_call_depth_traverses_dispatches_to PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_trace_call_chain_crosses_interface_boundary PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_excludes_tests_by_default PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_include_tests_when_requested PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_exclude_tests_composes_with_exclude_pattern PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_test_pattern_filters_callers_in_not_exists PASSED [ 18%]
tests/unit/graph/test_traversal.py::test_find_entry_points_test_pattern_is_empty_when_disabled PASSED [ 19%]
tests/unit/graph/test_traversal.py::test_find_entry_points_attributed_controller PASSED [ 19%]
tests/unit/graph/test_traversal.py::test_find_entry_points_attributed_deduplicates_with_roots PASSED [ 19%]
tests/unit/graph/test_traversal.py::test_find_entry_points_attributed_query_checks_attributes PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestClaudeCodeUpsert::test_creates_new_settings_file PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestClaudeCodeUpsert::test_preserves_existing_hooks PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestClaudeCodeUpsert::test_replaces_existing_synapps_hook PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestClaudeCodeUpsert::test_preserves_non_hook_settings PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestCursorUpsert::test_creates_new_hooks_file PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestCursorUpsert::test_preserves_existing_hooks PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestCopilotUpsert::test_creates_new_hooks_file_and_parent_dir PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestCopilotUpsert::test_preserves_existing_hooks PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestRemoveHooks::test_remove_claude_hook PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestRemoveHooks::test_remove_cursor_hook PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestRemoveHooks::test_remove_copilot_hook PASSED [ 19%]
tests/unit/hooks/test_config_upsert.py::TestRemoveHooks::test_remove_noop_if_file_missing PASSED [ 19%]
tests/unit/hooks/test_detector.py::TestDetectAgents::test_detects_claude_code PASSED [ 19%]
tests/unit/hooks/test_detector.py::TestDetectAgents::test_detects_cursor PASSED [ 19%]
tests/unit/hooks/test_detector.py::TestDetectAgents::test_detects_copilot PASSED [ 20%]
tests/unit/hooks/test_detector.py::TestDetectAgents::test_skips_missing_agents PASSED [ 20%]
tests/unit/hooks/test_detector.py::TestDetectAgents::test_detects_multiple_agents PASSED [ 20%]
tests/unit/hooks/test_detector.py::TestDetectAgents::test_agent_has_config_path PASSED [ 20%]
tests/unit/hooks/test_detector.py::TestDetectAgents::test_copilot_config_path_is_project_relative PASSED [ 20%]
tests/unit/hooks/test_detector.py::TestDetectAgents::test_cursor_config_path_is_project_relative PASSED [ 20%]
tests/unit/hooks/test_gate_scripts.py::TestClaudeGate::test_exits_zero PASSED [ 20%]
tests/unit/hooks/test_gate_scripts.py::TestClaudeGate::test_emits_reminder_in_indexed_project PASSED [ 20%]
tests/unit/hooks/test_gate_scripts.py::TestClaudeGate::test_silent_in_unindexed_project PASSED [ 20%]
tests/unit/hooks/test_gate_scripts.py::TestCopilotGate::test_emits_allow_json PASSED [ 20%]
tests/unit/hooks/test_gate_scripts.py::TestCopilotGate::test_emits_reminder_for_grep PASSED [ 20%]
tests/unit/hooks/test_gate_scripts.py::TestCopilotGate::test_silent_for_non_search_tool PASSED [ 20%]
tests/unit/hooks/test_gate_scripts.py::TestCopilotGate::test_silent_in_unindexed_project PASSED [ 20%]
tests/unit/hooks/test_installer.py::TestInstallScripts::test_creates_hooks_directory PASSED [ 20%]
tests/unit/hooks/test_installer.py::TestInstallScripts::test_writes_all_four_scripts PASSED [ 20%]
tests/unit/hooks/test_installer.py::TestInstallScripts::test_scripts_are_executable PASSED [ 20%]
tests/unit/hooks/test_installer.py::TestInstallScripts::test_skips_existing_scripts_without_force PASSED [ 20%]
tests/unit/hooks/test_installer.py::TestInstallScripts::test_overwrites_existing_scripts_with_force PASSED [ 20%]
tests/unit/hooks/test_installer.py::TestInstallScripts::test_returns_list_of_written_files PASSED [ 21%]
tests/unit/hooks/test_installer.py::TestRemoveScripts::test_removes_hooks_directory PASSED [ 21%]
tests/unit/hooks/test_installer.py::TestRemoveScripts::test_noop_if_directory_missing PASSED [ 21%]
tests/unit/hooks/test_scripts.py::TestScriptConstants::test_common_script_defines_is_synapps_project PASSED [ 21%]
tests/unit/hooks/test_scripts.py::TestScriptConstants::test_common_script_defines_emit_reminder PASSED [ 21%]
tests/unit/hooks/test_scripts.py::TestScriptConstants::test_common_script_checks_config_json PASSED [ 21%]
tests/unit/hooks/test_scripts.py::TestScriptConstants::test_claude_gate_sources_common PASSED [ 21%]
tests/unit/hooks/test_scripts.py::TestScriptConstants::test_claude_gate_exits_zero PASSED [ 21%]
tests/unit/hooks/test_scripts.py::TestScriptConstants::test_cursor_gate_sources_common PASSED [ 21%]
tests/unit/hooks/test_scripts.py::TestScriptConstants::test_copilot_gate_emits_allow_json PASSED [ 21%]
tests/unit/hooks/test_scripts.py::TestScriptConstants::test_copilot_gate_reads_tool_name PASSED [ 21%]
tests/unit/hooks/test_scripts.py::TestScriptConstants::test_all_scripts_have_shebang PASSED [ 21%]
tests/unit/indexer/http/test_constants_resolver.py::test_python_collects_url_constant PASSED [ 21%]
tests/unit/indexer/http/test_constants_resolver.py::test_python_collects_http_url_constant PASSED [ 21%]
tests/unit/indexer/http/test_constants_resolver.py::test_python_skips_non_string_assignment PASSED [ 21%]
tests/unit/indexer/http/test_constants_resolver.py::test_python_skips_string_without_slash_or_http PASSED [ 21%]
tests/unit/indexer/http/test_constants_resolver.py::test_python_skips_nested_assignment PASSED [ 21%]
tests/unit/indexer/http/test_constants_resolver.py::test_python_multi_file_collection PASSED [ 22%]
tests/unit/indexer/http/test_constants_resolver.py::test_python_empty_file PASSED [ 22%]
tests/unit/indexer/http/test_constants_resolver.py::test_typescript_collects_const_url PASSED [ 22%]
tests/unit/indexer/http/test_constants_resolver.py::test_typescript_collects_let_url PASSED [ 22%]
tests/unit/indexer/http/test_constants_resolver.py::test_typescript_skips_non_url_string PASSED [ 22%]
tests/unit/indexer/http/test_constants_resolver.py::test_typescript_empty_file PASSED [ 22%]
tests/unit/indexer/http/test_constants_resolver.py::test_unknown_language_returns_empty PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_basic_controller_endpoint PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_method_route_suffix PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_post_with_sub_route PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_tilde_overrides_class_route PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_multiple_verbs_on_class PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_non_controller_class_skipped PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_no_client_calls_returned PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_empty_source PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_apicontroller_on_base_class PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_controller_placeholder_in_route PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_get_async PASSED [ 22%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_post_async PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_put_async PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_delete_async PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_patch_async PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_get_string_async PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_restsharp_request_get PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_restsharp_request_post PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_interpolated_string_url PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_client_and_server_in_same_file PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_existing_server_extraction_unchanged PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_url_without_slash_skipped PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_find_enclosing_symbol_nested_class_narrowest_range PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_find_enclosing_symbol_outer_only_when_not_in_inner PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_find_enclosing_symbol_single_symbol PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_get_from_json_async PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_post_as_json_async PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_put_as_json_async PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_httpclient_get_stream_async PASSED [ 23%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_generic_base PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_plain_base PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_mapper_base PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_handler_is_handle_async PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_mutual_exclusion_route_attr PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_non_fastendpoints_post_not_detected PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_configure_delete PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_configure_patch PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_handle_async_missing PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_verbs_routes_cross_product PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_verbs_string_style PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_fastendpoints_verbs_enum_single PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_iendpointgroup_basic_mapget PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_iendpointgroup_multiple_verbs PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_iendpointgroup_endpointgroupbase PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_iendpointgroup_handler_first_ordering PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_iendpointgroup_route_first_ordering PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_iendpointgroup_lambda_handler PASSED [ 24%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_iendpointgroup_mutual_exclusion PASSED [ 25%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_iendpointgroup_negative_plain_class PASSED [ 25%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_minimal_api_method_ref PASSED [ 25%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_minimal_api_lambda PASSED [ 25%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_minimal_api_multiple_verbs PASSED [ 25%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_minimal_api_no_duplicate_in_iendpointgroup PASSED [ 25%]
tests/unit/indexer/http/test_csharp_http_extractor.py::test_minimal_api_handler_resolution_across_class PASSED [ 25%]
tests/unit/indexer/http/test_interface.py::test_endpoint_def_fields PASSED [ 25%]
tests/unit/indexer/http/test_interface.py::test_client_call_fields PASSED [ 25%]
tests/unit/indexer/http/test_interface.py::test_extraction_result_defaults_empty PASSED [ 25%]
tests/unit/indexer/http/test_interface.py::test_extraction_result_with_data PASSED [ 25%]
tests/unit/indexer/http/test_java_http_extractor.py::test_get_mapping_basic PASSED [ 25%]
tests/unit/indexer/http/test_java_http_extractor.py::test_post_mapping PASSED [ 25%]
tests/unit/indexer/http/test_java_http_extractor.py::test_put_mapping PASSED [ 25%]
tests/unit/indexer/http/test_java_http_extractor.py::test_delete_mapping PASSED [ 25%]
tests/unit/indexer/http/test_java_http_extractor.py::test_patch_mapping PASSED [ 25%]
tests/unit/indexer/http/test_java_http_extractor.py::test_class_level_request_mapping_prefix_combined PASSED [ 25%]
tests/unit/indexer/http/test_java_http_extractor.py::test_request_mapping_with_method_post PASSED [ 25%]
tests/unit/indexer/http/test_java_http_extractor.py::test_request_mapping_with_value_arg PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_controller_annotation_also_detected PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_non_controller_class_skipped PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_get_for_object PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_post_for_object PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_put PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_delete PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_webclient_get PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_webclient_post PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_java_net_http_get PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_url_without_slash_skipped PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_empty_source PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_path_with_get PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_path_with_post PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_class_and_method_path_combined PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_put_delete_patch PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_no_verb_annotation_skipped PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_class_without_path_skipped PASSED [ 26%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_symbol_with_parens_in_name PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_symbol_line_off_by_one PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_mixed_with_spring_in_same_file PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_jaxrs_constraint_route_normalized PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_find_enclosing_symbol_nested_class_narrowest_range PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_find_enclosing_symbol_outer_only_when_not_in_inner PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_find_enclosing_symbol_single_symbol PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_exchange_get PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_exchange_post PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_exchange_put PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_exchange_delete PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_exchange_binary_expression_url PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_exchange_identifier_url PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_exchange_no_slash_in_resolved_url_skipped PASSED [ 27%]
tests/unit/indexer/http/test_java_http_extractor.py::test_rest_template_exchange_caller_attribution PASSED [ 27%]
tests/unit/indexer/http/test_matcher.py::test_exact_match PASSED         [ 27%]
tests/unit/indexer/http/test_matcher.py::test_parameterized_match PASSED [ 27%]
tests/unit/indexer/http/test_matcher.py::test_param_names_ignored PASSED [ 27%]
tests/unit/indexer/http/test_matcher.py::test_method_mismatch_no_match PASSED [ 28%]
tests/unit/indexer/http/test_matcher.py::test_base_path_prefix_matching PASSED [ 28%]
tests/unit/indexer/http/test_matcher.py::test_unmatched_server_endpoint PASSED [ 28%]
tests/unit/indexer/http/test_matcher.py::test_unmatched_client_call PASSED [ 28%]
tests/unit/indexer/http/test_matcher.py::test_multiple_clients_same_endpoint PASSED [ 28%]
tests/unit/indexer/http/test_matcher.py::test_param_vs_literal_no_match PASSED [ 28%]
tests/unit/indexer/http/test_matcher.py::test_empty_inputs PASSED        [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_fastapi_get_decorator PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_fastapi_post_decorator PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_fastapi_path_param_preserved PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_fastapi_router_decorator PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_fastapi_all_verbs PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_flask_route_get PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_flask_route_multiple_methods PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_flask_route_param_normalized PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_flask_route_no_methods_defaults_to_get PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_flask_shorthand_get PASSED [ 28%]
tests/unit/indexer/http/test_python_http_extractor.py::test_flask_blueprint_route PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_django_modelviewset_conventional_routes PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_django_apiview_get_method PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_django_api_view_decorator PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_requests_get PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_requests_post PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_requests_fstring_url PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_requests_all_verbs PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_requests_outside_function_skipped PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_requests_url_without_slash_skipped PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_requests_constant_url_resolution PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_non_http_decorator_skipped PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_empty_source PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_both_server_and_client_in_same_file PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_find_enclosing_symbol_nested_class_narrowest_range PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_find_enclosing_symbol_outer_only_when_not_in_inner PASSED [ 29%]
tests/unit/indexer/http/test_python_http_extractor.py::test_find_enclosing_symbol_single_symbol PASSED [ 29%]
tests/unit/indexer/http/test_route_utils.py::test_strips_type_constraints PASSED [ 29%]
tests/unit/indexer/http/test_route_utils.py::test_strips_regex_constraints PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_ensures_leading_slash PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_strips_trailing_slash PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_collapses_double_slashes PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_preserves_case PASSED  [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_empty_returns_root PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_already_normalized PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_combines_class_and_method_route PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_method_route_only PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_tilde_override_ignores_class_route PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_multiple_params PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_strip_base_url_variable_basic PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_strip_base_url_variable_preserves_normal_routes PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_strip_base_url_variable_preserves_param_routes PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_strip_base_url_variable_multiple_prefixes PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_strip_base_url_variable_only_variable PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_strip_base_url_variable_empty PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_strip_base_url_variable_with_backtick_style PASSED [ 30%]
tests/unit/indexer/http/test_route_utils.py::test_strips_jaxrs_constraint_with_space PASSED [ 31%]
tests/unit/indexer/http/test_route_utils.py::test_strips_jaxrs_constraint_combined PASSED [ 31%]
tests/unit/indexer/http/test_route_utils.py::test_strips_jaxrs_constraint_special_chars PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_axios_style_get PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_axios_style_post PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_fetch_with_method_option PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_fetch_defaults_to_get PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_template_literal_parameterized PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_constant_reference PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_false_positive_rejected_no_path PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_dynamic_url_skipped PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_no_server_defs_returned PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_empty_source PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_generic_type_argument_with_await PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_generic_type_argument_without_await PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_multiple_calls_in_one_function PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_express_get_route PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_express_post_route PASSED [ 31%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_express_param_normalization PASSED [ 32%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_fastify_get_route PASSED [ 32%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_fastify_route_config PASSED [ 32%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_hono_get_route PASSED [ 32%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_server_route_not_duplicated_as_client_call PASSED [ 32%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_existing_client_call_still_works PASSED [ 32%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_find_enclosing_symbol_nested_class_narrowest_range PASSED [ 32%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_find_enclosing_symbol_outer_only_when_not_in_inner PASSED [ 32%]
tests/unit/indexer/http/test_typescript_http_extractor.py::test_find_enclosing_symbol_single_symbol PASSED [ 32%]
tests/unit/indexer/test_call_indexer.py::test_writes_calls_edge_when_lsp_resolves_callee PASSED [ 32%]
tests/unit/indexer/test_call_indexer.py::test_skips_edge_when_lsp_returns_none PASSED [ 32%]
tests/unit/indexer/test_call_indexer.py::test_skips_edge_when_callee_is_not_a_method PASSED [ 32%]
tests/unit/indexer/test_call_indexer.py::test_index_calls_reads_all_cs_files PASSED [ 32%]
tests/unit/indexer/test_call_indexer.py::test_writes_call_site_line_and_col PASSED [ 32%]
tests/unit/indexer/test_call_indexer.py::test_skips_self_calls PASSED    [ 32%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_class_attribute PASSED [ 32%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_method_attribute PASSED [ 32%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_multiple_attributes PASSED [ 32%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_strips_attribute_suffix PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_preserves_namespace_qualification PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_property_attribute PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_field_attribute PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_empty_source_returns_empty PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_static_method_modifier PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_async_method_modifier PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_abstract_method_modifier PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_combined_modifiers PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_extracts_virtual_override_modifiers PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_modifiers_combined_with_attributes PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_no_attributes_returns_empty PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_attribute_with_arguments_extracts_name_only PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_fact_attribute_extracted_for_async_task_method PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_theory_attribute_extracted_for_generic_return PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_fact_on_void_method_still_works PASSED [ 33%]
tests/unit/indexer/test_csharp_attribute_extractor.py::test_multiple_attributed_methods_in_class PASSED [ 33%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_class_with_base_class PASSED [ 33%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_class_implementing_interface PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_class_with_multiple_bases_marks_first PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_interface_inheriting_interface PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_no_bases PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_generic_base_class PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_record_with_base PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_empty_file PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_class_with_qualified_interface PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_class_with_deeply_qualified_base PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_mixed_simple_and_qualified_bases PASSED [ 34%]
tests/unit/indexer/test_csharp_base_type_extractor.py::test_extract_positions_are_integers PASSED [ 34%]
tests/unit/indexer/test_csharp_call_extractor.py::test_extracts_simple_method_call PASSED [ 34%]
tests/unit/indexer/test_csharp_call_extractor.py::test_extracts_member_access_call PASSED [ 34%]
tests/unit/indexer/test_csharp_call_extractor.py::test_caller_full_name_is_set PASSED [ 34%]
tests/unit/indexer/test_csharp_call_extractor.py::test_returns_empty_for_empty_source PASSED [ 34%]
tests/unit/indexer/test_csharp_call_extractor.py::test_no_duplicate_entries_for_same_call PASSED [ 34%]
tests/unit/indexer/test_csharp_call_extractor.py::test_extracts_generic_method_call PASSED [ 34%]
tests/unit/indexer/test_csharp_call_extractor.py::test_extracts_generic_object_creation PASSED [ 34%]
tests/unit/indexer/test_csharp_call_extractor.py::test_skips_calls_with_no_enclosing_method PASSED [ 35%]
tests/unit/indexer/test_csharp_import_extractor.py::test_extract_simple_using PASSED [ 35%]
tests/unit/indexer/test_csharp_import_extractor.py::test_extract_multiple_usings PASSED [ 35%]
tests/unit/indexer/test_csharp_import_extractor.py::test_extract_ignores_static_using PASSED [ 35%]
tests/unit/indexer/test_csharp_import_extractor.py::test_extract_empty_file PASSED [ 35%]
tests/unit/indexer/test_csharp_import_extractor.py::test_extract_no_duplicates PASSED [ 35%]
tests/unit/indexer/test_csharp_import_extractor.py::test_extract_ignores_alias_using PASSED [ 35%]
tests/unit/indexer/test_csharp_type_ref_extractor.py::test_extracts_method_return_type PASSED [ 35%]
tests/unit/indexer/test_csharp_type_ref_extractor.py::test_extracts_method_parameter_type PASSED [ 35%]
tests/unit/indexer/test_csharp_type_ref_extractor.py::test_extracts_property_type PASSED [ 35%]
tests/unit/indexer/test_csharp_type_ref_extractor.py::test_extracts_field_type PASSED [ 35%]
tests/unit/indexer/test_csharp_type_ref_extractor.py::test_skips_primitive_types PASSED [ 35%]
tests/unit/indexer/test_csharp_type_ref_extractor.py::test_field_type_owner_requires_class_lines PASSED [ 35%]
tests/unit/indexer/test_csharp_type_ref_extractor.py::test_returns_empty_for_empty_source PASSED [ 35%]
tests/unit/indexer/test_git.py::TestIsGitRepo::test_returns_true_when_git_dir_exists PASSED [ 35%]
tests/unit/indexer/test_git.py::TestIsGitRepo::test_returns_false_when_no_git_dir PASSED [ 35%]
tests/unit/indexer/test_git.py::TestRevParseHead::test_returns_sha_on_success PASSED [ 35%]
tests/unit/indexer/test_git.py::TestRevParseHead::test_returns_none_on_failure PASSED [ 36%]
tests/unit/indexer/test_git.py::TestDiffNameStatus::test_parses_modified_and_deleted PASSED [ 36%]
tests/unit/indexer/test_git.py::TestDiffNameStatus::test_parses_rename PASSED [ 36%]
tests/unit/indexer/test_git.py::TestDiffNameStatus::test_parses_added PASSED [ 36%]
tests/unit/indexer/test_git.py::TestDiffNameStatus::test_returns_empty_on_failure PASSED [ 36%]
tests/unit/indexer/test_git.py::TestDiffNameStatus::test_cached_ref_spec PASSED [ 36%]
tests/unit/indexer/test_git.py::TestDiffNameStatus::test_none_ref_spec_no_extra_args PASSED [ 36%]
tests/unit/indexer/test_git.py::TestComputeGitDiff::test_modified_file_in_to_reindex PASSED [ 36%]
tests/unit/indexer/test_git.py::TestComputeGitDiff::test_deleted_file_in_to_delete PASSED [ 36%]
tests/unit/indexer/test_git.py::TestComputeGitDiff::test_added_file_in_to_reindex PASSED [ 36%]
tests/unit/indexer/test_git.py::TestComputeGitDiff::test_renamed_file_in_renames_and_reindex PASSED [ 36%]
tests/unit/indexer/test_git.py::TestComputeGitDiff::test_uncommitted_changes_included PASSED [ 36%]
tests/unit/indexer/test_git.py::TestComputeGitDiff::test_diff_calls_three_subprocess_diffs PASSED [ 36%]
tests/unit/indexer/test_git_sync.py::test_no_changes_returns_zero_sync_result PASSED [ 36%]
tests/unit/indexer/test_git_sync.py::test_modified_file_reindexed PASSED [ 36%]
tests/unit/indexer/test_git_sync.py::test_deleted_file_removed PASSED    [ 36%]
tests/unit/indexer/test_git_sync.py::test_renamed_file_calls_rename_and_reindex PASSED [ 36%]
tests/unit/indexer/test_git_sync.py::test_stores_commit_sha_after_sync PASSED [ 36%]
tests/unit/indexer/test_git_sync.py::test_reindex_failure_skipped_others_processed PASSED [ 37%]
tests/unit/indexer/test_git_sync.py::test_no_head_sha_skips_commit_store PASSED [ 37%]
tests/unit/indexer/test_git_sync.py::test_file_extensions_filter_only_processes_matching_files PASSED [ 37%]
tests/unit/indexer/test_git_sync.py::test_file_extensions_filter_all_filtered_returns_zero PASSED [ 37%]
tests/unit/indexer/test_http_phase.py::test_phase_creates_endpoint_nodes_and_edges PASSED [ 37%]
tests/unit/indexer/test_http_phase.py::test_phase_skips_when_no_results PASSED [ 37%]
tests/unit/indexer/test_http_phase.py::test_phase_handles_unmatched_server_endpoint PASSED [ 37%]
tests/unit/indexer/test_http_phase.py::test_phase_handles_unmatched_client_call PASSED [ 37%]
tests/unit/indexer/test_http_phase.py::test_rebuild_from_graph_queries_existing_data PASSED [ 37%]
tests/unit/indexer/test_http_phase.py::test_conflict_warning_emitted PASSED [ 37%]
tests/unit/indexer/test_http_phase.py::test_conflict_warning_emitted_once_per_pair PASSED [ 37%]
tests/unit/indexer/test_http_phase.py::test_no_conflict_warning_for_single_handler PASSED [ 37%]
tests/unit/indexer/test_http_phase.py::test_no_conflict_for_different_routes PASSED [ 37%]
tests/unit/indexer/test_import_fallback.py::test_fallback_resolves_when_lsp_returns_empty PASSED [ 37%]
tests/unit/indexer/test_import_fallback.py::test_fallback_resolves_when_lsp_returns_same_file PASSED [ 37%]
tests/unit/indexer/test_import_fallback.py::test_fallback_not_used_when_lsp_succeeds PASSED [ 37%]
tests/unit/indexer/test_import_fallback.py::test_fallback_skipped_when_no_import_map PASSED [ 37%]
tests/unit/indexer/test_import_fallback.py::test_fallback_uses_name_to_full_names_when_graph_misses PASSED [ 37%]
tests/unit/indexer/test_indexer.py::test_is_minified_returns_true_for_long_first_line PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_is_minified_returns_false_for_normal_file PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_is_minified_returns_false_for_empty_file PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_is_minified_skips_empty_leading_lines PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_is_minified_returns_false_for_missing_file PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_typescript_constructor_produces_kind_str_constructor PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_typescript_regular_method_keeps_kind_str_method PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_typescript_top_level_function_kind_str_is_function PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_index_callback_edges_creates_calls_from_parent_to_callback PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_index_callback_edges_skips_non_callback_methods PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_index_callback_edges_skips_parentless_callbacks PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_typescript_const_object_produces_kind_str_const_object PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_index_project_builds_assignment_map_for_python PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_index_project_skips_assignment_map_for_csharp PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_reindex_file_builds_assignment_map PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_is_minified_source_returns_true_for_long_first_line PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_is_minified_source_returns_false_for_normal PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_is_minified_source_returns_false_for_empty PASSED [ 38%]
tests/unit/indexer/test_indexer.py::test_is_minified_source_returns_true_for_long_first_line_with_newline PASSED [ 39%]
tests/unit/indexer/test_indexer.py::test_is_minified_source_returns_false_for_blank_first_line PASSED [ 39%]
tests/unit/indexer/test_indexer.py::test_index_project_catches_lsp_timeout_and_continues PASSED [ 39%]
tests/unit/indexer/test_indexer.py::test_index_project_logs_timed_out_file_name PASSED [ 39%]
tests/unit/indexer/test_indexer.py::test_index_project_logs_verbose_suggestion_on_timeout PASSED [ 39%]
tests/unit/indexer/test_indexer_attributes.py::test_index_project_calls_set_attributes PASSED [ 39%]
tests/unit/indexer/test_indexer_attributes.py::test_reindex_file_calls_set_attributes PASSED [ 39%]
tests/unit/indexer/test_indexer_attributes.py::test_index_project_java_attributes PASSED [ 39%]
tests/unit/indexer/test_indexer_attributes.py::test_index_project_java_class_attributes PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestLspHitCreatesInherits::test_lsp_hit_creates_inherits PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestLspHitCreatesImplements::test_lsp_hit_creates_implements PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestLspHitCreatesInterfaceInherits::test_lsp_hit_creates_interface_inherits PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestLspCsharpFirstBaseDualWrite::test_lsp_csharp_first_base_dual_write PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestLspNoDefinitionsSkips::test_lsp_no_definitions_skips PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestLspExternalTypeSkipped::test_lsp_external_type_skipped PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestLspExceptionSkips::test_lsp_exception_skips PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestLspOpenFileFailure::test_lsp_open_file_failure PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestMultipleBaseTypes::test_multiple_base_types PASSED [ 39%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestDeclaringTypeResolvedViaFileScope::test_declaring_type_resolved_from_same_file PASSED [ 40%]
tests/unit/indexer/test_indexer_base_types_lsp.py::TestDeclaringTypeResolvedViaFileScope::test_declaring_type_in_different_file_not_matched PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_single_annotation PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_multiple_annotations PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_annotation_with_arguments PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_modifier_abstract PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_modifier_static PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_modifier_synchronized PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_modifier_final PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_modifier_native PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_combined_annotation_and_modifier PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_no_attributes PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_empty_source PASSED [ 40%]
tests/unit/indexer/test_java_attribute_extractor.py::test_whitespace_source PASSED [ 40%]
tests/unit/indexer/test_java_base_type_extractor.py::test_single_inheritance PASSED [ 40%]
tests/unit/indexer/test_java_base_type_extractor.py::test_implements_interface PASSED [ 40%]
tests/unit/indexer/test_java_base_type_extractor.py::test_extends_and_implements PASSED [ 40%]
tests/unit/indexer/test_java_base_type_extractor.py::test_implements_multiple PASSED [ 40%]
tests/unit/indexer/test_java_base_type_extractor.py::test_interface_extends PASSED [ 41%]
tests/unit/indexer/test_java_base_type_extractor.py::test_interface_extends_multiple PASSED [ 41%]
tests/unit/indexer/test_java_base_type_extractor.py::test_extends_generic PASSED [ 41%]
tests/unit/indexer/test_java_base_type_extractor.py::test_implements_generic PASSED [ 41%]
tests/unit/indexer/test_java_base_type_extractor.py::test_no_inheritance PASSED [ 41%]
tests/unit/indexer/test_java_base_type_extractor.py::test_empty_source PASSED [ 41%]
tests/unit/indexer/test_java_base_type_extractor.py::test_whitespace_source PASSED [ 41%]
tests/unit/indexer/test_java_base_type_extractor.py::test_multiple_classes_in_file PASSED [ 41%]
tests/unit/indexer/test_java_base_type_extractor.py::test_extends_is_first_separate_from_implements PASSED [ 41%]
tests/unit/indexer/test_java_base_type_extractor.py::test_positions_are_integers PASSED [ 41%]
tests/unit/indexer/test_java_call_extractor.py::test_simple_method_call PASSED [ 41%]
tests/unit/indexer/test_java_call_extractor.py::test_chained_method_call PASSED [ 41%]
tests/unit/indexer/test_java_call_extractor.py::test_constructor_call PASSED [ 41%]
tests/unit/indexer/test_java_call_extractor.py::test_static_method_call PASSED [ 41%]
tests/unit/indexer/test_java_call_extractor.py::test_function_call_within_method PASSED [ 41%]
tests/unit/indexer/test_java_call_extractor.py::test_caller_full_name_is_set PASSED [ 41%]
tests/unit/indexer/test_java_call_extractor.py::test_no_calls PASSED     [ 41%]
tests/unit/indexer/test_java_call_extractor.py::test_empty_source PASSED [ 41%]
tests/unit/indexer/test_java_call_extractor.py::test_whitespace_source PASSED [ 42%]
tests/unit/indexer/test_java_call_extractor.py::test_call_line_is_1indexed PASSED [ 42%]
tests/unit/indexer/test_java_call_extractor.py::test_deduplicates_identical_entries PASSED [ 42%]
tests/unit/indexer/test_java_call_extractor.py::test_sites_seen_counts_calls PASSED [ 42%]
tests/unit/indexer/test_java_call_extractor.py::test_sites_seen_zero_for_empty_source PASSED [ 42%]
tests/unit/indexer/test_java_call_extractor.py::test_sites_seen_resets_per_extract_call PASSED [ 42%]
tests/unit/indexer/test_java_call_extractor.py::test_skips_field_initializer_call PASSED [ 42%]
tests/unit/indexer/test_java_call_extractor.py::test_skips_static_field_initializer PASSED [ 42%]
tests/unit/indexer/test_java_call_extractor.py::test_includes_constructor_body_calls PASSED [ 42%]
tests/unit/indexer/test_java_call_extractor.py::test_includes_lambda_body_calls PASSED [ 42%]
tests/unit/indexer/test_java_import_extractor.py::test_single_import PASSED [ 42%]
tests/unit/indexer/test_java_import_extractor.py::test_multiple_imports PASSED [ 42%]
tests/unit/indexer/test_java_import_extractor.py::test_wildcard_import PASSED [ 42%]
tests/unit/indexer/test_java_import_extractor.py::test_static_import PASSED [ 42%]
tests/unit/indexer/test_java_import_extractor.py::test_static_wildcard_import PASSED [ 42%]
tests/unit/indexer/test_java_import_extractor.py::test_no_imports PASSED [ 42%]
tests/unit/indexer/test_java_import_extractor.py::test_empty_source PASSED [ 42%]
tests/unit/indexer/test_java_import_extractor.py::test_whitespace_source PASSED [ 43%]
tests/unit/indexer/test_java_import_extractor.py::test_deduplicates_same_import PASSED [ 43%]
tests/unit/indexer/test_java_package_extraction.py::test_extract_java_package_scoped PASSED [ 43%]
tests/unit/indexer/test_java_package_extraction.py::test_extract_java_package_simple PASSED [ 43%]
tests/unit/indexer/test_java_package_extraction.py::test_extract_java_package_none PASSED [ 43%]
tests/unit/indexer/test_java_package_extraction.py::test_index_file_structure_wires_package_contains PASSED [ 43%]
tests/unit/indexer/test_java_package_extraction.py::test_index_file_structure_skips_package_for_non_java PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_parameter_type PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_multiple_parameter_types PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_return_type PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_field_type PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_generic_type PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_nested_generic_type PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_skips_primitives PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_skips_void PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_skips_all_java_primitives PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_local_variable_type PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_array_type PASSED [ 43%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_no_type_refs PASSED [ 44%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_empty_source PASSED [ 44%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_whitespace_source PASSED [ 44%]
tests/unit/indexer/test_java_type_ref_extractor.py::test_type_ref_has_correct_owner PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_index_writes_edge_for_shared_method_name PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_index_writes_no_edges_when_no_pairs PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_index_writes_no_edges_when_no_matching_methods PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_index_writes_multiple_edges_for_multiple_pairs PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_index_writes_dispatches_to_for_abstract_base PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_index_no_edges_for_abstract_base_no_matching_methods PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_index_handles_both_interface_and_abstract_pairs PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_transitive_implements_creates_edges PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_protocol_dispatch_creates_edges PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_protocol_dispatch_skips_csharp_interfaces PASSED [ 44%]
tests/unit/indexer/test_method_implements_indexer.py::test_protocol_dispatch_skips_java_interfaces PASSED [ 44%]
tests/unit/indexer/test_overrides_indexer.py::test_index_executes_inherits_traversal_query PASSED [ 44%]
tests/unit/indexer/test_overrides_indexer.py::test_index_creates_overrides_merge PASSED [ 44%]
tests/unit/indexer/test_overrides_indexer.py::test_index_excludes_self_overrides PASSED [ 44%]
tests/unit/indexer/test_overrides_indexer.py::test_index_matches_methods_by_name PASSED [ 45%]
tests/unit/indexer/test_overrides_indexer.py::test_index_queries_edge_count_and_returns_it PASSED [ 45%]
tests/unit/indexer/test_overrides_indexer.py::test_index_returns_zero_when_no_edges PASSED [ 45%]
tests/unit/indexer/test_parsed_file.py::test_parsed_file_holds_source_and_tree PASSED [ 45%]
tests/unit/indexer/test_parsed_file.py::test_parsed_file_is_frozen PASSED [ 45%]
tests/unit/indexer/test_parsed_file.py::test_python_plugin_parse_file PASSED [ 45%]
tests/unit/indexer/test_parsed_file.py::test_typescript_plugin_parse_file_ts PASSED [ 45%]
tests/unit/indexer/test_parsed_file.py::test_typescript_plugin_parse_file_tsx PASSED [ 45%]
tests/unit/indexer/test_parsed_file.py::test_java_plugin_parse_file PASSED [ 45%]
tests/unit/indexer/test_parsed_file.py::test_csharp_plugin_parse_file PASSED [ 45%]
tests/unit/indexer/test_python_assignment_extractor.py::test_extracts_self_field_call_assignment PASSED [ 45%]
tests/unit/indexer/test_python_assignment_extractor.py::test_extracts_attribute_call_assignment PASSED [ 45%]
tests/unit/indexer/test_python_assignment_extractor.py::test_skips_string_rhs PASSED [ 45%]
tests/unit/indexer/test_python_assignment_extractor.py::test_skips_list_rhs PASSED [ 45%]
tests/unit/indexer/test_python_assignment_extractor.py::test_skips_non_self_assignment_in_method PASSED [ 45%]
tests/unit/indexer/test_python_assignment_extractor.py::test_module_scope_call_assignment PASSED [ 45%]
tests/unit/indexer/test_python_assignment_extractor.py::test_module_scope_skips_non_call PASSED [ 45%]
tests/unit/indexer/test_python_assignment_extractor.py::test_nested_class_inner_field PASSED [ 45%]
tests/unit/indexer/test_python_assignment_extractor.py::test_multiple_assignments_in_same_class PASSED [ 46%]
tests/unit/indexer/test_python_assignment_extractor.py::test_empty_source_returns_empty PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_abstractmethod_decorator PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_staticmethod_decorator PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_classmethod_decorator PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_async_def PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_abc_class PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_empty_source_returns_empty PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_source_with_no_decorators_returns_empty PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_combined_decorators_static_and_async PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_nested_class_methods PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_python_plugin_create_attribute_extractor_returns_instance PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_multiple_decorators PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_abcmeta_class PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_protocol_class PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_abstractmethod_does_not_leak_to_overrides PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_extract_runtime_checkable_protocol PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_nested_decorated_function_captured PASSED [ 46%]
tests/unit/indexer/test_python_attribute_extractor.py::test_nested_decorated_inside_decorated_function PASSED [ 47%]
tests/unit/indexer/test_python_base_type_extractor.py::test_single_inheritance PASSED [ 47%]
tests/unit/indexer/test_python_base_type_extractor.py::test_multiple_inheritance PASSED [ 47%]
tests/unit/indexer/test_python_base_type_extractor.py::test_abc_inheritance PASSED [ 47%]
tests/unit/indexer/test_python_base_type_extractor.py::test_no_base_class PASSED [ 47%]
tests/unit/indexer/test_python_base_type_extractor.py::test_dotted_base PASSED [ 47%]
tests/unit/indexer/test_python_base_type_extractor.py::test_nested_class PASSED [ 47%]
tests/unit/indexer/test_python_base_type_extractor.py::test_empty_source PASSED [ 47%]
tests/unit/indexer/test_python_base_type_extractor.py::test_positions_are_integers PASSED [ 47%]
tests/unit/indexer/test_python_base_type_extractor.py::test_dotted_base_position_points_to_leaf PASSED [ 47%]
tests/unit/indexer/test_python_call_extractor.py::test_extracts_function_body_call PASSED [ 47%]
tests/unit/indexer/test_python_call_extractor.py::test_caller_full_name_is_set PASSED [ 47%]
tests/unit/indexer/test_python_call_extractor.py::test_extracts_method_call_self PASSED [ 47%]
tests/unit/indexer/test_python_call_extractor.py::test_attribute_call_callee_simple_name PASSED [ 47%]
tests/unit/indexer/test_python_call_extractor.py::test_skips_class_scope PASSED [ 47%]
tests/unit/indexer/test_python_call_extractor.py::test_module_scope_caller_full_name PASSED [ 47%]
tests/unit/indexer/test_python_call_extractor.py::test_module_scope_skipped_without_resolver PASSED [ 47%]
tests/unit/indexer/test_python_call_extractor.py::test_returns_empty_for_empty_source PASSED [ 47%]
tests/unit/indexer/test_python_call_extractor.py::test_super_init PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_constructor_call PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_deduplicates_identical_entries PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_call_line_is_1indexed PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_sites_seen_counts_function_scope_calls PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_sites_seen_counts_module_scope_calls PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_sites_seen_zero_for_empty_source PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_sites_seen_resets_per_extract_call PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_self_method_call_qualified_with_class PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_self_private_method_qualified PASSED [ 48%]
tests/unit/indexer/test_python_call_extractor.py::test_bare_function_call_not_qualified PASSED [ 48%]
tests/unit/indexer/test_python_import_extractor.py::test_from_import_single PASSED [ 48%]
tests/unit/indexer/test_python_import_extractor.py::test_from_import_multiple PASSED [ 48%]
tests/unit/indexer/test_python_import_extractor.py::test_bare_import PASSED [ 48%]
tests/unit/indexer/test_python_import_extractor.py::test_star_import_skipped PASSED [ 48%]
tests/unit/indexer/test_python_import_extractor.py::test_relative_import_single_dot PASSED [ 48%]
tests/unit/indexer/test_python_import_extractor.py::test_relative_import_double_dot PASSED [ 48%]
tests/unit/indexer/test_python_import_extractor.py::test_empty_source PASSED [ 48%]
tests/unit/indexer/test_python_import_extractor.py::test_duplicate_imports_deduplicated PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_extracts_parameter_type PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_extracts_multiple_params PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_extracts_typed_default_parameter PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_extracts_return_type PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_extracts_class_annotation PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_generic_type_extracts_inner PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_generic_dict_extracts_non_primitive PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_union_type_extracts_non_none PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_union_type_extracts_both PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_skips_primitives PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_empty_source PASSED [ 49%]
tests/unit/indexer/test_python_type_ref_extractor.py::test_typing_optional_extracts_inner PASSED [ 49%]
tests/unit/indexer/test_reindex_upsert.py::test_reindex_does_not_call_delete_file_nodes PASSED [ 49%]
tests/unit/indexer/test_reindex_upsert.py::test_reindex_does_not_call_collect_or_restore_summaries PASSED [ 49%]
tests/unit/indexer/test_reindex_upsert.py::test_reindex_calls_get_file_symbol_names_before_upsert PASSED [ 49%]
tests/unit/indexer/test_reindex_upsert.py::test_reindex_calls_delete_orphaned_symbols_after_upsert PASSED [ 49%]
tests/unit/indexer/test_reindex_upsert.py::test_reindex_calls_delete_outgoing_edges_before_resolve PASSED [ 50%]
tests/unit/indexer/test_reindex_upsert.py::test_delete_file_still_uses_delete_file_nodes PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_links_repository_to_root_directory PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_normalizes_trailing_slash PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_upserts_file_node PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_upserts_class_symbol PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_shuts_down_lsp PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_does_not_shut_down_lsp_in_watch_mode PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_runs_symbol_resolver_after_structural_pass PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_nested_symbol_gets_contains_from_parent_not_file PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_top_level_symbol_gets_contains_from_file PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_directory_chain_creates_dir_contains_dir PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_interface_symbol_creates_interface_node PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_runs_base_type_extractor PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_directory_chain_creates_dir_contains_file PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_uses_symbol_resolver PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_upsert_symbol_passes_end_line PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_index_project_calls_method_implements_indexer PASSED [ 50%]
tests/unit/indexer/test_structural_pass.py::test_reindex_file_preserves_summaries_via_upsert PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_init_method_produces_kind_constructor PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_top_level_function_kind_str_is_function PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_module_symbol_uses_kind_module PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_class_symbol_passes_language PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_method_symbol_passes_language PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_base_types_class_to_class_produce_inherits PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_base_type_abc_produces_implements PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_interface_extends_interface_produces_interface_inherits PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_import_extractor_tuple_output_handled PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_csharp_import_extractor_string_output_still_handled PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_reindex_file_python PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_reindex_file_python_call_wiring PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_reindex_file_python_overrides PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_reindex_file_python_module_name_resolver PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_reindex_file_typescript PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_reindex_file_typescript_call_wiring PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_abc_class_creates_interface_node PASSED [ 51%]
tests/unit/indexer/test_structural_pass.py::test_python_protocol_class_creates_interface_node PASSED [ 52%]
tests/unit/indexer/test_structural_pass.py::test_reindex_file_python_abc_creates_interface_node PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_walks_cs_files_and_calls_both_extractors PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_opens_lsp_context_once_per_file PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_writes_calls_edge PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_writes_references_edge PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_writes_calls_edge_when_lsp_returns_class PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_skips_call_when_lsp_returns_class_without_matching_child PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_writes_references_edge_via_name_map_fallback PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_skips_references_when_name_map_ambiguous PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolve_call_passes_line_col_to_upsert_calls PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolve_call_resolves_overloaded_callee_name PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_walks_py_files_with_python_extractor PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_uses_upsert_module_calls_for_module_callers PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolver_tracks_unresolved_sites PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolve_call_fallback_via_assignment_map PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolve_call_assignment_fallback_second_lsp_fails PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolve_call_no_assignment_map_entry_falls_through PASSED [ 52%]
tests/unit/indexer/test_symbol_resolver.py::test_resolve_call_direct_hit_skips_assignment_fallback PASSED [ 53%]
tests/unit/indexer/test_symbol_resolver.py::test_resolve_stats_tracks_assignment_fallback_count PASSED [ 53%]
tests/unit/indexer/test_sync.py::test_stale_file_detected PASSED         [ 53%]
tests/unit/indexer/test_sync.py::test_fresh_file_unchanged PASSED        [ 53%]
tests/unit/indexer/test_sync.py::test_deleted_file_detected PASSED       [ 53%]
tests/unit/indexer/test_sync.py::test_new_file_detected PASSED           [ 53%]
tests/unit/indexer/test_sync.py::test_empty_graph_all_new PASSED         [ 53%]
tests/unit/indexer/test_sync.py::test_empty_disk_all_deleted PASSED      [ 53%]
tests/unit/indexer/test_sync.py::test_no_changes PASSED                  [ 53%]
tests/unit/indexer/test_sync.py::test_equal_timestamp_treated_as_unchanged PASSED [ 53%]
tests/unit/indexer/test_sync.py::test_sync_result_total PASSED           [ 53%]
tests/unit/indexer/test_sync.py::test_sync_project_orchestration PASSED  [ 53%]
tests/unit/indexer/test_sync.py::test_sync_project_no_changes PASSED     [ 53%]
tests/unit/indexer/test_sync.py::test_sync_project_no_repo_raises PASSED [ 53%]
tests/unit/indexer/test_sync.py::test_sync_project_language_filter PASSED [ 53%]
tests/unit/indexer/test_sync.py::test_sync_project_language_filter_ignores_other_languages PASSED [ 53%]
tests/unit/indexer/test_sync.py::test_sync_project_continues_on_reindex_failure PASSED [ 53%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_decorator PASSED [ 53%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_decorator_with_parens PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_decorator_on_method PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_abstract_class PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_abstract_method PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_static_method PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_static_field PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_async_function PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_async_method PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_export_class PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_export_function PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_accessibility_public PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_accessibility_private PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_accessibility_protected PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_combined_modifiers_static_async PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_export_abstract_decorated PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_async_arrow_function PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_extract_exported_async_arrow_function PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_non_async_arrow_function_no_markers PASSED [ 54%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_empty_source PASSED [ 55%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_tsx_file PASSED [ 55%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_no_markers_no_result PASSED [ 55%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_attrs_to_flags_abstract PASSED [ 55%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_attrs_to_flags_static PASSED [ 55%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_attrs_to_flags_async PASSED [ 55%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_attrs_to_flags_combined PASSED [ 55%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_attrs_to_flags_decorator_ignored PASSED [ 55%]
tests/unit/indexer/test_typescript_attribute_extractor.py::test_plugin_returns_extractors PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_class_single_extends PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_class_extends_and_implements PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_class_implements_only PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_class_extends_generic PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_class_extends_qualified PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_class_implements_qualified PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_abstract_class_extends PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_interface_extends_single PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_interface_extends_multiple PASSED [ 55%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_interface_extends_generic PASSED [ 56%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_no_base_types PASSED [ 56%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_empty_source PASSED [ 56%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_tsx_file_jsx_syntax PASSED [ 56%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_multiple_classes_in_file PASSED [ 56%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_implements_with_generic PASSED [ 56%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_positions_are_integers PASSED [ 56%]
tests/unit/indexer/test_typescript_base_type_extractor.py::test_qualified_extends_position_points_to_property PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_extracts_bare_function_call PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_caller_full_name_is_set PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_extracts_method_call PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_extracts_new_expression PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_scope_function PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_scope_arrow_function PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_scope_class_body_skipped PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_scope_module PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_scope_module_no_resolver PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_tsx_file_uses_tsx_parser PASSED [ 56%]
tests/unit/indexer/test_typescript_call_extractor.py::test_jsx_file_uses_tsx_parser PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_js_file_uses_ts_parser PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_empty_source_returns_empty PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_whitespace_source_returns_empty PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_deduplicates_same_call PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_call_line_is_1indexed PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_sites_seen_counts_function_scope_calls PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_sites_seen_counts_module_scope_calls PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_sites_seen_zero_for_empty_source PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_jsx_self_closing_element_emits_call PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_jsx_opening_element_emits_call PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_jsx_nested_components PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_jsx_html_tags_also_captured PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_jsx_not_captured_in_ts_files PASSED [ 57%]
tests/unit/indexer/test_typescript_call_extractor.py::test_sites_seen_resets_per_extract_call PASSED [ 57%]
tests/unit/indexer/test_typescript_import_extractor.py::test_named_import PASSED [ 57%]
tests/unit/indexer/test_typescript_import_extractor.py::test_named_import_single PASSED [ 57%]
tests/unit/indexer/test_typescript_import_extractor.py::test_default_import PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_namespace_import PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_type_import PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_require PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_require_package PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_reexport_named PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_reexport_named_single PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_reexport_star PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_relative_import_resolved PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_relative_import_parent_dir PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_package_import_unchanged PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_scoped_package_import_unchanged PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_aliased_import_uses_original_name PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_empty_source_returns_empty PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_whitespace_only_returns_empty PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_deduplicates PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_tsx_file_parses PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_jsx_file_parses PASSED [ 58%]
tests/unit/indexer/test_typescript_import_extractor.py::test_js_file_parses PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_ts_file_parses PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_mixed_import_styles PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_path_alias_resolved_from_tsconfig PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_path_alias_from_subdirectory_tsconfig PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_path_alias_lazy_loading PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_path_alias_with_block_comments PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_path_alias_with_line_comments PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_path_alias_with_trailing_commas PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_build_import_map_named_imports PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_build_import_map_excludes_default_imports PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_build_import_map_empty_when_no_imports PASSED [ 59%]
tests/unit/indexer/test_typescript_import_extractor.py::test_jsonc_comments_inside_strings_preserved PASSED [ 59%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_extracts_parameter_type PASSED [ 59%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_extracts_optional_parameter PASSED [ 59%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_extracts_multiple_params PASSED [ 59%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_extracts_return_type PASSED [ 59%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_extracts_generic_return_type PASSED [ 59%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_extracts_field_type PASSED [ 60%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_extracts_property_type PASSED [ 60%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_skips_primitives PASSED [ 60%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_skips_all_ts_primitives PASSED [ 60%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_generic_type PASSED [ 60%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_union_type_filters_primitives PASSED [ 60%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_union_non_primitives PASSED [ 60%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_array_shorthand PASSED [ 60%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_empty_source PASSED [ 60%]
tests/unit/indexer/test_typescript_type_ref_extractor.py::test_tsx_file PASSED [ 60%]
tests/unit/lsp/test_csharp_adapter.py::test_symbol_kind_values_cover_csharp_types PASSED [ 60%]
tests/unit/lsp/test_csharp_adapter.py::test_csharp_adapter_implements_protocol PASSED [ 60%]
tests/unit/lsp/test_csharp_adapter.py::test_build_full_name_root_symbol PASSED [ 60%]
tests/unit/lsp/test_csharp_adapter.py::test_build_full_name_one_parent PASSED [ 60%]
tests/unit/lsp/test_csharp_adapter.py::test_build_full_name_two_parents PASSED [ 60%]
tests/unit/lsp/test_csharp_adapter.py::test_build_full_name_overload_appends_params PASSED [ 60%]
tests/unit/lsp/test_csharp_adapter.py::test_build_full_name_overload_no_paren_in_detail PASSED [ 60%]
tests/unit/lsp/test_csharp_adapter.py::test_convert_produces_qualified_full_name PASSED [ 60%]
tests/unit/lsp/test_csharp_adapter.py::test_find_method_calls_returns_empty PASSED [ 61%]
tests/unit/lsp/test_csharp_adapter.py::test_find_overridden_method_returns_none PASSED [ 61%]
tests/unit/lsp/test_csharp_adapter.py::test_index_symbol_has_parent_full_name_field PASSED [ 61%]
tests/unit/lsp/test_csharp_adapter.py::test_index_symbol_parent_full_name_defaults_to_none PASSED [ 61%]
tests/unit/lsp/test_csharp_adapter.py::test_get_document_symbols_sets_parent_full_name_on_nested_symbol PASSED [ 61%]
tests/unit/lsp/test_csharp_adapter.py::test_get_document_symbols_sets_none_parent_for_top_level PASSED [ 61%]
tests/unit/lsp/test_csharp_adapter.py::test_index_symbol_has_end_line_default PASSED [ 61%]
tests/unit/lsp/test_csharp_adapter.py::test_convert_captures_end_line PASSED [ 61%]
tests/unit/lsp/test_csharp_adapter.py::test_create_uses_csharp_language_enum PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_class_mapping PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_method_mapping PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_constructor_mapping PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_interface_mapping PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_enum_mapping PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_field_mapping PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_constant_mapping PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_namespace_mapping PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_property_mapping PASSED [ 61%]
tests/unit/lsp/test_java_adapter.py::TestLSPKindMap::test_function_mapping PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_strips_directory_prefix_com PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_strips_directory_prefix_org PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_strips_dotdot_segments PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_preserves_clean_name PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_preserves_name_without_known_prefix PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_handles_nested_class PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_handles_method PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_preserves_io_prefix PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_preserves_net_prefix PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_preserves_dev_prefix PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_java_dir_segment_not_confused_as_prefix PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestCleanJavaFullName::test_java_dir_with_known_prefix_after PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestDetectJavaSourceRoot::test_maven_src_main_java PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestDetectJavaSourceRoot::test_maven_src_test_java PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestDetectJavaSourceRoot::test_simple_src_java PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestDetectJavaSourceRoot::test_flat_layout_fallback PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestDetectJavaSourceRoot::test_src_only_no_java_dir PASSED [ 62%]
tests/unit/lsp/test_java_adapter.py::TestDetectJavaSourceRoot::test_src_main_fallback_when_no_java_dir PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestDetectJavaSourceRoot::test_src_test_fallback_when_no_java_dir PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestDetectJavaSourceRoot::test_multi_module_different_roots PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestBuildJavaFullName::test_class_with_package PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestBuildJavaFullName::test_method_with_package PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestBuildJavaFullName::test_namespace_parent_is_skipped PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestBuildJavaFullName::test_nested_class_method PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestBuildJavaFullName::test_no_package_prefix PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestBuildJavaFullName::test_overload_idx_appended PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestConvert::test_convert_class_symbol PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestConvert::test_convert_method_symbol PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestConvert::test_convert_constructor PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestConvert::test_convert_interface PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestConvert::test_convert_constant PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestConvert::test_convert_abstract_method PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestConvert::test_convert_static_method PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestConvert::test_convert_unmapped_kind_defaults_to_class PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestGetWorkspaceFiles::test_excludes_build_dirs PASSED [ 63%]
tests/unit/lsp/test_java_adapter.py::TestGetWorkspaceFiles::test_returns_only_java_files PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestGetWorkspaceFiles::test_returns_absolute_paths PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestGetDocumentSymbols::test_returns_symbols_from_root PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestGetDocumentSymbols::test_returns_empty_on_none PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestGetDocumentSymbols::test_traverse_sets_parent_full_name PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestGetDocumentSymbols::test_returns_empty_on_exception PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestGetDocumentSymbols::test_per_file_source_root_not_cached PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestConvertSelectionRange::test_uses_selection_range_start_line_when_present PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestConvertSelectionRange::test_falls_back_to_location_range_when_selection_range_absent PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestConvertSelectionRange::test_end_line_not_taken_from_selection_range PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestStubs::test_find_method_calls_returns_empty PASSED [ 64%]
tests/unit/lsp/test_java_adapter.py::TestStubs::test_find_overridden_method_returns_none PASSED [ 64%]
tests/unit/lsp/test_python_adapter.py::TestDetectSourceRoot::test_package_layout_returns_project_root PASSED [ 64%]
tests/unit/lsp/test_python_adapter.py::TestDetectSourceRoot::test_src_layout_returns_src_dir PASSED [ 64%]
tests/unit/lsp/test_python_adapter.py::TestDetectSourceRoot::test_flat_layout_returns_project_root PASSED [ 64%]
tests/unit/lsp/test_python_adapter.py::TestBuildPythonFullName::test_simple_class_in_submodule PASSED [ 64%]
tests/unit/lsp/test_python_adapter.py::TestBuildPythonFullName::test_nested_class_includes_parent_chain PASSED [ 64%]
tests/unit/lsp/test_python_adapter.py::TestBuildPythonFullName::test_module_level_function PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestBuildPythonFullName::test_init_py_strips_dunder_init PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestBuildPythonFullName::test_deeply_nested_method PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestConvert::test_kind_5_class_maps_to_class PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestConvert::test_kind_2_module_maps_to_class PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestConvert::test_kind_2_module_sets_signature_module PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestConvert::test_kind_12_function_maps_to_method PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestConvert::test_kind_7_property_maps_to_property PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestConvert::test_dunder_init_maps_to_method PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestConvert::test_kind_14_constant_returns_none PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestGetDocumentSymbols::test_passes_relpath_to_language_server PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestGetDocumentSymbols::test_skips_reexported_symbols_in_init_py PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestGetDocumentSymbols::test_keeps_symbols_defined_in_init_py PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestCreate::test_create_calls_start_before_returning PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestCreate::test_create_passes_root_path_to_pyright_server PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::test_python_adapter_implements_protocol PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::test_find_method_calls_returns_empty PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::test_find_overridden_method_returns_none PASSED [ 65%]
tests/unit/lsp/test_python_adapter.py::TestConvertSignature::test_convert_function_uses_detail_as_signature PASSED [ 66%]
tests/unit/lsp/test_python_adapter.py::TestConvertSignature::test_convert_method_uses_detail_as_signature PASSED [ 66%]
tests/unit/lsp/test_python_adapter.py::TestConvertSignature::test_convert_class_empty_signature_when_no_detail PASSED [ 66%]
tests/unit/lsp/test_python_adapter.py::TestConvertSignature::test_convert_module_preserves_module_marker PASSED [ 66%]
tests/unit/lsp/test_python_adapter.py::TestConvertSignature::test_convert_module_without_detail_keeps_module_marker PASSED [ 66%]
tests/unit/lsp/test_python_adapter.py::TestConvertSignature::test_convert_function_without_detail_has_empty_signature PASSED [ 66%]
tests/unit/lsp/test_python_adapter.py::test_shutdown_calls_stop PASSED   [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestBuildTsFullName::test_class_in_subdir PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestBuildTsFullName::test_function_in_tsx_file PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestBuildTsFullName::test_nested_method_inside_class PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestBuildTsFullName::test_forward_slashes_on_all_platforms PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_5_class_maps_to_class PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_6_method_maps_to_method PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_7_property_maps_to_property PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_8_field_maps_to_field PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_9_constructor_maps_to_method PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_10_enum_maps_to_enum PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_11_interface_maps_to_interface PASSED [ 66%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_12_function_maps_to_method PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_2_module_maps_to_class PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_2_module_sets_signature_module PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_3_namespace_maps_to_namespace PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_13_variable_returns_none PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestConvert::test_kind_14_constant_returns_none PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestGetWorkspaceFiles::test_returns_ts_files PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestGetWorkspaceFiles::test_returns_tsx_files PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestGetWorkspaceFiles::test_returns_js_files PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestGetWorkspaceFiles::test_returns_jsx_files PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestGetWorkspaceFiles::test_returns_mts_files PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestGetWorkspaceFiles::test_returns_cts_files PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestGetWorkspaceFiles::test_returns_mjs_files PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestGetWorkspaceFiles::test_returns_cjs_files PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestGetWorkspaceFiles::test_excludes_non_ts_files PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_node_modules PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_dist PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_build PASSED [ 67%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_git PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_coverage PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_included_file_alongside_excluded_dirs PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_coveragereport PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_dot_next PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_dot_nuxt PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_out PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_dot_cache PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_min_js_suffix PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestExclusions::test_excludes_bundle_js_suffix PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestGetDocumentSymbols::test_passes_relpath_to_language_server PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestGetDocumentSymbols::test_returns_empty_list_when_lsp_returns_none PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestGetDocumentSymbols::test_converts_root_symbols PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestCreate::test_create_calls_start_before_returning PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::TestCreate::test_create_passes_root_path_to_language_server PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::test_protocol_conformance PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::test_language_server_property PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::test_find_method_calls_returns_empty PASSED [ 68%]
tests/unit/lsp/test_typescript_adapter.py::test_find_overridden_method_returns_none PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestTraverseConstObjectPromotion::test_top_level_const_with_method_children_promoted_to_class PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestTraverseConstObjectPromotion::test_top_level_variable_with_children_promoted PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestTraverseConstObjectPromotion::test_simple_variable_without_children_still_skipped PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestTraverseConstObjectPromotion::test_variable_with_empty_children_still_skipped PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestTraverseConstObjectPromotion::test_nested_variable_inside_method_not_promoted PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestTraverseConstObjectPromotion::test_unknown_kind_with_children_not_promoted PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestTraverseConstObjectPromotion::test_const_with_only_property_children_promoted_to_method PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestTraverseConstObjectPromotion::test_const_with_variable_children_promoted_to_method PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestTraverseConstObjectPromotion::test_const_with_mixed_children_promoted_to_class PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::TestConvertAsClass::test_produces_class_kind_with_const_object_signature PASSED [ 69%]
tests/unit/lsp/test_typescript_adapter.py::test_shutdown_calls_stop PASSED [ 69%]
tests/unit/onboarding/test_agent_instructions.py::test_markdown_section_has_markers PASSED [ 69%]
tests/unit/onboarding/test_agent_instructions.py::test_markdown_section_contains_tool_guidance PASSED [ 69%]
tests/unit/onboarding/test_agent_instructions.py::test_cursor_mdc_has_frontmatter PASSED [ 69%]
tests/unit/onboarding/test_agent_instructions.py::test_cursor_mdc_has_body PASSED [ 69%]
tests/unit/onboarding/test_agent_instructions.py::test_upsert_creates_new_file PASSED [ 69%]
tests/unit/onboarding/test_agent_instructions.py::test_upsert_appends_to_existing_file PASSED [ 69%]
tests/unit/onboarding/test_agent_instructions.py::test_upsert_replaces_existing_section PASSED [ 70%]
tests/unit/onboarding/test_agent_instructions.py::test_upsert_is_idempotent PASSED [ 70%]
tests/unit/onboarding/test_agent_instructions.py::test_upsert_creates_parent_dirs PASSED [ 70%]
tests/unit/onboarding/test_agent_instructions.py::test_write_cursor_mdc_creates_file PASSED [ 70%]
tests/unit/onboarding/test_agent_instructions.py::test_write_cursor_mdc_overwrites_existing PASSED [ 70%]
tests/unit/onboarding/test_agent_instructions.py::test_install_writes_all_agent_files PASSED [ 70%]
tests/unit/onboarding/test_agent_instructions.py::test_install_preserves_existing_claude_md PASSED [ 70%]
tests/unit/onboarding/test_agent_instructions.py::test_install_updates_existing_synapps_section PASSED [ 70%]
tests/unit/onboarding/test_agent_instructions.py::test_install_is_idempotent PASSED [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_checks_for_languages_python_only PASSED [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_checks_for_languages_empty_returns_nothing PASSED [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_checks_for_languages_multi PASSED [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_wizard_calls_smart_index PASSED [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_wizard_shows_fix_on_failure PASSED [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_wizard_offers_mcp_config PASSED [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_wizard_skips_mcp_when_declined PASSED [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_summary_printed PASSED   [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_non_interactive_stdin PASSED [ 70%]
tests/unit/onboarding/test_init_wizard.py::test_docker_not_running_exits_with_error PASSED [ 71%]
tests/unit/onboarding/test_init_wizard.py::test_memgraph_auto_started_via_connection_manager PASSED [ 71%]
tests/unit/onboarding/test_init_wizard.py::test_db_mode_prompt_shown_when_no_existing_config PASSED [ 71%]
tests/unit/onboarding/test_init_wizard.py::test_db_mode_prompt_skipped_when_config_exists PASSED [ 71%]
tests/unit/onboarding/test_init_wizard.py::test_has_existing_db_config_returns_false_for_missing_file PASSED [ 71%]
tests/unit/onboarding/test_init_wizard.py::test_has_existing_db_config_returns_false_without_key PASSED [ 71%]
tests/unit/onboarding/test_init_wizard.py::test_has_existing_db_config_returns_true_with_key PASSED [ 71%]
tests/unit/onboarding/test_init_wizard.py::test_write_db_config_creates_file PASSED [ 71%]
tests/unit/onboarding/test_init_wizard.py::test_write_db_config_preserves_existing_keys PASSED [ 71%]
tests/unit/onboarding/test_init_wizard.py::TestInitWizardHookOffer::test_init_offers_hook_installation PASSED [ 71%]
tests/unit/onboarding/test_language_detector.py::TestDetectLanguages::test_detect_languages_returns_sorted_by_count PASSED [ 71%]
tests/unit/onboarding/test_language_detector.py::TestDetectLanguages::test_detect_languages_filters_below_threshold PASSED [ 71%]
tests/unit/onboarding/test_language_detector.py::TestDetectLanguages::test_detect_languages_empty_project PASSED [ 71%]
tests/unit/onboarding/test_language_detector.py::TestDetectLanguages::test_detect_languages_mixed_above_and_below PASSED [ 71%]
tests/unit/onboarding/test_mcp_configurator.py::TestDetectMCPClients::test_detect_clients_includes_claude_code PASSED [ 71%]
tests/unit/onboarding/test_mcp_configurator.py::TestDetectMCPClients::test_detect_clients_skips_global_when_app_not_installed PASSED [ 71%]
tests/unit/onboarding/test_mcp_configurator.py::TestDetectMCPClients::test_detect_clients_includes_cursor_without_dot_cursor_dir PASSED [ 71%]
tests/unit/onboarding/test_mcp_configurator.py::TestDetectMCPClients::test_cursor_entry_has_needs_project_path_true PASSED [ 72%]
tests/unit/onboarding/test_mcp_configurator.py::TestDetectMCPClients::test_cursor_get_config_path_receives_project_path PASSED [ 72%]
tests/unit/onboarding/test_mcp_configurator.py::TestWriteMCPConfig::test_write_creates_new_file PASSED [ 72%]
tests/unit/onboarding/test_mcp_configurator.py::TestWriteMCPConfig::test_write_preserves_existing_servers PASSED [ 72%]
tests/unit/onboarding/test_mcp_configurator.py::TestWriteMCPConfig::test_write_uses_servers_key_for_vscode PASSED [ 72%]
tests/unit/onboarding/test_mcp_configurator.py::TestWriteMCPConfig::test_write_atomic_uses_os_replace PASSED [ 72%]
tests/unit/onboarding/test_mcp_configurator.py::TestWriteMCPConfig::test_write_backs_up_corrupt_json PASSED [ 72%]
tests/unit/onboarding/test_mcp_configurator.py::TestWriteMCPConfig::test_write_creates_parent_dirs PASSED [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_name_returns_csharp PASSED [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_file_extensions_returns_cs PASSED [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_is_language_plugin PASSED  [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_create_import_extractor_returns_csharp_type PASSED [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_create_base_type_extractor_returns_csharp_type PASSED [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_create_call_extractor_returns_tree_sitter_type PASSED [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_create_attribute_extractor_returns_csharp_type PASSED [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_create_type_ref_extractor_returns_tree_sitter_type PASSED [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_create_lsp_adapter_delegates_to_csharp_adapter PASSED [ 72%]
tests/unit/plugin/test_csharp_plugin.py::test_missing_tree_sitter_raises_module_not_found PASSED [ 72%]
tests/unit/plugin/test_http_extractor_wiring.py::test_csharp_plugin_has_http_extractor PASSED [ 73%]
tests/unit/plugin/test_http_extractor_wiring.py::test_typescript_plugin_has_http_extractor PASSED [ 73%]
tests/unit/plugin/test_http_extractor_wiring.py::test_python_plugin_has_http_extractor PASSED [ 73%]
tests/unit/plugin/test_http_extractor_wiring.py::test_java_plugin_has_http_extractor PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_language_plugin_is_runtime_checkable PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_language_plugin_rejects_incomplete PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_protocol_has_name_property PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_protocol_has_file_extensions_property PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_protocol_has_create_lsp_adapter PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_protocol_has_create_call_extractor PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_protocol_has_create_import_extractor PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_protocol_has_create_base_type_extractor PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_protocol_has_create_attribute_extractor PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_protocol_has_create_type_ref_extractor PASSED [ 73%]
tests/unit/plugin/test_plugin_protocol.py::test_protocol_has_create_assignment_extractor PASSED [ 73%]
tests/unit/plugin/test_python_plugin.py::test_name_returns_python PASSED [ 73%]
tests/unit/plugin/test_python_plugin.py::test_file_extensions_returns_py PASSED [ 73%]
tests/unit/plugin/test_python_plugin.py::test_is_language_plugin PASSED  [ 73%]
tests/unit/plugin/test_python_plugin.py::test_create_base_type_extractor_returns_python_type PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_create_import_extractor_default_source_root PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_create_import_extractor_with_source_root PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_create_call_extractor_returns_python_call_extractor PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_create_attribute_extractor_returns_python_attribute_extractor PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_create_type_ref_extractor_returns_python_type PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_default_registry_includes_python PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_detect_returns_python_plugin_for_py_directory PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_upsert_symbol_imports_creates_imports_edge PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_create_lsp_adapter_delegates_to_python_adapter PASSED [ 74%]
tests/unit/plugin/test_python_plugin.py::test_missing_tree_sitter_raises_module_not_found PASSED [ 74%]
tests/unit/plugin/test_registry.py::test_register_stores_plugin PASSED   [ 74%]
tests/unit/plugin/test_registry.py::test_detect_returns_matching_plugin PASSED [ 74%]
tests/unit/plugin/test_registry.py::test_detect_returns_empty_when_no_match PASSED [ 74%]
tests/unit/plugin/test_registry.py::test_detect_returns_multiple_plugins PASSED [ 74%]
tests/unit/plugin/test_registry.py::test_detect_case_insensitive PASSED  [ 74%]
tests/unit/plugin/test_registry.py::test_get_returns_plugin_by_name PASSED [ 74%]
tests/unit/plugin/test_registry.py::test_get_returns_none_for_missing_name PASSED [ 74%]
tests/unit/plugin/test_registry.py::test_all_extensions_returns_union PASSED [ 75%]
tests/unit/plugin/test_registry.py::test_default_registry_has_csharp PASSED [ 75%]
tests/unit/plugin/test_registry.py::test_detect_typescript_project PASSED [ 75%]
tests/unit/plugin/test_registry.py::test_detect_with_files_returns_plugin_and_file_list PASSED [ 75%]
tests/unit/plugin/test_registry.py::test_detect_with_files_skips_git_and_node_modules PASSED [ 75%]
tests/unit/plugin/test_registry.py::test_detect_with_files_returns_empty_for_no_matching_files PASSED [ 75%]
tests/unit/plugin/test_registry.py::test_detect_with_files_filters_excluded_suffixes PASSED [ 75%]
tests/unit/plugin/test_registry.py::test_detect_delegates_to_detect_with_files PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_name_returns_typescript PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_file_extensions_returns_all_eight PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_is_language_plugin PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_create_lsp_adapter_delegates_to_typescript_adapter PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_create_call_extractor_returns_typescript_call_extractor PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_create_import_extractor_returns_typescript_import_extractor PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_create_base_type_extractor_returns_typescript_base_type_extractor PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_create_attribute_extractor_returns_typescript_attribute_extractor PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_create_type_ref_extractor_returns_typescript_type_ref_extractor PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_default_registry_includes_typescript PASSED [ 75%]
tests/unit/plugin/test_typescript_plugin.py::test_detect_returns_typescript_for_ts_directory PASSED [ 76%]
tests/unit/plugin/test_typescript_plugin.py::test_missing_tree_sitter_raises_module_not_found PASSED [ 76%]
tests/unit/service/test_context_impact.py::test_context_impact_returns_formatted_output PASSED [ 76%]
tests/unit/service/test_context_impact.py::test_context_impact_without_service_returns_error PASSED [ 76%]
tests/unit/test_architecture.py::test_returns_all_four_keys PASSED       [ 76%]
tests/unit/test_architecture.py::test_empty_sections_return_empty_lists PASSED [ 76%]
tests/unit/test_architecture.py::test_stats_keys_on_empty_graph PASSED   [ 76%]
tests/unit/test_architecture.py::test_hotspots_exclude_test_methods PASSED [ 76%]
tests/unit/test_architecture.py::test_hotspots_limit_passed_to_query PASSED [ 76%]
tests/unit/test_architecture.py::test_hotspot_default_limit_is_10 PASSED [ 76%]
tests/unit/test_architecture.py::test_packages_populated PASSED          [ 76%]
tests/unit/test_architecture.py::test_hotspots_populated PASSED          [ 76%]
tests/unit/test_architecture.py::test_http_service_map_serves_direction PASSED [ 76%]
tests/unit/test_architecture.py::test_http_service_map_calls_direction PASSED [ 76%]
tests/unit/test_architecture.py::test_stats_files_by_language PASSED     [ 76%]
tests/unit/test_auto_sync.py::TestCheckAutoSync::test_no_project_path_skips PASSED [ 76%]
tests/unit/test_auto_sync.py::TestCheckAutoSync::test_auto_sync_disabled_in_config_skips PASSED [ 76%]
tests/unit/test_auto_sync.py::TestCheckAutoSync::test_not_git_repo_skips PASSED [ 76%]
tests/unit/test_auto_sync.py::TestCheckAutoSync::test_no_stored_sha_skips PASSED [ 77%]
tests/unit/test_auto_sync.py::TestCheckAutoSync::test_shas_match_skips PASSED [ 77%]
tests/unit/test_auto_sync.py::TestCheckAutoSync::test_shas_differ_triggers_smart_index PASSED [ 77%]
tests/unit/test_auto_sync.py::TestCheckAutoSync::test_missing_config_file_defaults_to_enabled PASSED [ 77%]
tests/unit/test_auto_sync.py::TestCheckAutoSync::test_malformed_config_json_defaults_to_enabled PASSED [ 77%]
tests/unit/test_auto_sync.py::TestCheckAutoSync::test_config_without_auto_sync_key_defaults_to_enabled PASSED [ 77%]
tests/unit/test_banner.py::test_banner_contains_block_characters PASSED  [ 77%]
tests/unit/test_banner.py::test_banner_lines_spell_synapps PASSED        [ 77%]
tests/unit/test_banner.py::test_banner_contains_accent_line_circles PASSED [ 77%]
tests/unit/test_banner.py::test_banner_uses_rich_console_di PASSED       [ 77%]
tests/unit/test_banner.py::test_banner_contains_dark_green_color PASSED  [ 77%]
tests/unit/test_banner.py::test_banner_contains_light_green_color PASSED [ 77%]
tests/unit/test_banner.py::test_banner_accent_line_uses_light_green PASSED [ 77%]
tests/unit/test_banner.py::test_banner_has_two_tone_colors PASSED        [ 77%]
tests/unit/test_cli.py::test_callers_prints_full_name_and_signature PASSED [ 77%]
tests/unit/test_cli.py::test_callers_prints_no_results_when_empty PASSED [ 77%]
tests/unit/test_cli.py::test_callees_prints_full_name_and_signature PASSED [ 77%]
tests/unit/test_cli.py::test_search_prints_full_name PASSED              [ 77%]
tests/unit/test_cli.py::test_hierarchy_prints_labeled_sections PASSED    [ 78%]
tests/unit/test_cli.py::test_hierarchy_prints_none_for_empty_sections PASSED [ 78%]
tests/unit/test_cli.py::test_dependencies_prints_full_name_and_depth PASSED [ 78%]
tests/unit/test_cli.py::test_index_calls_command_does_not_exist PASSED   [ 78%]
tests/unit/test_cli.py::test_callers_errors_when_given_a_class PASSED    [ 78%]
tests/unit/test_cli.py::test_callees_errors_when_given_a_class PASSED    [ 78%]
tests/unit/test_cli.py::test_implementations_errors_when_given_a_class PASSED [ 78%]
tests/unit/test_cli.py::test_callers_errors_when_symbol_not_found PASSED [ 78%]
tests/unit/test_cli.py::test_implementations_accepts_abstract_class PASSED [ 78%]
tests/unit/test_cli.py::test_index_missing_dependency_shows_reinstall_hint PASSED [ 78%]
tests/unit/test_cli.py::test_get_service_uses_connection_manager PASSED  [ 78%]
tests/unit/test_cli.py::test_get_service_defaults_to_cwd PASSED          [ 78%]
tests/unit/test_cli.py::test_index_no_longer_shows_banner PASSED         [ 78%]
tests/unit/test_cli.py::test_index_still_works_end_to_end PASSED         [ 78%]
tests/unit/test_cli.py::test_sync_suggests_index_when_project_not_indexed PASSED [ 78%]
tests/unit/test_cli.py::test_sync_shows_original_error_when_project_indexed PASSED [ 78%]
tests/unit/test_cli.py::test_init_command_calls_run_init PASSED          [ 78%]
tests/unit/test_cli.py::test_get_service_invalidates_on_path_change PASSED [ 79%]
tests/unit/test_cli.py::test_get_service_reuses_for_same_path PASSED     [ 79%]
tests/unit/test_cli.py::test_get_service_invalidates_when_path_changes_from_none PASSED [ 79%]
tests/unit/test_cli.py::test_status_with_path_passes_to_get_service PASSED [ 79%]
tests/unit/test_cli.py::test_delete_passes_path_to_get_service PASSED    [ 79%]
tests/unit/test_cli.py::test_watch_passes_path_to_get_service PASSED     [ 79%]
tests/unit/test_cli_tree.py::TestRenderTree::test_single_node_no_children PASSED [ 79%]
tests/unit/test_cli_tree.py::TestRenderTree::test_single_node_with_annotation PASSED [ 79%]
tests/unit/test_cli_tree.py::TestRenderTree::test_flat_children PASSED   [ 79%]
tests/unit/test_cli_tree.py::TestRenderTree::test_nested_children PASSED [ 79%]
tests/unit/test_cli_tree.py::TestRenderTree::test_deep_nesting PASSED    [ 79%]
tests/unit/test_cli_tree.py::TestRenderTree::test_child_with_annotation PASSED [ 79%]
tests/unit/test_cli_tree.py::TestRenderTree::test_complex_tree PASSED    [ 79%]
tests/unit/test_cli_tree.py::TestCallersTree::test_basic PASSED          [ 79%]
tests/unit/test_cli_tree.py::TestCallersTree::test_empty_list PASSED     [ 79%]
tests/unit/test_cli_tree.py::TestCallersTree::test_with_annotation PASSED [ 79%]
tests/unit/test_cli_tree.py::TestCallersTree::test_single_caller PASSED  [ 79%]
tests/unit/test_cli_tree.py::TestCalleesTree::test_basic PASSED          [ 79%]
tests/unit/test_cli_tree.py::TestCalleesTree::test_empty_list PASSED     [ 80%]
tests/unit/test_cli_tree.py::TestHierarchyTree::test_all_categories PASSED [ 80%]
tests/unit/test_cli_tree.py::TestHierarchyTree::test_empty_categories_omitted PASSED [ 80%]
tests/unit/test_cli_tree.py::TestHierarchyTree::test_all_empty PASSED    [ 80%]
tests/unit/test_cli_tree.py::TestHierarchyTree::test_missing_implements_key PASSED [ 80%]
tests/unit/test_cli_tree.py::TestTraceTree::test_single_path PASSED      [ 80%]
tests/unit/test_cli_tree.py::TestTraceTree::test_shared_prefix PASSED    [ 80%]
tests/unit/test_cli_tree.py::TestTraceTree::test_fully_shared_prefix_then_diverge PASSED [ 80%]
tests/unit/test_cli_tree.py::TestTraceTree::test_no_paths PASSED         [ 80%]
tests/unit/test_cli_tree.py::TestTraceTree::test_single_step_path PASSED [ 80%]
tests/unit/test_cli_tree.py::TestEntryPointsTree::test_single_entry_point PASSED [ 80%]
tests/unit/test_cli_tree.py::TestEntryPointsTree::test_multiple_entry_points_shared_prefix PASSED [ 80%]
tests/unit/test_cli_tree.py::TestEntryPointsTree::test_multiple_entry_points_shared_entry PASSED [ 80%]
tests/unit/test_cli_tree.py::TestEntryPointsTree::test_no_entry_points PASSED [ 80%]
tests/unit/test_cli_tree.py::TestEntryPointsTree::test_direct_caller PASSED [ 80%]
tests/unit/test_cli_tree.py::TestDependenciesTree::test_flat_depth_one PASSED [ 80%]
tests/unit/test_cli_tree.py::TestDependenciesTree::test_nested_depths PASSED [ 80%]
tests/unit/test_cli_tree.py::TestDependenciesTree::test_empty PASSED     [ 80%]
tests/unit/test_cli_tree.py::TestDependenciesTree::test_with_annotation PASSED [ 81%]
tests/unit/test_cli_tree.py::TestUnwrapTruncated::test_plain_list_returns_list_and_none PASSED [ 81%]
tests/unit/test_cli_tree.py::TestUnwrapTruncated::test_empty_list_returns_empty_and_none PASSED [ 81%]
tests/unit/test_cli_tree.py::TestUnwrapTruncated::test_truncated_dict_returns_items_and_annotation PASSED [ 81%]
tests/unit/test_config.py::test_is_dedicated_instance_true PASSED        [ 81%]
tests/unit/test_config.py::test_is_dedicated_instance_false_when_absent PASSED [ 81%]
tests/unit/test_config.py::test_is_dedicated_instance_false_when_not_set PASSED [ 81%]
tests/unit/test_config.py::test_load_global_config_defaults PASSED       [ 81%]
tests/unit/test_config.py::test_load_global_config_reads_file PASSED     [ 81%]
tests/unit/test_config.py::test_load_global_config_merges_partial PASSED [ 81%]
tests/unit/test_dead_code.py::test_returns_methods_and_stats_keys PASSED [ 81%]
tests/unit/test_dead_code.py::test_empty_graph_returns_empty_methods PASSED [ 81%]
tests/unit/test_dead_code.py::test_dead_method_returned_with_correct_shape PASSED [ 81%]
tests/unit/test_dead_code.py::test_inbound_call_count_always_zero PASSED [ 81%]
tests/unit/test_dead_code.py::test_stats_dead_ratio PASSED               [ 81%]
tests/unit/test_dead_code.py::test_stats_dead_ratio_zero_division_guard PASSED [ 81%]
tests/unit/test_dead_code.py::test_test_methods_excluded_via_cypher PASSED [ 81%]
tests/unit/test_dead_code.py::test_serves_edge_excluded_via_cypher PASSED [ 81%]
tests/unit/test_dead_code.py::test_implements_target_excluded_via_cypher PASSED [ 82%]
tests/unit/test_dead_code.py::test_dispatches_to_target_excluded_via_cypher PASSED [ 82%]
tests/unit/test_dead_code.py::test_overrides_excluded_via_cypher PASSED  [ 82%]
tests/unit/test_dead_code.py::test_constructors_excluded_via_cypher PASSED [ 82%]
tests/unit/test_dead_code.py::test_no_callers_excluded_via_cypher PASSED [ 82%]
tests/unit/test_dead_code.py::test_exclude_pattern_passed_to_query PASSED [ 82%]
tests/unit/test_dead_code.py::test_empty_exclude_pattern_default PASSED  [ 82%]
tests/unit/test_dead_code.py::test_exclude_pattern_auto_wrapped_for_substring_match PASSED [ 82%]
tests/unit/test_dead_code.py::test_exclude_pattern_already_anchored_not_double_wrapped PASSED [ 82%]
tests/unit/test_dead_code.py::test_decorator_entry_points_excluded_via_cypher PASSED [ 82%]
tests/unit/test_dead_code.py::test_interface_member_methods_excluded_via_cypher PASSED [ 82%]
tests/unit/test_dead_code.py::test_ordering_in_cypher PASSED             [ 82%]
tests/unit/test_dead_code.py::test_total_methods_query_has_same_exclusions PASSED [ 82%]
tests/unit/test_find_tests_for.py::test_returns_list_of_dicts_with_correct_keys PASSED [ 82%]
tests/unit/test_find_tests_for.py::test_returns_correct_values PASSED    [ 82%]
tests/unit/test_find_tests_for.py::test_returns_empty_list_when_no_tests PASSED [ 82%]
tests/unit/test_find_tests_for.py::test_cypher_queries_tests_edge_direction PASSED [ 82%]
tests/unit/test_find_tests_for.py::test_cypher_uses_fn_parameter PASSED  [ 82%]
tests/unit/test_find_untested.py::test_returns_methods_and_stats_keys PASSED [ 83%]
tests/unit/test_find_untested.py::test_stats_keys_are_untested_not_dead PASSED [ 83%]
tests/unit/test_find_untested.py::test_empty_graph_returns_empty_methods PASSED [ 83%]
tests/unit/test_find_untested.py::test_untested_method_returned_with_correct_shape PASSED [ 83%]
tests/unit/test_find_untested.py::test_untested_ratio_computed_correctly PASSED [ 83%]
tests/unit/test_find_untested.py::test_ratio_zero_division_guard PASSED  [ 83%]
tests/unit/test_find_untested.py::test_test_methods_excluded_via_cypher PASSED [ 83%]
tests/unit/test_find_untested.py::test_serves_excluded_via_cypher PASSED [ 83%]
tests/unit/test_find_untested.py::test_implements_target_excluded_via_cypher PASSED [ 83%]
tests/unit/test_find_untested.py::test_dispatches_to_excluded_via_cypher PASSED [ 83%]
tests/unit/test_find_untested.py::test_overrides_excluded_via_cypher PASSED [ 83%]
tests/unit/test_find_untested.py::test_constructors_excluded_via_cypher PASSED [ 83%]
tests/unit/test_find_untested.py::test_no_tests_condition_in_cypher PASSED [ 83%]
tests/unit/test_find_untested.py::test_exclude_pattern_passed_to_query PASSED [ 83%]
tests/unit/test_find_untested.py::test_empty_exclude_pattern_default PASSED [ 83%]
tests/unit/test_find_untested.py::test_exclude_pattern_auto_wrapped_for_substring_match PASSED [ 83%]
tests/unit/test_find_untested.py::test_exclude_pattern_already_anchored_not_double_wrapped PASSED [ 83%]
tests/unit/test_find_untested.py::test_decorator_entry_points_excluded_via_cypher PASSED [ 83%]
tests/unit/test_find_untested.py::test_interface_member_methods_excluded_via_cypher PASSED [ 84%]
tests/unit/test_find_untested.py::test_ordering_in_cypher PASSED         [ 84%]
tests/unit/test_find_untested.py::test_total_methods_query_has_same_exclusions PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_find_http_endpoints_query_returns_rows_with_has_server PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_find_http_endpoints_query_with_route_param PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_find_http_endpoints_query_with_no_filters_returns_all PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_find_http_endpoints_query_with_language_filter PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_find_http_dependency_query_returns_handler_and_callers PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_find_http_dependency_no_handler_returns_none_handler PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_find_http_dependency_no_ep_returns_none PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_service_find_http_endpoints_returns_d02_shape PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_service_find_http_endpoints_no_handler_fields_are_none PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_service_find_http_endpoints_passes_language_filter PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_service_trace_http_dependency_returns_d03_shape PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_service_trace_http_dependency_no_server_handler PASSED [ 84%]
tests/unit/test_http_endpoints.py::test_service_trace_http_dependency_no_ep_returns_false PASSED [ 84%]
tests/unit/test_mcp_server.py::test_main_uses_connection_manager PASSED  [ 84%]
tests/unit/test_mcp_server.py::test_main_passes_instructions_to_fastmcp PASSED [ 84%]
tests/unit/test_mcp_sync.py::test_mcp_sync_project_tool PASSED           [ 85%]
tests/unit/test_mcp_sync.py::test_mcp_sync_project_returns_error_for_unindexed PASSED [ 85%]
tests/unit/test_packaging.py::test_pyproject_name PASSED                 [ 85%]
tests/unit/test_packaging.py::test_pyproject_version PASSED              [ 85%]
tests/unit/test_packaging.py::test_pyproject_readme PASSED               [ 85%]
tests/unit/test_packaging.py::test_pyproject_urls PASSED                 [ 85%]
tests/unit/test_packaging.py::test_version_attribute PASSED              [ 85%]
tests/unit/test_packaging.py::test_version_matches_pyproject FAILED      [ 85%]
tests/unit/test_packaging.py::test_version_not_dev PASSED                [ 85%]
tests/unit/test_packaging.py::test_wheel_packages_include_solidlsp PASSED [ 85%]
tests/unit/test_packaging.py::test_publish_workflow_exists PASSED        [ 85%]
tests/unit/test_packaging.py::test_pypi_readme_exists PASSED             [ 85%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_always_skip_directory PASSED [ 85%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_allows_normal_directory PASSED [ 85%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_file_inside_always_skip_directory PASSED [ 85%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_allows_file_outside_always_skip_directory PASSED [ 85%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_gitignored_file PASSED [ 85%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_gitignored_directory PASSED [ 86%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_file_inside_gitignored_directory PASSED [ 86%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_synignored_file PASSED [ 86%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_synignored_directory PASSED [ 86%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_allows_file_not_matching_any_rule PASSED [ 86%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_works_without_gitignore_or_synignore PASSED [ 86%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_always_skip_takes_precedence_over_deeply_nested_path PASSED [ 86%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_dot_git_directory PASSED [ 86%]
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_file_inside_dot_git PASSED [ 86%]
tests/unit/test_queries.py::test_find_implementations_exact_match_does_not_fallback PASSED [ 86%]
tests/unit/test_queries.py::test_find_implementations_falls_back_to_short_name PASSED [ 86%]
tests/unit/test_queries.py::test_find_implementations_returns_empty_when_not_found PASSED [ 86%]
tests/unit/test_queries.py::test_search_symbols_invalid_kind_lists_valid_values PASSED [ 86%]
tests/unit/test_queries.py::test_search_symbols_interface_kind_is_valid PASSED [ 86%]
tests/unit/test_queries.py::test_valid_kinds_contains_interface PASSED   [ 86%]
tests/unit/test_queries.py::test_find_callers_direct_only_when_disabled PASSED [ 86%]
tests/unit/test_queries.py::test_find_callers_includes_interface_dispatch_by_default PASSED [ 86%]
tests/unit/test_queries.py::test_find_callers_deduplicates_across_both_queries PASSED [ 86%]
tests/unit/test_queries.py::test_find_callers_default_excludes_tests PASSED [ 87%]
tests/unit/test_queries.py::test_find_callers_exclude_direct_early_return PASSED [ 87%]
tests/unit/test_queries.py::test_find_callers_exclude_via_iface PASSED   [ 87%]
tests/unit/test_queries.py::test_get_hierarchy_includes_implements PASSED [ 87%]
tests/unit/test_queries.py::test_get_hierarchy_implements_empty_when_none PASSED [ 87%]
tests/unit/test_queries.py::test_get_hierarchy_always_has_all_three_keys PASSED [ 87%]
tests/unit/test_queries.py::test_list_summarized_deduplicates PASSED     [ 87%]
tests/unit/test_queries.py::test_search_symbols_namespace_filter PASSED  [ 87%]
tests/unit/test_queries.py::test_search_symbols_file_path_filter PASSED  [ 87%]
tests/unit/test_queries.py::test_search_symbols_combined_filters PASSED  [ 87%]
tests/unit/test_queries.py::test_search_symbols_no_filters_unchanged PASSED [ 87%]
tests/unit/test_queries.py::test_find_dependencies_depth_1_default PASSED [ 87%]
tests/unit/test_queries.py::test_find_dependencies_depth_2 PASSED        [ 87%]
tests/unit/test_queries.py::test_find_dependencies_depth_capped_at_5 PASSED [ 87%]
tests/unit/test_queries.py::test_find_dependencies_result_has_depth_field PASSED [ 87%]
tests/unit/test_queries.py::test_find_callers_with_sites_returns_caller_and_sites PASSED [ 87%]
tests/unit/test_queries.py::test_find_callers_with_sites_deduplicates_across_direct_and_dispatch PASSED [ 87%]
tests/unit/test_queries.py::test_find_callers_with_sites_handles_null_call_sites PASSED [ 87%]
tests/unit/test_queries.py::test_find_callers_with_sites_excludes_test_callers PASSED [ 88%]
tests/unit/test_queries.py::test_find_relevant_deps_returns_intersected_types PASSED [ 88%]
tests/unit/test_queries.py::test_find_relevant_deps_returns_empty_when_no_match PASSED [ 88%]
tests/unit/test_queries.py::test_find_test_coverage_returns_test_methods PASSED [ 88%]
tests/unit/test_queries.py::test_find_test_coverage_deduplicates_across_queries PASSED [ 88%]
tests/unit/test_queries.py::test_find_test_coverage_returns_empty_when_no_tests PASSED [ 88%]
tests/unit/test_queries.py::test_find_all_deps_returns_referenced_types PASSED [ 88%]
tests/unit/test_queries.py::test_find_all_deps_returns_empty_for_no_references PASSED [ 88%]
tests/unit/test_queries.py::test_find_callers_includes_abstract_dispatch_callers PASSED [ 88%]
tests/unit/test_queries.py::test_find_callers_via_dispatch_exclude_test_callers_passes_test_pattern PASSED [ 88%]
tests/unit/test_queries.py::test_find_callers_via_dispatch_without_exclude_tests PASSED [ 88%]
tests/unit/test_queries.py::test_find_callers_deduplicates_across_all_three_queries PASSED [ 88%]
tests/unit/test_queries.py::test_find_callers_with_sites_includes_abstract_dispatch_callers PASSED [ 88%]
tests/unit/test_queries.py::test_find_callers_with_sites_dispatch_query_uses_test_pattern PASSED [ 88%]
tests/unit/test_queries.py::test_find_callers_with_sites_deduplicates_dispatch_and_iface PASSED [ 88%]
tests/unit/test_service.py::test_set_summary_delegates_to_nodes PASSED   [ 88%]
tests/unit/test_service.py::test_watch_project_registers_watcher PASSED  [ 88%]
tests/unit/test_service.py::test_watch_project_creates_single_watcher_for_multi_language PASSED [ 88%]
tests/unit/test_service.py::test_watch_project_multi_language_creates_exactly_one_file_watcher PASSED [ 89%]
tests/unit/test_service.py::test_watch_project_invokes_on_file_event_for_change_and_delete PASSED [ 89%]
tests/unit/test_service.py::test_unwatch_project_stops_watcher PASSED    [ 89%]
tests/unit/test_service.py::test_get_symbol_source_reads_file_and_returns_lines PASSED [ 89%]
tests/unit/test_service.py::test_get_symbol_source_returns_none_when_symbol_not_found PASSED [ 89%]
tests/unit/test_service.py::test_get_symbol_source_returns_error_when_end_line_missing PASSED [ 89%]
tests/unit/test_service.py::test_get_context_for_method_includes_all_sections PASSED [ 89%]
tests/unit/test_service.py::test_get_context_for_returns_none_when_symbol_not_found PASSED [ 89%]
tests/unit/test_service.py::test_p_extracts_properties_and_labels_from_neo4j_node PASSED [ 89%]
tests/unit/test_service.py::test_p_passes_through_plain_dict PASSED      [ 89%]
tests/unit/test_service.py::test_find_callers_returns_plain_dicts PASSED [ 89%]
tests/unit/test_service.py::test_find_implementations_returns_plain_dicts PASSED [ 89%]
tests/unit/test_service.py::test_get_symbol_returns_plain_dict_with_labels PASSED [ 89%]
tests/unit/test_service.py::test_get_symbol_returns_none_when_not_found PASSED [ 89%]
tests/unit/test_service.py::test_find_type_references_unwraps_nested_nodes PASSED [ 89%]
tests/unit/test_service.py::test_find_type_references_rejects_invalid_kind PASSED [ 89%]
tests/unit/test_service.py::test_find_type_references_passes_valid_kind PASSED [ 89%]
tests/unit/test_service.py::test_find_dependencies_unwraps_nested_nodes PASSED [ 89%]
tests/unit/test_service.py::test_get_context_for_includes_summaries_when_available PASSED [ 90%]
tests/unit/test_service.py::test_get_context_for_no_summaries_section_when_none_exist PASSED [ 90%]
tests/unit/test_service.py::test_get_hierarchy_unwraps_nodes PASSED      [ 90%]
tests/unit/test_service.py::test_get_context_for_scope_structure_returns_signatures_only PASSED [ 90%]
tests/unit/test_service.py::test_get_context_for_scope_structure_on_interface PASSED [ 90%]
tests/unit/test_service.py::test_get_context_for_scope_structure_empty_type_returns_message PASSED [ 90%]
tests/unit/test_service.py::test_get_constructor_returns_constructor_node PASSED [ 90%]
tests/unit/test_service.py::test_get_constructor_returns_none_when_no_constructor PASSED [ 90%]
tests/unit/test_service.py::test_index_method_implements_calls_indexer PASSED [ 90%]
tests/unit/test_service.py::test_get_context_for_scope_structure_on_method_returns_error PASSED [ 90%]
tests/unit/test_service.py::test_get_context_for_scope_method_on_class_returns_error PASSED [ 90%]
tests/unit/test_service.py::test_get_context_for_unknown_scope_returns_error PASSED [ 90%]
tests/unit/test_service.py::test_get_context_for_scope_method_returns_focused_context PASSED [ 90%]
tests/unit/test_service.py::test_get_context_for_scope_method_empty_callees_and_no_interface PASSED [ 90%]
tests/unit/test_service.py::test_get_context_for_scope_method_interface_contract_only_matching PASSED [ 90%]
tests/unit/test_service.py::test_callers_section_formats_callers_with_sites PASSED [ 90%]
tests/unit/test_service.py::test_callers_section_single_line_uses_singular PASSED [ 90%]
tests/unit/test_service.py::test_callers_section_no_sites_omits_parenthetical PASSED [ 90%]
tests/unit/test_service.py::test_callers_section_returns_none_when_no_callers PASSED [ 91%]
tests/unit/test_service.py::test_callers_section_limits_to_15_callers PASSED [ 91%]
tests/unit/test_service.py::test_test_coverage_section_formats_test_methods PASSED [ 91%]
tests/unit/test_service.py::test_test_coverage_section_returns_none_when_empty PASSED [ 91%]
tests/unit/test_service.py::test_find_callers_returns_slim_dicts PASSED  [ 91%]
tests/unit/test_service.py::test_search_symbols_returns_slim_dicts PASSED [ 91%]
tests/unit/test_service.py::test_get_hierarchy_returns_slim_dicts PASSED [ 91%]
tests/unit/test_service.py::test_relevant_deps_section_shows_member_signatures PASSED [ 91%]
tests/unit/test_service.py::test_relevant_deps_section_returns_none_when_empty PASSED [ 91%]
tests/unit/test_service.py::test_relevant_deps_section_shows_only_called_members PASSED [ 91%]
tests/unit/test_service.py::test_relevant_deps_section_fallback_to_all_members PASSED [ 91%]
tests/unit/test_service.py::test_get_context_for_default_scope_unchanged PASSED [ 91%]
tests/unit/test_service.py::test_get_context_for_scope_edit_method_includes_all_sections PASSED [ 91%]
tests/unit/test_service.py::test_get_context_for_scope_edit_method_omits_empty_sections PASSED [ 91%]
tests/unit/test_service.py::test_get_context_for_scope_edit_rejects_property PASSED [ 91%]
tests/unit/test_service.py::test_get_context_for_scope_edit_class_includes_all_sections PASSED [ 91%]
tests/unit/test_service.py::test_get_context_for_scope_edit_interface_skips_constructor_deps PASSED [ 91%]
tests/unit/test_service.py::test_get_context_for_scope_edit_class_no_methods_shows_note PASSED [ 91%]
tests/unit/test_service.py::test_find_usages_method_returns_text_with_callers PASSED [ 92%]
tests/unit/test_service.py::test_find_usages_class_returns_text_summary PASSED [ 92%]
tests/unit/test_service.py::test_find_usages_class_affected_files_deduplicates PASSED [ 92%]
tests/unit/test_service.py::test_find_usages_symbol_not_found PASSED     [ 92%]
tests/unit/test_service.py::test_find_usages_unsupported_label PASSED    [ 92%]
tests/unit/test_service.py::test_find_usages_class_filters_test_type_references PASSED [ 92%]
tests/unit/test_service.py::test_find_usages_class_includes_test_refs_when_requested PASSED [ 92%]
tests/unit/test_service.py::test_find_usages_property_returns_text PASSED [ 92%]
tests/unit/test_service.py::test_get_context_for_falls_back_to_structure_when_source_exceeds_max_lines PASSED [ 92%]
tests/unit/test_service.py::test_get_context_for_shows_full_source_when_under_max_lines PASSED [ 92%]
tests/unit/test_service.py::test_get_context_for_max_lines_zero_always_uses_structure PASSED [ 92%]
tests/unit/test_service.py::test_get_context_for_negative_max_lines_disables_fallback PASSED [ 92%]
tests/unit/test_service.py::test_find_callers_respects_limit PASSED      [ 92%]
tests/unit/test_service.py::test_find_callers_no_truncation_when_under_limit PASSED [ 92%]
tests/unit/test_service.py::test_search_symbols_respects_limit PASSED    [ 92%]
tests/unit/test_service.py::test_resolve_preference_concrete_selects_class PASSED [ 92%]
tests/unit/test_service.py::test_resolve_preference_interface_selects_interface PASSED [ 92%]
tests/unit/test_service.py::test_resolve_preference_none_raises_on_ambiguity PASSED [ 93%]
tests/unit/test_service.py::test_resolve_preference_still_raises_if_multiple_match PASSED [ 93%]
tests/unit/test_service.py::test_resolve_preference_method_checks_parent_type PASSED [ 93%]
tests/unit/test_service.py::test_resolve_preference_method_interface_checks_parent PASSED [ 93%]
tests/unit/test_service.py::test_resolve_preference_method_still_ambiguous_if_multiple_concrete PASSED [ 93%]
tests/unit/test_service.py::test_index_calls_python_builds_module_full_names_and_passes_to_resolver PASSED [ 93%]
tests/unit/test_service.py::test_index_calls_python_wires_module_name_resolver PASSED [ 93%]
tests/unit/test_service.py::test_index_calls_python_calls_overrides_indexer PASSED [ 93%]
tests/unit/test_service.py::test_index_calls_python_iterates_unresolved_sites PASSED [ 93%]
tests/unit/test_service.py::test_index_calls_csharp_no_module_full_names_no_overrides_indexer PASSED [ 93%]
tests/unit/test_service.py::test_slim_extracts_specified_fields_from_mock_node PASSED [ 93%]
tests/unit/test_service.py::test_slim_skips_missing_fields PASSED        [ 93%]
tests/unit/test_service.py::test_slim_works_with_plain_dict PASSED       [ 93%]
tests/unit/test_service.py::test_apply_limit_returns_list_when_under PASSED [ 93%]
tests/unit/test_service.py::test_apply_limit_returns_dict_when_over PASSED [ 93%]
tests/unit/test_service.py::test_apply_limit_at_boundary_returns_list PASSED [ 93%]
tests/unit/test_service.py::test_find_type_impact_applies_limit PASSED   [ 93%]
tests/unit/test_service.py::test_short_ref_strips_package_and_params PASSED [ 93%]
tests/unit/test_service.py::test_short_ref_class_only PASSED             [ 94%]
tests/unit/test_service.py::test_short_ref_simple_name PASSED            [ 94%]
tests/unit/test_service.py::test_short_ref_two_parts PASSED              [ 94%]
tests/unit/test_service.py::test_rel_path_strips_project_root PASSED     [ 94%]
tests/unit/test_service.py::test_rel_path_preserves_unknown_path PASSED  [ 94%]
tests/unit/test_service.py::test_analyze_change_impact_returns_text PASSED [ 94%]
tests/unit/test_service.py::test_search_symbols_returns_relative_paths PASSED [ 94%]
tests/unit/test_service_multi_plugin.py::test_index_project_calls_indexer_for_each_plugin PASSED [ 94%]
tests/unit/test_service_multi_plugin.py::test_index_project_single_plugin_works PASSED [ 94%]
tests/unit/test_service_multi_plugin.py::test_index_project_no_plugins_raises_value_error PASSED [ 94%]
tests/unit/test_service_multi_plugin.py::test_index_project_on_progress_called_per_plugin PASSED [ 94%]
tests/unit/test_service_resolve.py::test_resolve_single_match_returns_string PASSED [ 94%]
tests/unit/test_service_resolve.py::test_resolve_ambiguous_raises PASSED [ 94%]
tests/unit/test_service_resolve.py::test_set_summary_does_not_resolve PASSED [ 94%]
tests/unit/test_service_smart_index.py::test_no_repo_node_runs_full_index PASSED [ 94%]
tests/unit/test_service_smart_index.py::test_full_index_on_git_project_stores_sha PASSED [ 94%]
tests/unit/test_service_smart_index.py::test_git_repo_with_stored_sha_runs_git_sync PASSED [ 94%]
tests/unit/test_service_smart_index.py::test_git_repo_no_stored_sha_uses_empty_tree PASSED [ 94%]
tests/unit/test_service_smart_index.py::test_non_git_repo_runs_mtime_sync PASSED [ 95%]
tests/unit/test_service_smart_index.py::test_git_sync_shuts_down_lsp PASSED [ 95%]
tests/unit/test_service_smart_index.py::test_git_sync_skips_language_with_no_changes PASSED [ 95%]
tests/unit/test_service_sync.py::test_sync_project_uses_plugin_detection PASSED [ 95%]
tests/unit/test_service_sync.py::test_sync_project_uses_predetected_files PASSED [ 95%]
tests/unit/test_service_sync.py::test_sync_project_no_plugins_raises PASSED [ 95%]
tests/unit/test_synignore.py::TestLoadSynignore::test_returns_none_when_no_file PASSED [ 95%]
tests/unit/test_synignore.py::TestLoadSynignore::test_returns_none_for_empty_file PASSED [ 95%]
tests/unit/test_synignore.py::TestLoadSynignore::test_returns_none_for_comments_only PASSED [ 95%]
tests/unit/test_synignore.py::TestLoadSynignore::test_returns_filter_for_valid_patterns PASSED [ 95%]
tests/unit/test_synignore.py::TestLoadSynignore::test_ignores_blank_lines PASSED [ 95%]
tests/unit/test_synignore.py::TestLoadSynignore::test_handles_unreadable_file PASSED [ 95%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_ignores_matching_directory PASSED [ 95%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_does_not_ignore_non_matching_directory PASSED [ 95%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_ignores_matching_file PASSED [ 95%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_does_not_ignore_non_matching_file PASSED [ 95%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_glob_pattern_matches_nested PASSED [ 95%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_wildcard_directory_pattern PASSED [ 95%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_doublestar_pattern PASSED [ 96%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_multiple_patterns PASSED [ 96%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_is_ignored_detects_directory PASSED [ 96%]
tests/unit/test_synignore.py::TestSynignoreFilter::test_is_ignored_detects_file PASSED [ 96%]
tests/unit/test_synignore.py::TestSynignoreInDetectWithFiles::test_synignore_excludes_directory_from_detection PASSED [ 96%]
tests/unit/test_synignore.py::TestSynignoreInDetectWithFiles::test_synignore_excludes_file_pattern PASSED [ 96%]
tests/unit/test_synignore.py::TestSynignoreInDetectWithFiles::test_no_synignore_file_behaves_normally PASSED [ 96%]
tests/unit/test_tests_edges.py::test_maven_src_test_java_path_matches_pattern PASSED [ 96%]
tests/unit/test_tests_edges.py::test_gradle_src_test_resources_matches_pattern PASSED [ 96%]
tests/unit/test_tests_edges.py::test_existing_csharp_test_path_still_matches PASSED [ 96%]
tests/unit/test_tests_edges.py::test_existing_jest_test_path_still_matches PASSED [ 96%]
tests/unit/test_tests_edges.py::test_existing_python_test_path_still_matches PASSED [ 96%]
tests/unit/test_tests_edges.py::test_test_utils_directory_matches_pattern PASSED [ 96%]
tests/unit/test_tests_edges.py::test_test_helpers_directory_matches_pattern PASSED [ 96%]
tests/unit/test_tests_edges.py::test_production_path_does_not_match PASSED [ 96%]
tests/unit/test_tests_edges.py::test_tests_in_delete_outgoing_edges_edge_types PASSED [ 96%]
tests/unit/test_tests_edges.py::test_tests_phase_clears_repo_scoped_edges_first PASSED [ 96%]
tests/unit/test_tests_edges.py::test_tests_phase_derivation_creates_tests_edges PASSED [ 96%]
tests/unit/test_tests_edges.py::test_tests_phase_derivation_uses_variable_length_contains PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_python_detection_in_cypher PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_typescript_file_level_detection PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_csharp_attribute_detection PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_csharp_mstest_testmethod_detection PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_csharp_mstest_datatestmethod_detection PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_java_annotation_detection PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_only_test_callers PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_only_prod_callees PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_passes_test_pattern_param PASSED [ 97%]
tests/unit/test_tests_edges.py::test_tests_phase_logs_count_of_created_edges PASSED [ 97%]
tests/unit/test_tools.py::test_get_schema_has_expected_top_level_keys PASSED [ 97%]
tests/unit/test_tools.py::test_get_schema_tool_returns_schema PASSED     [ 97%]
tests/unit/test_tools.py::test_list_projects_has_description PASSED      [ 97%]
tests/unit/test_tools.py::test_find_usages_tool_delegates_to_service PASSED [ 97%]
tests/unit/test_tools.py::test_find_usages_tool_passes_exclude_flag PASSED [ 97%]
tests/unit/test_tools.py::test_graph_schema_has_overrides_relationship PASSED [ 97%]
tests/unit/test_tools.py::test_graph_schema_method_has_language_property PASSED [ 97%]
tests/unit/test_tools.py::test_graph_schema_method_has_is_async_flag PASSED [ 98%]
tests/unit/test_tools.py::test_graph_schema_method_has_is_classmethod_flag PASSED [ 98%]
tests/unit/test_tools.py::test_graph_schema_has_imports_relationship PASSED [ 98%]
tests/unit/test_tools.py::test_graph_schema_nodes_have_language_property PASSED [ 98%]
tests/unit/test_tools.py::test_tool_docstrings_contain_disambiguation_cues PASSED [ 98%]
tests/unit/test_tools.py::test_graph_schema_notes_include_python_kinds PASSED [ 98%]
tests/unit/test_tools.py::test_get_hierarchy_ambiguous_returns_error_dict PASSED [ 98%]
tests/unit/test_tools.py::test_summary_action_get PASSED                 [ 98%]
tests/unit/test_tools.py::test_summary_action_set PASSED                 [ 98%]
tests/unit/test_tools.py::test_summary_action_list PASSED                [ 98%]
tests/unit/test_tools.py::test_summary_set_missing_params PASSED         [ 98%]
tests/unit/test_tools.py::test_summary_get_missing_full_name PASSED      [ 98%]
tests/unit/test_tools.py::test_find_callees_with_depth_delegates_to_get_call_depth PASSED [ 98%]
tests/unit/test_tools.py::test_find_callees_without_depth_uses_normal_path PASSED [ 98%]
tests/unit/test_tools.py::test_find_usages_with_kind_delegates_to_type_references PASSED [ 98%]
tests/unit/test_tools.py::test_list_projects_with_path_returns_index_status PASSED [ 98%]
tests/unit/test_tools.py::test_list_projects_without_path_returns_all PASSED [ 98%]
tests/unit/test_tools.py::test_find_http_endpoints_delegates_to_service PASSED [ 98%]
tests/unit/test_tools.py::test_find_http_endpoints_passes_all_params PASSED [ 99%]
tests/unit/test_tools.py::test_find_http_endpoints_trace_delegates_to_service PASSED [ 99%]
tests/unit/test_tools.py::test_find_http_endpoints_trace_no_server_handler PASSED [ 99%]
tests/unit/test_tools.py::test_find_http_endpoints_trace_requires_route_and_method PASSED [ 99%]
tests/unit/test_tools.py::test_trace_http_dependency_not_registered PASSED [ 99%]
tests/unit/test_tools.py::test_graph_schema_no_experimental_note PASSED  [ 99%]
tests/unit/test_tools.py::test_removed_tools_not_registered PASSED       [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_calls_on_change_for_cs_file PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_ignores_non_cs_files PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_calls_on_change_for_py_file PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_ignores_non_py_files_when_watching_python PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_ignores_gitignored_cs_file PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_allows_non_gitignored_cs_file PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_ignores_synignored_file PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_stop_joins_observer_thread PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_calls_on_change_for_ts_file PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_calls_on_change_for_js_file PASSED [ 99%]
tests/unit/watcher/test_watcher.py::test_watcher_ignores_non_ts_files_when_watching_typescript PASSED [100%]

=================================== FAILURES ===================================
________________________ test_version_matches_pyproject ________________________

    def test_version_matches_pyproject() -> None:
        data = _load_pyproject()
        expected = data["project"]["version"]
>       assert synapps.__version__ == expected, (
            f"__version__ ({synapps.__version__}) does not match "
            f"pyproject.toml ({expected}) — run 'uv sync' to update"
        )
E       AssertionError: __version__ (1.4.9) does not match pyproject.toml (1.4.12) — run 'uv sync' to update
E       assert '1.4.9' == '1.4.12'
E         
E         - 1.4.12
E         + 1.4.9

tests/unit/test_packaging.py:50: AssertionError
=============================== warnings summary ===============================
src/synapps/indexer/tests_phase.py:11
  /Users/alex/Dev/synapse/src/synapps/indexer/tests_phase.py:11: PytestCollectionWarning: cannot collect test class 'TestsPhase' because it has a __init__ constructor (from: tests/unit/test_tests_edges.py)
    class TestsPhase:

tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_gitignored_file
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_gitignored_directory
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_file_inside_gitignored_directory
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_allows_file_not_matching_any_rule
tests/unit/watcher/test_watcher.py::test_watcher_ignores_gitignored_cs_file
tests/unit/watcher/test_watcher.py::test_watcher_allows_non_gitignored_cs_file
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pathspec.py:260: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    patterns = [pattern_factory(line) for line in lines if line]

tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_gitignored_file
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_gitignored_directory
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_ignores_file_inside_gitignored_directory
tests/unit/test_project_file_filter.py::TestProjectFileFilter::test_allows_file_not_matching_any_rule
tests/unit/watcher/test_watcher.py::test_watcher_ignores_gitignored_cs_file
tests/unit/watcher/test_watcher.py::test_watcher_allows_non_gitignored_cs_file
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pattern.py:125: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    regex, include = self.pattern_to_regex(pattern)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================== short test summary info ============================
FAILED tests/unit/test_packaging.py::test_version_matches_pyproject - Asserti...
================= 1 failed, 1785 passed, 13 warnings in 7.13s ==================
[0;31mUnit tests failed[0m

[1m=== Integration Tests ===[0m
Ensuring Memgraph is running...

[1m--- tests/integration/test_mcp_tools.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 48 items

tests/integration/test_mcp_tools.py::test_all_tools_registered PASSED    [  2%]
tests/integration/test_mcp_tools.py::test_controller_calls_service_method[SynappsTest.Controllers.TaskController.Create-CreateTaskAsync] PASSED [  4%]
tests/integration/test_mcp_tools.py::test_controller_calls_service_method[SynappsTest.Controllers.TaskController.Get-GetTaskAsync] PASSED [  6%]
tests/integration/test_mcp_tools.py::test_controller_calls_service_method[SynappsTest.Controllers.TaskController.List-ListTasksAsync] PASSED [  8%]
tests/integration/test_mcp_tools.py::test_controller_calls_service_method[SynappsTest.Controllers.TaskController.Update-UpdateTaskAsync] PASSED [ 10%]
tests/integration/test_mcp_tools.py::test_controller_calls_service_method[SynappsTest.Controllers.TaskController.Delete-DeleteTaskAsync] PASSED [ 12%]
tests/integration/test_mcp_tools.py::test_controller_calls_service_method[SynappsTest.Controllers.TaskController.Complete-CompleteTaskAsync] PASSED [ 14%]
tests/integration/test_mcp_tools.py::test_list_projects PASSED           [ 16%]
tests/integration/test_mcp_tools.py::test_get_index_status PASSED        [ 18%]
tests/integration/test_mcp_tools.py::test_get_schema PASSED              [ 20%]
tests/integration/test_mcp_tools.py::test_index_project PASSED           [ 22%]
tests/integration/test_mcp_tools.py::test_search_symbols PASSED          [ 25%]
tests/integration/test_mcp_tools.py::test_search_symbols_language_filter PASSED [ 27%]
tests/integration/test_mcp_tools.py::test_find_implementations_task_service PASSED [ 29%]
tests/integration/test_mcp_tools.py::test_find_implementations_project_service PASSED [ 31%]
tests/integration/test_mcp_tools.py::test_find_callees PASSED            [ 33%]
tests/integration/test_mcp_tools.py::test_get_hierarchy_controller PASSED [ 35%]
tests/integration/test_mcp_tools.py::test_get_hierarchy_model PASSED     [ 37%]
tests/integration/test_mcp_tools.py::test_find_usages PASSED             [ 39%]
tests/integration/test_mcp_tools.py::test_find_type_references PASSED    [ 41%]
tests/integration/test_mcp_tools.py::test_find_dependencies PASSED       [ 43%]
tests/integration/test_mcp_tools.py::test_get_context_for PASSED         [ 45%]
tests/integration/test_mcp_tools.py::test_get_context_for_structure_scope PASSED [ 47%]
tests/integration/test_mcp_tools.py::test_get_context_for_method_scope PASSED [ 50%]
tests/integration/test_mcp_tools.py::test_get_context_for_edit_scope_method PASSED [ 52%]
tests/integration/test_mcp_tools.py::test_get_context_for_edit_scope_class PASSED [ 54%]
tests/integration/test_mcp_tools.py::test_get_context_for_edit_scope_rejects_field PASSED [ 56%]
tests/integration/test_mcp_tools.py::test_find_entry_points PASSED       [ 58%]
tests/integration/test_mcp_tools.py::test_get_context_for_impact PASSED  [ 60%]
tests/integration/test_mcp_tools.py::test_get_call_depth PASSED          [ 62%]
tests/integration/test_mcp_tools.py::test_get_summary_no_summary PASSED  [ 64%]
tests/integration/test_mcp_tools.py::test_set_and_get_summary PASSED     [ 66%]
tests/integration/test_mcp_tools.py::test_list_summarized PASSED         [ 68%]
tests/integration/test_mcp_tools.py::test_execute_valid_query PASSED     [ 70%]
tests/integration/test_mcp_tools.py::test_execute_mutating_query_blocked PASSED [ 72%]
tests/integration/test_mcp_tools.py::test_cross_file_calls_edge_exists[SynappsTest.Controllers.TaskController.Create-SynappsTest.Services.ITaskService.CreateTaskAsync] PASSED [ 75%]
tests/integration/test_mcp_tools.py::test_cross_file_calls_edge_exists[SynappsTest.Controllers.TaskController.Get-SynappsTest.Services.ITaskService.GetTaskAsync] PASSED [ 77%]
tests/integration/test_mcp_tools.py::test_cross_file_calls_edge_exists[SynappsTest.Controllers.TaskController.Delete-SynappsTest.Services.ITaskService.DeleteTaskAsync] PASSED [ 79%]
tests/integration/test_mcp_tools.py::test_cross_file_calls_edge_exists[SynappsTest.Services.TaskService.CreateTaskAsync-SynappsTest.Services.IProjectService.ValidateProjectAsync] PASSED [ 81%]
tests/integration/test_mcp_tools.py::test_generic_method_call_creates_calls_edge PASSED [ 83%]
tests/integration/test_mcp_tools.py::test_generic_method_call_via_find_callees PASSED [ 85%]
tests/integration/test_mcp_tools.py::test_dispatches_to_edge_exists[SynappsTest.Services.ITaskService.CreateTaskAsync-SynappsTest.Services.TaskService.CreateTaskAsync] PASSED [ 87%]
tests/integration/test_mcp_tools.py::test_dispatches_to_edge_exists[SynappsTest.Services.ITaskService.GetTaskAsync-SynappsTest.Services.TaskService.GetTaskAsync] PASSED [ 89%]
tests/integration/test_mcp_tools.py::test_dispatches_to_edge_exists[SynappsTest.Services.ITaskService.DeleteTaskAsync-SynappsTest.Services.TaskService.DeleteTaskAsync] PASSED [ 91%]
tests/integration/test_mcp_tools.py::test_dispatches_to_edge_exists[SynappsTest.Services.IProjectService.ValidateProjectAsync-SynappsTest.Services.ProjectService.ValidateProjectAsync] PASSED [ 93%]
tests/integration/test_mcp_tools.py::test_reindex_preserves_cross_file_calls PASSED [ 95%]
tests/integration/test_mcp_tools.py::test_reindex_preserves_dispatches_to PASSED [ 97%]
tests/integration/test_mcp_tools.py::test_attributes_populated_on_csharp_nodes PASSED [100%]

=============================== warnings summary ===============================
tests/integration/test_mcp_tools.py::test_all_tools_registered
tests/integration/test_mcp_tools.py::test_all_tools_registered
tests/integration/test_mcp_tools.py::test_index_project
tests/integration/test_mcp_tools.py::test_index_project
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pathspec.py:260: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    patterns = [pattern_factory(line) for line in lines if line]

tests/integration/test_mcp_tools.py::test_all_tools_registered
tests/integration/test_mcp_tools.py::test_all_tools_registered
tests/integration/test_mcp_tools.py::test_index_project
tests/integration/test_mcp_tools.py::test_index_project
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pattern.py:125: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    regex, include = self.pattern_to_regex(pattern)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================= 48 passed, 8 warnings in 16.15s ========================
[0;32mPASSED: tests/integration/test_mcp_tools.py[0m

[1m--- tests/integration/test_mcp_tools_typescript.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 29 items

tests/integration/test_mcp_tools_typescript.py::test_list_projects PASSED [  3%]
tests/integration/test_mcp_tools_typescript.py::test_get_index_status PASSED [  6%]
tests/integration/test_mcp_tools_typescript.py::test_get_schema PASSED   [ 10%]
tests/integration/test_mcp_tools_typescript.py::test_index_project PASSED [ 13%]
tests/integration/test_mcp_tools_typescript.py::test_search_symbols PASSED [ 17%]
tests/integration/test_mcp_tools_typescript.py::test_search_symbols_language_filter PASSED [ 20%]
tests/integration/test_mcp_tools_typescript.py::test_find_related_symbols PASSED [ 24%]
tests/integration/test_mcp_tools_typescript.py::test_get_hierarchy PASSED [ 27%]
tests/integration/test_mcp_tools_typescript.py::test_find_implementations PASSED [ 31%]
tests/integration/test_mcp_tools_typescript.py::test_find_callees PASSED [ 34%]
tests/integration/test_mcp_tools_typescript.py::test_get_call_depth PASSED [ 37%]
tests/integration/test_mcp_tools_typescript.py::test_find_dependencies PASSED [ 41%]
tests/integration/test_mcp_tools_typescript.py::test_find_type_references PASSED [ 44%]
tests/integration/test_mcp_tools_typescript.py::test_find_usages PASSED  [ 48%]
tests/integration/test_mcp_tools_typescript.py::test_get_context_for_impact PASSED [ 51%]
tests/integration/test_mcp_tools_typescript.py::test_get_context_for PASSED [ 55%]
tests/integration/test_mcp_tools_typescript.py::test_get_context_for_structure_scope PASSED [ 58%]
tests/integration/test_mcp_tools_typescript.py::test_get_context_for_method_scope PASSED [ 62%]
tests/integration/test_mcp_tools_typescript.py::test_get_context_for_edit_scope_method PASSED [ 65%]
tests/integration/test_mcp_tools_typescript.py::test_get_context_for_edit_scope_class PASSED [ 68%]
tests/integration/test_mcp_tools_typescript.py::test_get_context_for_edit_scope_rejects_field PASSED [ 72%]
tests/integration/test_mcp_tools_typescript.py::test_find_entry_points PASSED [ 75%]
tests/integration/test_mcp_tools_typescript.py::test_get_summary_no_summary PASSED [ 79%]
tests/integration/test_mcp_tools_typescript.py::test_set_and_get_summary PASSED [ 82%]
tests/integration/test_mcp_tools_typescript.py::test_list_summarized PASSED [ 86%]
tests/integration/test_mcp_tools_typescript.py::test_path_alias_import_creates_calls_edge PASSED [ 89%]
tests/integration/test_mcp_tools_typescript.py::test_path_alias_component_not_dead_code PASSED [ 93%]
tests/integration/test_mcp_tools_typescript.py::test_execute_query PASSED [ 96%]
tests/integration/test_mcp_tools_typescript.py::test_execute_mutating_query_blocked PASSED [100%]

============================== 29 passed in 7.87s ==============================
[0;32mPASSED: tests/integration/test_mcp_tools_typescript.py[0m

[1m--- tests/integration/test_mcp_tools_python.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 26 items

tests/integration/test_mcp_tools_python.py::test_list_projects PASSED    [  3%]
tests/integration/test_mcp_tools_python.py::test_get_index_status PASSED [  7%]
tests/integration/test_mcp_tools_python.py::test_get_schema PASSED       [ 11%]
tests/integration/test_mcp_tools_python.py::test_index_project PASSED    [ 15%]
tests/integration/test_mcp_tools_python.py::test_search_symbols PASSED   [ 19%]
tests/integration/test_mcp_tools_python.py::test_search_symbols_language_filter PASSED [ 23%]
tests/integration/test_mcp_tools_python.py::test_find_implementations PASSED [ 26%]
tests/integration/test_mcp_tools_python.py::test_get_hierarchy PASSED    [ 30%]
tests/integration/test_mcp_tools_python.py::test_find_callees PASSED     [ 34%]
tests/integration/test_mcp_tools_python.py::test_find_type_references PASSED [ 38%]
tests/integration/test_mcp_tools_python.py::test_find_usages PASSED      [ 42%]
tests/integration/test_mcp_tools_python.py::test_find_dependencies PASSED [ 46%]
tests/integration/test_mcp_tools_python.py::test_get_context_for PASSED  [ 50%]
tests/integration/test_mcp_tools_python.py::test_get_context_for_structure_scope PASSED [ 53%]
tests/integration/test_mcp_tools_python.py::test_get_context_for_method_scope PASSED [ 57%]
tests/integration/test_mcp_tools_python.py::test_get_context_for_edit_scope_method PASSED [ 61%]
tests/integration/test_mcp_tools_python.py::test_get_context_for_edit_scope_class PASSED [ 65%]
tests/integration/test_mcp_tools_python.py::test_get_context_for_edit_scope_rejects_field SKIPPED [ 69%]
tests/integration/test_mcp_tools_python.py::test_find_entry_points PASSED [ 73%]
tests/integration/test_mcp_tools_python.py::test_get_call_depth PASSED   [ 76%]
tests/integration/test_mcp_tools_python.py::test_get_context_for_impact PASSED [ 80%]
tests/integration/test_mcp_tools_python.py::test_get_summary_no_summary PASSED [ 84%]
tests/integration/test_mcp_tools_python.py::test_set_and_get_summary PASSED [ 88%]
tests/integration/test_mcp_tools_python.py::test_list_summarized PASSED  [ 92%]
tests/integration/test_mcp_tools_python.py::test_execute_query PASSED    [ 96%]
tests/integration/test_mcp_tools_python.py::test_execute_mutating_query_blocked PASSED [100%]

======================== 25 passed, 1 skipped in 6.00s =========================
[0;32mPASSED: tests/integration/test_mcp_tools_python.py[0m

[1m--- tests/integration/test_mcp_tools_java.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 35 items

tests/integration/test_mcp_tools_java.py::test_list_projects PASSED      [  2%]
tests/integration/test_mcp_tools_java.py::test_get_index_status PASSED   [  5%]
tests/integration/test_mcp_tools_java.py::test_get_schema PASSED         [  8%]
tests/integration/test_mcp_tools_java.py::test_index_project PASSED      [ 11%]
tests/integration/test_mcp_tools_java.py::test_search_symbols_finds_classes PASSED [ 14%]
tests/integration/test_mcp_tools_java.py::test_search_symbols_by_kind PASSED [ 17%]
tests/integration/test_mcp_tools_java.py::test_search_symbols_language_filter PASSED [ 20%]
tests/integration/test_mcp_tools_java.py::test_find_implementations PASSED [ 22%]
tests/integration/test_mcp_tools_java.py::test_get_hierarchy PASSED      [ 25%]
tests/integration/test_mcp_tools_java.py::test_find_callees PASSED       [ 28%]
tests/integration/test_mcp_tools_java.py::test_find_type_references PASSED [ 31%]
tests/integration/test_mcp_tools_java.py::test_find_usages PASSED        [ 34%]
tests/integration/test_mcp_tools_java.py::test_find_dependencies PASSED  [ 37%]
tests/integration/test_mcp_tools_java.py::test_get_context_for PASSED    [ 40%]
tests/integration/test_mcp_tools_java.py::test_get_context_for_structure_scope PASSED [ 42%]
tests/integration/test_mcp_tools_java.py::test_get_context_for_method_scope PASSED [ 45%]
tests/integration/test_mcp_tools_java.py::test_get_context_for_edit_scope_method PASSED [ 48%]
tests/integration/test_mcp_tools_java.py::test_get_context_for_edit_scope_class PASSED [ 51%]
tests/integration/test_mcp_tools_java.py::test_get_context_for_edit_scope_rejects_field PASSED [ 54%]
tests/integration/test_mcp_tools_java.py::test_find_entry_points PASSED  [ 57%]
tests/integration/test_mcp_tools_java.py::test_get_call_depth PASSED     [ 60%]
tests/integration/test_mcp_tools_java.py::test_get_context_for_impact PASSED [ 62%]
tests/integration/test_mcp_tools_java.py::test_get_summary_no_summary PASSED [ 65%]
tests/integration/test_mcp_tools_java.py::test_set_and_get_summary PASSED [ 68%]
tests/integration/test_mcp_tools_java.py::test_list_summarized PASSED    [ 71%]
tests/integration/test_mcp_tools_java.py::test_execute_query PASSED      [ 74%]
tests/integration/test_mcp_tools_java.py::test_execute_mutating_query_blocked PASSED [ 77%]
tests/integration/test_mcp_tools_java.py::test_java_inherits_edges PASSED [ 80%]
tests/integration/test_mcp_tools_java.py::test_java_implements_edges PASSED [ 82%]
tests/integration/test_mcp_tools_java.py::test_attributes_populated_on_java_nodes PASSED [ 85%]
tests/integration/test_mcp_tools_java.py::test_class_level_attributes_populated PASSED [ 88%]
tests/integration/test_mcp_tools_java.py::test_java_package_node_exists PASSED [ 91%]
tests/integration/test_mcp_tools_java.py::test_java_package_contains_edges PASSED [ 94%]
tests/integration/test_mcp_tools_java.py::test_java_no_anonymous_class_nodes PASSED [ 97%]
tests/integration/test_mcp_tools_java.py::test_java_imports_edges PASSED [100%]

=============================== warnings summary ===============================
tests/integration/test_mcp_tools_java.py: 10 warnings
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pathspec.py:260: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    patterns = [pattern_factory(line) for line in lines if line]

tests/integration/test_mcp_tools_java.py: 10 warnings
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pattern.py:125: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    regex, include = self.pattern_to_regex(pattern)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================= 35 passed, 20 warnings in 16.29s =======================
[0;32mPASSED: tests/integration/test_mcp_tools_java.py[0m

[1m--- tests/integration/test_cli_commands.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 17 items

tests/integration/test_cli_commands.py::test_callees_controller_create PASSED [  5%]
tests/integration/test_cli_commands.py::test_callers_service_method PASSED [ 11%]
tests/integration/test_cli_commands.py::test_delete PASSED               [ 17%]
tests/integration/test_cli_commands.py::test_implementations PASSED      [ 23%]
tests/integration/test_cli_commands.py::test_usages PASSED               [ 29%]
tests/integration/test_cli_commands.py::test_hierarchy PASSED            [ 35%]
tests/integration/test_cli_commands.py::test_trace PASSED                [ 41%]
tests/integration/test_cli_commands.py::test_entry_points PASSED         [ 47%]
tests/integration/test_cli_commands.py::test_symbol PASSED               [ 52%]
tests/integration/test_cli_commands.py::test_source PASSED               [ 58%]
tests/integration/test_cli_commands.py::test_search PASSED               [ 64%]
tests/integration/test_cli_commands.py::test_search_language_filter PASSED [ 70%]
tests/integration/test_cli_commands.py::test_dependencies PASSED         [ 76%]
tests/integration/test_cli_commands.py::test_status PASSED               [ 82%]
tests/integration/test_cli_commands.py::test_query PASSED                [ 88%]
tests/integration/test_cli_commands.py::test_context PASSED              [ 94%]
tests/integration/test_cli_commands.py::test_summary_set_get_list PASSED [100%]

=============================== warnings summary ===============================
tests/integration/test_cli_commands.py::test_callees_controller_create
tests/integration/test_cli_commands.py::test_callees_controller_create
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pathspec.py:260: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    patterns = [pattern_factory(line) for line in lines if line]

tests/integration/test_cli_commands.py::test_callees_controller_create
tests/integration/test_cli_commands.py::test_callees_controller_create
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pattern.py:125: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    regex, include = self.pattern_to_regex(pattern)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================== 17 passed, 4 warnings in 4.55s ========================
[0;32mPASSED: tests/integration/test_cli_commands.py[0m

[1m--- tests/integration/test_cli_commands_python.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 17 items

tests/integration/test_cli_commands_python.py::test_status PASSED        [  5%]
tests/integration/test_cli_commands_python.py::test_query PASSED         [ 11%]
tests/integration/test_cli_commands_python.py::test_delete PASSED        [ 17%]
tests/integration/test_cli_commands_python.py::test_symbol PASSED        [ 23%]
tests/integration/test_cli_commands_python.py::test_source PASSED        [ 29%]
tests/integration/test_cli_commands_python.py::test_search PASSED        [ 35%]
tests/integration/test_cli_commands_python.py::test_search_language_filter PASSED [ 41%]
tests/integration/test_cli_commands_python.py::test_callers PASSED       [ 47%]
tests/integration/test_cli_commands_python.py::test_callees PASSED       [ 52%]
tests/integration/test_cli_commands_python.py::test_implementations PASSED [ 58%]
tests/integration/test_cli_commands_python.py::test_hierarchy PASSED     [ 64%]
tests/integration/test_cli_commands_python.py::test_usages PASSED        [ 70%]
tests/integration/test_cli_commands_python.py::test_dependencies PASSED  [ 76%]
tests/integration/test_cli_commands_python.py::test_context PASSED       [ 82%]
tests/integration/test_cli_commands_python.py::test_trace PASSED         [ 88%]
tests/integration/test_cli_commands_python.py::test_entry_points PASSED  [ 94%]
tests/integration/test_cli_commands_python.py::test_summary_set_get_list PASSED [100%]

============================== 17 passed in 3.15s ==============================
[0;32mPASSED: tests/integration/test_cli_commands_python.py[0m

[1m--- tests/integration/test_cli_commands_typescript.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 18 items

tests/integration/test_cli_commands_typescript.py::test_status PASSED    [  5%]
tests/integration/test_cli_commands_typescript.py::test_query PASSED     [ 11%]
tests/integration/test_cli_commands_typescript.py::test_delete PASSED    [ 16%]
tests/integration/test_cli_commands_typescript.py::test_symbol PASSED    [ 22%]
tests/integration/test_cli_commands_typescript.py::test_source PASSED    [ 27%]
tests/integration/test_cli_commands_typescript.py::test_search PASSED    [ 33%]
tests/integration/test_cli_commands_typescript.py::test_search_language_filter PASSED [ 38%]
tests/integration/test_cli_commands_typescript.py::test_hierarchy PASSED [ 44%]
tests/integration/test_cli_commands_typescript.py::test_implementations PASSED [ 50%]
tests/integration/test_cli_commands_typescript.py::test_callers PASSED   [ 55%]
tests/integration/test_cli_commands_typescript.py::test_callees PASSED   [ 61%]
tests/integration/test_cli_commands_typescript.py::test_usages PASSED    [ 66%]
tests/integration/test_cli_commands_typescript.py::test_dependencies PASSED [ 72%]
tests/integration/test_cli_commands_typescript.py::test_callers_abstract_class PASSED [ 77%]
tests/integration/test_cli_commands_typescript.py::test_context PASSED   [ 83%]
tests/integration/test_cli_commands_typescript.py::test_trace PASSED     [ 88%]
tests/integration/test_cli_commands_typescript.py::test_entry_points PASSED [ 94%]
tests/integration/test_cli_commands_typescript.py::test_summary_set_get_list PASSED [100%]

============================== 18 passed in 4.10s ==============================
[0;32mPASSED: tests/integration/test_cli_commands_typescript.py[0m

[1m--- tests/integration/test_cli_commands_java.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 17 items

tests/integration/test_cli_commands_java.py::test_status PASSED          [  5%]
tests/integration/test_cli_commands_java.py::test_query PASSED           [ 11%]
tests/integration/test_cli_commands_java.py::test_delete PASSED          [ 17%]
tests/integration/test_cli_commands_java.py::test_symbol PASSED          [ 23%]
tests/integration/test_cli_commands_java.py::test_source PASSED          [ 29%]
tests/integration/test_cli_commands_java.py::test_search PASSED          [ 35%]
tests/integration/test_cli_commands_java.py::test_search_language_filter PASSED [ 41%]
tests/integration/test_cli_commands_java.py::test_hierarchy PASSED       [ 47%]
tests/integration/test_cli_commands_java.py::test_implementations PASSED [ 52%]
tests/integration/test_cli_commands_java.py::test_callers PASSED         [ 58%]
tests/integration/test_cli_commands_java.py::test_callees PASSED         [ 64%]
tests/integration/test_cli_commands_java.py::test_usages PASSED          [ 70%]
tests/integration/test_cli_commands_java.py::test_dependencies PASSED    [ 76%]
tests/integration/test_cli_commands_java.py::test_context PASSED         [ 82%]
tests/integration/test_cli_commands_java.py::test_trace PASSED           [ 88%]
tests/integration/test_cli_commands_java.py::test_entry_points PASSED    [ 94%]
tests/integration/test_cli_commands_java.py::test_summary_set_get_list PASSED [100%]

=============================== warnings summary ===============================
tests/integration/test_cli_commands_java.py::test_status
tests/integration/test_cli_commands_java.py::test_status
tests/integration/test_cli_commands_java.py::test_status
tests/integration/test_cli_commands_java.py::test_status
tests/integration/test_cli_commands_java.py::test_status
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pathspec.py:260: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    patterns = [pattern_factory(line) for line in lines if line]

tests/integration/test_cli_commands_java.py::test_status
tests/integration/test_cli_commands_java.py::test_status
tests/integration/test_cli_commands_java.py::test_status
tests/integration/test_cli_commands_java.py::test_status
tests/integration/test_cli_commands_java.py::test_status
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pattern.py:125: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    regex, include = self.pattern_to_regex(pattern)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================= 17 passed, 10 warnings in 8.55s ========================
[0;32mPASSED: tests/integration/test_cli_commands_java.py[0m

[1m--- tests/integration/test_http_endpoints.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 12 items

tests/integration/test_http_endpoints.py::test_endpoint_nodes_created PASSED [  8%]
tests/integration/test_http_endpoints.py::test_serves_edges_created PASSED [ 16%]
tests/integration/test_http_endpoints.py::test_endpoint_contained_by_repository PASSED [ 25%]
tests/integration/test_http_endpoints.py::test_endpoint_name_formatted PASSED [ 33%]
tests/integration/test_http_endpoints.py::test_fastendpoints_endpoint_nodes PASSED [ 41%]
tests/integration/test_http_endpoints.py::test_fastendpoints_serves_edges PASSED [ 50%]
tests/integration/test_http_endpoints.py::test_fastendpoints_multi_declaration PASSED [ 58%]
tests/integration/test_http_endpoints.py::test_endpoint_group_nodes PASSED [ 66%]
tests/integration/test_http_endpoints.py::test_endpoint_group_base_class PASSED [ 75%]
tests/integration/test_http_endpoints.py::test_non_endpoint_class_produces_zero_endpoints PASSED [ 83%]
tests/integration/test_http_endpoints.py::test_minimal_api_endpoint_nodes PASSED [ 91%]
tests/integration/test_http_endpoints.py::test_minimal_api_no_iendpointgroup_duplicate FAILED [100%]

=================================== FAILURES ===================================
_________________ test_minimal_api_no_iendpointgroup_duplicate _________________

http_service = (<synapps.service.SynappsService object at 0x10dac9110>, <synapps.graph.connection.GraphConnection object at 0x10da9eb50>)

    @pytest.mark.timeout(10)
    def test_minimal_api_no_iendpointgroup_duplicate(http_service) -> None:
        """TodoItems IEndpointGroup endpoints are not duplicated by Minimal API detection."""
        _svc, conn = http_service
>       result = conn.query(
            "MATCH (ep:Endpoint) WHERE ep.route IN ['/', '/items/{id}'] "
            "RETURN ep.route, ep.http_method, count(ep) AS cnt "
            "ORDER BY ep.route, ep.http_method"
        )

tests/integration/test_http_endpoints.py:201: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/synapps/graph/connection.py:46: in query
    records, _, _ = self._driver.execute_query(
.venv/lib/python3.11/site-packages/neo4j/_sync/driver.py:946: in execute_query
    return session._run_transaction(
.venv/lib/python3.11/site-packages/neo4j/_sync/work/session.py:543: in _run_transaction
    result = transaction_function(tx, *args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.11/site-packages/neo4j/_sync/driver.py:1298: in _work
    res = tx.run(query, parameters)
          ^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.11/site-packages/neo4j/_sync/work/transaction.py:201: in run
    result._tx_ready_run(query, parameters)
.venv/lib/python3.11/site-packages/neo4j/_sync/work/result.py:178: in _tx_ready_run
    self._run(query, parameters, None, None, None, None, None, None)
.venv/lib/python3.11/site-packages/neo4j/_sync/work/result.py:237: in _run
    self._attach()
.venv/lib/python3.11/site-packages/neo4j/_sync/work/result.py:439: in _attach
    self._connection.fetch_message()
.venv/lib/python3.11/site-packages/neo4j/_sync/io/_common.py:193: in inner
    func(*args, **kwargs)
.venv/lib/python3.11/site-packages/neo4j/_sync/io/_bolt.py:867: in fetch_message
    res = self._process_message(tag, fields)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.11/site-packages/neo4j/_sync/io/_bolt5.py:496: in _process_message
    response.on_failure(summary_metadata or {})
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <neo4j._sync.io._common.Response object at 0x10ec2ce90>
metadata = {'code': 'Memgraph.ClientError.MemgraphError.MemgraphError', 'message': 'Unbound variable: ep.'}

    def on_failure(self, metadata):
        """Handle a FAILURE message been received."""
        with suppress(SessionExpired, ServiceUnavailable):
            self.connection.reset()
        handler = self.handlers.get("on_failure")
        Util.callback(handler, metadata)
        handler = self.handlers.get("on_summary")
        Util.callback(handler)
>       raise self._hydrate_error(metadata)
E       neo4j.exceptions.ClientError: {neo4j_code: Memgraph.ClientError.MemgraphError.MemgraphError} {message: Unbound variable: ep.} {gql_status: 50N42} {gql_status_description: error: general processing exception - unexpected error. Unbound variable: ep.}

.venv/lib/python3.11/site-packages/neo4j/_sync/io/_common.py:263: ClientError
=============================== warnings summary ===============================
tests/integration/test_http_endpoints.py::test_endpoint_nodes_created
tests/integration/test_http_endpoints.py::test_endpoint_nodes_created
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pathspec.py:260: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    patterns = [pattern_factory(line) for line in lines if line]

tests/integration/test_http_endpoints.py::test_endpoint_nodes_created
tests/integration/test_http_endpoints.py::test_endpoint_nodes_created
  /Users/alex/Dev/synapse/.venv/lib/python3.11/site-packages/pathspec/pattern.py:125: DeprecationWarning: GitWildMatchPattern ('gitwildmatch') is deprecated. Use 'gitignore' for GitIgnoreBasicPattern or GitIgnoreSpecPattern instead.
    regex, include = self.pattern_to_regex(pattern)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================== short test summary info ============================
FAILED tests/integration/test_http_endpoints.py::test_minimal_api_no_iendpointgroup_duplicate
=================== 1 failed, 11 passed, 4 warnings in 4.59s ===================
[0;31mFAILED: tests/integration/test_http_endpoints.py[0m

[1m--- tests/integration/test_http_cross_language.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 3 items / 3 deselected / 0 selected

============================ 3 deselected in 0.01s =============================
[0;31mFAILED: tests/integration/test_http_cross_language.py[0m

[1m--- tests/integration/test_cross_namespace_implements.py ---[0m
============================= test session starts ==============================
platform darwin -- Python 3.11.14, pytest-9.0.2, pluggy-1.6.0 -- /Users/alex/Dev/synapse/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/alex/Dev/synapse
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.1.0, timeout-2.4.0
timeout: 10.0s
timeout method: thread
timeout func_only: False
collecting ... collected 5 items

tests/integration/test_cross_namespace_implements.py::test_each_cache_implements_only_its_own_icache PASSED [ 20%]
tests/integration/test_cross_namespace_implements.py::test_no_cross_namespace_implements_edges PASSED [ 40%]
tests/integration/test_cross_namespace_implements.py::test_total_implements_edge_count PASSED [ 60%]
tests/integration/test_cross_namespace_implements.py::test_all_three_icache_interfaces_exist PASSED [ 80%]
tests/integration/test_cross_namespace_implements.py::test_all_three_cache_classes_exist PASSED [100%]

============================== 5 passed in 3.90s ===============================
[0;32mPASSED: tests/integration/test_cross_namespace_implements.py[0m

[0;31m[1mSome tests failed.[0m
