@mock_only
Feature: FAISS vector backend uncovered paths (fvcov3)
  As a test author
  I want to exercise edge-case and error paths in the FAISS vector backend
  So that code coverage improves for faiss_vector_backend.py

  # --- _require_non_empty validation (line 28) ---

  Scenario: Indexing with empty project raises ValueError
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I index embedding with empty project and doc_id "doc1" and vector "1.0,0.0"
    Then fvcov3 the error message should contain "project must be a non-empty string"

  Scenario: Indexing with whitespace-only doc_id raises ValueError
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I index embedding with project "proj" and doc_id "   " and vector "1.0,0.0"
    Then fvcov3 the error message should contain "doc_id must be a non-empty string"

  # --- similarity_search empty embedding (line 48) ---

  Scenario: Similarity search with empty embedding raises ValueError
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorBackend backed by it
    When fvcov3 I similarity search with empty embedding
    Then fvcov3 the error message should contain "embedding must be a non-empty list"

  # --- similarity_search top_k < 1 (line 50) ---

  Scenario: Similarity search with top_k zero raises ValueError
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorBackend backed by it
    When fvcov3 I similarity search with top_k 0
    Then fvcov3 the error message should contain "top_k must be positive"

  # --- similarity_search skips hits without doc_id (line 62) ---

  Scenario: Similarity search skips hits with missing doc_id
    Given fvcov3 a mock vector store service that returns hits without doc_id
    And fvcov3 a FAISSVectorBackend backed by it
    When fvcov3 I perform a valid similarity search
    Then fvcov3 the similarity search results should be empty

  # --- index_embedding empty embedding (line 92) ---

  Scenario: Index embedding with empty embedding raises ValueError
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I index embedding with project "proj" and doc_id "doc1" and empty embedding
    Then fvcov3 the error message should contain "embedding must be a non-empty list"

  # --- index_embedding metadata fallback to resource_type (line 95) ---

  Scenario: Index embedding uses resource_type when location is absent
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I index embedding with metadata having resource_type "python_file" but no location
    Then fvcov3 the indexed content should be "python_file"

  Scenario: Index embedding uses default payload when neither location nor resource_type exists
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I index embedding with empty metadata for doc_id "my-doc"
    Then fvcov3 the indexed content should be "embedding:my-doc"

  # --- search_similar empty query_embedding (line 116) ---

  Scenario: Search similar with empty query embedding raises ValueError
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I search similar with empty query embedding in project "proj"
    Then fvcov3 the error message should contain "query_embedding must be a non-empty list"

  # --- search_similar limit < 1 (line 118) ---

  Scenario: Search similar with limit zero raises ValueError
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I search similar with limit 0 in project "proj"
    Then fvcov3 the error message should contain "limit must be positive"

  # --- search_similar min_relevance out of range (lines 120-121) ---

  Scenario: Search similar with negative min_relevance raises ValueError
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I search similar with min_relevance -0.5 in project "proj"
    Then fvcov3 the error message should contain "min_relevance must be in [0.0, 1.0]"

  Scenario: Search similar with min_relevance above 1 raises ValueError
    Given fvcov3 a mock vector store service
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I search similar with min_relevance 1.5 in project "proj"
    Then fvcov3 the error message should contain "min_relevance must be in [0.0, 1.0]"

  # --- search_similar skips hits below min_relevance (line 133) ---

  Scenario: Search similar filters out hits below min_relevance
    Given fvcov3 a mock vector store service that returns hits with low scores
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I search similar with min_relevance 0.8 in project "proj"
    Then fvcov3 the search similar results should be empty

  # --- search_similar skips hits without doc_id (line 137) ---

  Scenario: Search similar skips hits with missing doc_id
    Given fvcov3 a mock vector store service that returns search hits without doc_id
    And fvcov3 a FAISSVectorIndexBackend backed by it
    When fvcov3 I search similar with min_relevance 0.0 in project "proj"
    Then fvcov3 the search similar results should be empty

  # --- build_vector_backend non-faiss fallback (lines 164-167, 169) ---

  Scenario: build_vector_backend falls back to InMemoryVectorBackend for non-faiss backend
    Given fvcov3 a mock vector store service with backend name "memory"
    When fvcov3 I call build_vector_backend
    Then fvcov3 the result should be an InMemoryVectorBackend

  # --- build_vector_index_backend non-faiss fallback (lines 184-187, 189) ---

  Scenario: build_vector_index_backend falls back to InMemoryVectorIndexBackend for non-faiss backend
    Given fvcov3 a mock vector store service with backend name "memory"
    When fvcov3 I call build_vector_index_backend
    Then fvcov3 the result should be an InMemoryVectorIndexBackend
