sqlserver-mcp 0.5.3

SQL Server 2025/2022/2019/2017 - master/msdb/sandbox combined catalog MCP server, generated by mcpify.
Documentation
// SQL Server 2025 - master/msdb/sandbox combined catalog MCP server — generated by mcpify. Do not hand-edit.
//
// Regression test for Fix 8b (embedding population completeness): asserts
// that every version's `semantic_endpoints` row count EQUALS its
// `endpoints` row count — not just "greater than zero". A store can end
// up with `endpoints` rows but only some (or none) of the matching
// `semantic_endpoints` rows if `bin/populate_embeddings.rs` was run with
// a stale binary, was interrupted mid-run, or (before Fix 8a) defaulted
// to only the default version's store. `search` silently returns
// incomplete/empty results for an under-populated version with no error
// ever surfaced, so this must be caught here rather than discovered live.
//
// `#[ignore]`d by default (`cargo test` runs it only with
// `--include-ignored`/`--ignored`) because this crate embeds each
// version's `.db` bytes into the binary via `include_bytes!` at *compile
// time* (`data::store::VERSION_STORE_FILES`/`VERSION_STORE_BYTES`) —
// right after `mcpify generate`/`add-version`, before anyone has run
// `sqlserver-mcp-populate-embeddings --all`, every `semantic_endpoints`
// table is legitimately still empty, and this crate's own CI
// (`.github/workflows/ci.yml`) never runs that populate step before
// `cargo test`. Run this explicitly as a packaging/release smoke test,
// after populating:
//
//     cargo run --release --bin sqlserver-mcp-populate-embeddings -- --all
//     cargo test --test embeddings_populated -- --ignored

use sqlserver_mcp_catalog::data::store::{VERSION_STORE_FILES, open_store, resolve_store_path};

#[test]
#[ignore = "requires `sqlserver-mcp-populate-embeddings --all` to have been run first"]
fn semantic_endpoints_row_count_matches_endpoints_row_count_for_every_version() {
    let mut mismatches = Vec::new();

    for (label, _file) in VERSION_STORE_FILES {
        let path = resolve_store_path(label)
            .unwrap_or_else(|err| panic!("failed to resolve store path for '{label}': {err}"));
        let conn = open_store(&path)
            .unwrap_or_else(|err| panic!("failed to open store for '{label}': {err}"));

        let endpoints_count: i64 = conn
            .query_row("SELECT count(*) FROM endpoints", [], |row| row.get(0))
            .unwrap_or_else(|err| panic!("failed to count 'endpoints' rows for '{label}': {err}"));
        let semantic_count: i64 = conn
            .query_row("SELECT count(*) FROM semantic_endpoints", [], |row| {
                row.get(0)
            })
            .unwrap_or_else(|err| {
                panic!("failed to count 'semantic_endpoints' rows for '{label}': {err}")
            });

        if endpoints_count != semantic_count {
            mismatches.push(format!(
                "'{label}': endpoints={endpoints_count} semantic_endpoints={semantic_count}"
            ));
        }
    }

    assert!(
        mismatches.is_empty(),
        "embedding population incomplete — semantic_endpoints row count must equal endpoints \
         row count for every version, but found mismatch(es): {}",
        mismatches.join("; ")
    );
}