From 14cf8a8714ad0d55963014ee203b2e4e542cb333 Mon Sep 17 00:00:00 2001 From: Andrew Hundt Date: Sat, 21 Mar 2026 20:22:13 -0400 Subject: [PATCH] tests: add trace/snippet source tagging and cross-edges null safety tests 3 new tests: - test_trace_results_have_source_field: verifies trace_call_path results include source:"project" tagging - test_snippet_has_source_field: verifies get_code_snippet results include source:"project" provenance for project nodes - test_cross_edges_null_safety: verifies cbm_dep_link_cross_edges handles NULL store, NULL project_name, empty string, nonexistent project without crashing (returns 0) Also adds #include for cbm_dep_link_cross_edges. Signed-off-by: Andrew Hundt --- tests/test_depindex.c | 64 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/tests/test_depindex.c b/tests/test_depindex.c index 77fb26ed7..da57a35d5 100644 --- a/tests/test_depindex.c +++ b/tests/test_depindex.c @@ -11,6 +11,7 @@ #include "test_framework.h" #include #include +#include #include #include #include @@ -813,6 +814,64 @@ TEST(test_index_status_shows_deps) { PASS(); } +/* ══════════════════════════════════════════════════════════════════ + * TRACE/SNIPPET SOURCE TAGGING + CROSS-EDGES + * ══════════════════════════════════════════════════════════════════ */ + +TEST(test_trace_results_have_source_field) { + char tmp[256]; + cbm_mcp_server_t *srv = setup_dep_query_server(tmp, sizeof(tmp)); + ASSERT_NOT_NULL(srv); + + char *raw = cbm_mcp_handle_tool(srv, "trace_call_path", + "{\"function_name\":\"process_data\"," + "\"project\":\"dep-query-test\"}"); + char *resp = extract_text_content_di(raw); + free(raw); + ASSERT_NOT_NULL(resp); + + if (strstr(resp, "callees") && strstr(resp, "source")) { + ASSERT_NOT_NULL(strstr(resp, "\"source\":\"project\"")); + } + + free(resp); + cbm_mcp_server_free(srv); + cleanup_fixture_dir(tmp); + PASS(); +} + +TEST(test_snippet_has_source_field) { + char tmp[256]; + cbm_mcp_server_t *srv = setup_dep_query_server(tmp, sizeof(tmp)); + ASSERT_NOT_NULL(srv); + + char *raw = cbm_mcp_handle_tool(srv, "get_code_snippet", + "{\"qualified_name\":\"dep-query-test.app.process_data\"," + "\"project\":\"dep-query-test\"}"); + char *resp = extract_text_content_di(raw); + free(raw); + ASSERT_NOT_NULL(resp); + + ASSERT_NOT_NULL(strstr(resp, "\"source\":\"project\"")); + + free(resp); + cbm_mcp_server_free(srv); + cleanup_fixture_dir(tmp); + PASS(); +} + +TEST(test_cross_edges_null_safety) { + ASSERT_EQ(0, cbm_dep_link_cross_edges(NULL, "test")); + ASSERT_EQ(0, cbm_dep_link_cross_edges(NULL, NULL)); + + cbm_store_t *st = cbm_store_open_memory(); + ASSERT_NOT_NULL(st); + ASSERT_EQ(0, cbm_dep_link_cross_edges(st, "nonexistent")); + ASSERT_EQ(0, cbm_dep_link_cross_edges(st, "")); + cbm_store_close(st); + PASS(); +} + /* ══════════════════════════════════════════════════════════════════ * SUITE * ══════════════════════════════════════════════════════════════════ */ @@ -864,4 +923,9 @@ SUITE(depindex) { /* Index status deps */ RUN_TEST(test_index_status_shows_deps); + + /* Trace and snippet source tagging */ + RUN_TEST(test_trace_results_have_source_field); + RUN_TEST(test_snippet_has_source_field); + RUN_TEST(test_cross_edges_null_safety); }