gobby-code 1.3.3

Fast Rust CLI for Gobby's code index — AST-aware search, symbol navigation, and dependency graph
Documentation
use super::*;
use serde_json::json;

#[test]
fn collection_name_is_stable() {
    assert_eq!(
        collection_name(CODE_SYMBOL_COLLECTION_PREFIX, "project-1").unwrap(),
        "code_symbols_project-1"
    );
}

#[test]
fn collection_name_rejects_invalid_custom_project_ids() {
    let error = collection_name(CODE_SYMBOL_COLLECTION_PREFIX, "bad/project")
        .expect_err("path-like custom collection should fail");

    assert!(error.to_string().contains("invalid character"));
}

#[test]
fn search_code_symbols_reports_missing_qdrant_config() {
    let request = CodeSymbolVectorSearchRequest {
        project_id: "project-1".to_string(),
        query: "run".to_string(),
        limit: 10,
        collection_prefix: CODE_SYMBOL_COLLECTION_PREFIX.to_string(),
    };

    let error = search_code_symbols(&test_context(None), &request)
        .expect_err("missing Qdrant config should be surfaced");

    assert_eq!(error, SearchError::MissingQdrantConfig);
}

#[test]
fn delete_project_collection_targets_only_project_collection() {
    let (qdrant_url, handle) = spawn_http_responses(vec![(200, json!({"result": true}))]);
    let deleted = delete_project_collection(
        &QdrantConfig {
            url: Some(qdrant_url),
            api_key: Some("qdrant-key".to_string()),
        },
        "project-1",
    )
    .expect("delete collection");
    let requests = handle.join().expect("qdrant requests");

    assert_eq!(deleted, 1);
    assert_eq!(requests.len(), 1);
    assert!(requests[0].contains("DELETE /collections/code_symbols_project-1 HTTP/1.1"));
    assert!(requests[0].contains("api-key: qdrant-key"));
    assert!(!requests[0].contains("project-2"));
}

#[test]
fn blank_qdrant_url_is_missing_config() {
    let err = delete_project_collection(
        &QdrantConfig {
            url: Some(" \t ".to_string()),
            api_key: None,
        },
        "project-1",
    )
    .expect_err("blank URL should be treated as missing config");

    assert_eq!(err, VectorLifecycleError::MissingQdrantConfig);
}

#[test]
fn delete_project_collection_rejects_invalid_collection_name() {
    let err = delete_project_collection(
        &QdrantConfig {
            url: Some("http://127.0.0.1:1".to_string()),
            api_key: None,
        },
        "bad/project",
    )
    .expect_err("invalid collection should fail before delete request");

    assert!(matches!(
        err,
        VectorLifecycleError::InvalidCollectionName(_)
    ));
}